Memory file mapping
От: AlexUv  
Дата: 21.10.02 09:38
Оценка:
Подскажите пжалста, у Рихтера написано, что в memory mapped files можно писать связанные списки и даже разделять их потом между процессами, используя MapViewOfFileEx, но как затолкать связанный список в такой файл, может кто знает?
Re: Memory file mapping
От: Lexey Россия  
Дата: 21.10.02 09:42
Оценка:
Здравствуйте AlexUv, Вы писали:

AU> Подскажите пжалста, у Рихтера написано, что в memory mapped files можно писать связанные списки и даже разделять их потом между процессами, используя MapViewOfFileEx, но как затолкать связанный список в такой файл, может кто знает?


Да видимо обычно и заталкивать — как в нормальную память. MapViewOfFileEx ведь позволяет выставить один и тот же базовый адрес во всех процессах.
Re: Memory file mapping
От: _Dinosaur Россия  
Дата: 21.10.02 09:43
Оценка:
Здравствуйте AlexUv, Вы писали:

AU> Подскажите пжалста, у Рихтера написано, что в memory mapped files можно писать связанные списки и даже разделять их потом между процессами, используя MapViewOfFileEx, но как затолкать связанный список в такой файл, может кто знает?


Можно использовать смещения относительно начала файла
Завидую людям, которые могут себе позволить никуда не спешить.
Re: Memory file mapping
От: TK Лес кывт.рф
Дата: 21.10.02 09:44
Оценка:
Здравствуйте AlexUv, Вы писали:

AU> Подскажите пжалста, у Рихтера написано, что в memory mapped files можно писать связанные списки и даже разделять их потом между процессами, используя MapViewOfFileEx, но как затолкать связанный список в такой файл, может кто знает?


Наверное имелось в виду использование функций InitializeSListHead и ей подобных.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Memory file mapping
От: AlexUv  
Дата: 21.10.02 09:58
Оценка:
AlexUv: Смещения от начала файла там же описаны как непродуктивные. Я имел в виду следущее:
struct _Node
{
// содержание
};

struct _ListNode
{
_Node i;
_ListNode *prev,*next;
};

Далее как обычно через new создаются эл-ты списка. Но каждый node создасться где-то в памяти. Можно ли такой список через mapped file разделить?
Re[2]: Memory file mapping
От: Lexey Россия  
Дата: 21.10.02 10:02
Оценка:
Здравствуйте AlexUv, Вы писали:

AU>AlexUv: Смещения от начала файла там же описаны как непродуктивные. Я имел в виду следущее:

AU>struct _Node
AU>{
AU>// содержание
AU>};

AU>struct _ListNode

AU>{
AU>_Node i;
AU>_ListNode *prev,*next;
AU>};

AU>Далее как обычно через new создаются эл-ты списка. Но каждый node создасться где-то в памяти. Можно ли такой список через mapped file разделить?


new переписать так, чтобы он память выделял в твоем memory mapped файле. Про одинаковые базовые адреса я уже раньше сказал.
Re[3]: Memory file mapping
От: AlexUv  
Дата: 21.10.02 10:11
Оценка:
Здравствуйте Lexey, Вы писали:

L>Здравствуйте AlexUv, Вы писали:


L>new переписать так, чтобы он память выделял в твоем memory mapped файле. Про одинаковые базовые адреса я уже раньше сказал.


Спасибо, мне у Страуструпа что-то похожее попадалось. Должен ли я при этом и смещение от начала файла задавать, например для первого node: new<0xffffff> sizeof(_ListNode), для второго new<0xffffff+sizeof(_ListNode)*1> sizeof(_ListNode) и т.п,?
Re[3]: Memory file mapping
От: _Dinosaur Россия  
Дата: 21.10.02 10:16
Оценка:
Здравствуйте Lexey, Вы писали:

L>Здравствуйте AlexUv, Вы писали:


L>new переписать так, чтобы он память выделял в твоем memory mapped файле. Про одинаковые базовые адреса я уже раньше сказал.


Здесь возможны следующие проблемы:
— полагаю (возможно ошибаюсь), что может возникнуть ситуация, когда невозможно будет отобразить файл по базовому адресу во всех процессах
— перегрузка оператора new создаст необходимость написания менеджера памяти, если необходимо будет удалять элементы списка
Завидую людям, которые могут себе позволить никуда не спешить.
Re[4]: Memory file mapping
От: Lexey Россия  
Дата: 21.10.02 10:18
Оценка:
Здравствуйте AlexUv, Вы писали:

AU>Здравствуйте Lexey, Вы писали:


L>>Здравствуйте AlexUv, Вы писали:


L>>new переписать так, чтобы он память выделял в твоем memory mapped файле. Про одинаковые базовые адреса я уже раньше сказал.


AU>Спасибо, мне у Страуструпа что-то похожее попадалось. Должен ли я при этом и смещение от начала файла задавать, например для первого node: new<0xffffff> sizeof(_ListNode), для второго new<0xffffff+sizeof(_ListNode)*1> sizeof(_ListNode) и т.п,?


Если ты хочешь использовать Placement New, то придется задавать смещения. Если напишешь свой new, то всю логику выделения памяти и привязку к адресам можно засунуть в него.
Re[4]: Memory file mapping
От: Lexey Россия  
Дата: 21.10.02 10:20
Оценка:
Здравствуйте _Dinosaur, Вы писали:

D>Здесь возможны следующие проблемы:

D>- полагаю (возможно ошибаюсь), что может возникнуть ситуация, когда невозможно будет отобразить файл по базовому адресу во всех процессах
D>- перегрузка оператора new создаст необходимость написания менеджера памяти, если необходимо будет удалять элементы списка

Логично. Я нигде и не говорил, что проблем не будет.
По первому пункту все более-менее нормально, если процессы твои. Всегда можно зарезервировать область адресов, в которую ничего не попадет.
Второй пункт — это чисто дело техники.
Re[5]: Memory file mapping
От: Аноним  
Дата: 21.10.02 11:12
Оценка:
Здравствуйте Lexey, Вы писали:

L>Если ты хочешь использовать Placement New, то придется задавать смещения. Если напишешь свой new, то всю логику выделения памяти и привязку к адресам можно засунуть в него.

Погодь, так чем отличаются Placement New от моих собственных? Не придется же писать что-то вроде void *operator new(size_t size,LPVOID addr){return VirtualAlloc(addr,size);}??
Re[6]: Memory file mapping
От: Lexey Россия  
Дата: 21.10.02 11:24
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте Lexey, Вы писали:


L>>Если ты хочешь использовать Placement New, то придется задавать смещения. Если напишешь свой new, то всю логику выделения памяти и привязку к адресам можно засунуть в него.

А>Погодь, так чем отличаются Placement New от моих собственных? Не придется же писать что-то вроде void *operator new(size_t size,LPVOID addr){return VirtualAlloc(addr,size);}??

То, что ты написал ранее — это placement new. Он не выделяет память, а только инициализирует объект в уже выделенной области. Соответсвенно, delete для такого объекта использовать тоже нельзя. Если у тебя есть контейнер, который сам выделяет память, то тебе придется переписывать его new. Если же ты сам можешь организовать создание объектов, то можешь обойтись и placement new.

BTW, а чем тебя пугает написание своего operator new?
Re[7]: Memory file mapping
От: AlexUv  
Дата: 21.10.02 11:37
Оценка:
Здравствуйте Lexey, Вы писали:

L>BTW, а чем тебя пугает написание своего operator new?

А чем я в собственном opertor new память выделяю? malloc,GlobalAlloc,VirtualAlloc? По моему представлению стандартный new выделяет память где-то в адресном пространстве процесса, или я не прав?
Re[8]: Memory file mapping
От: Lexey Россия  
Дата: 21.10.02 11:41
Оценка:
Здравствуйте AlexUv, Вы писали:

AU>Здравствуйте Lexey, Вы писали:


L>>BTW, а чем тебя пугает написание своего operator new?

AU>А чем я в собственном opertor new память выделяю? malloc,GlobalAlloc,VirtualAlloc? По моему

А тебе там не нужно будет память выделять. Ты ведь ее уже выделил, замапив файл. Нужно будет хранить список свободных/занятых сегментов и по new выдвать из него блок, а по delete — освобождать.

>представлению стандартный new выделяет память где-то в адресном пространстве процесса, или я не прав?


Да, в хипе.
Re[9]: Memory file mapping
От: AlexUv  
Дата: 21.10.02 11:48
Оценка:
Здравствуйте Lexey, Вы писали:

L>А тебе там не нужно будет память выделять. Ты ведь ее уже выделил, замапив файл. Нужно будет хранить список свободных/занятых сегментов и по new выдвать из него блок, а по delete — освобождать.


Спасибочки. То есть, если в стандартном списке у меня есть _ListNode *prev и _ListNode *next, то при хранении в mapped file они превращаются в DWORD prev и DWORD next, и вместо адреса там хранится некое смещение от предыдущего node? Я правильно понимаю?
Re[10]: Memory file mapping
От: Lexey Россия  
Дата: 21.10.02 11:51
Оценка:
Здравствуйте AlexUv, Вы писали:

AU>Спасибочки. То есть, если в стандартном списке у меня есть _ListNode *prev и _ListNode *next, то при хранении в mapped file они превращаются в DWORD prev и DWORD next, и вместо адреса там хранится некое смещение от предыдущего node? Я правильно понимаю?


Да нет, там хранятся нормальные адреса.
Re[11]: Memory file mapping
От: AlexUv  
Дата: 21.10.02 11:56
Оценка:
Здравствуйте Lexey, Вы писали:

L>Да нет, там хранятся нормальные адреса.

OK, надо попробовать, спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.