В процессе создания важного bicycle "кэш в разделяемой памяти" натолкнулся на проблему в linux'е: во время вызова некоторых функций (fork(), system() и т.п., которые приводят к clone() ) наблюдается проблема.
Все объекты размножатся на два процесса. Таким образом, был у меня один объект, унаследованный от счетчика ссылок, стало два.
Пока счетчик ссылок живет в процессе, все хорошо.
Но как только счетчик ссылок размещается в memory-mapped file, понятно, что все ломается, т.к. объект копируется без увеличения счетчика.
Как с этим можно бороться?
Здравствуйте, SkyDance, Вы писали:
>> Может стоит посмотреть на shmem SD>Если бы там это было хоть как-то решено, я бы не спрашивал
Извиняюсь, ответил прежде чем подумать
On Mon, 05 Dec 2005 15:39:00 -0000, SkyDance <38094@users.rsdn.ru> wrote:
> В процессе создания важного bicycle "кэш в разделяемой памяти" натолкнулся на проблему в linux'е: во время вызова некоторых функций (fork(), system() и т.п., которые приводят к clone() ) наблюдается проблема. > Все объекты размножатся на два процесса. Таким образом, был у меня один объект, унаследованный от счетчика ссылок, стало два. > Пока счетчик ссылок живет в процессе, все хорошо. > Но как только счетчик ссылок размещается в memory-mapped file, понятно, что все ломается, т.к. объект копируется без увеличения счетчика.
memory mapping не копируется, оба процесса ссылаются на один mapping, в чем проблема?
Здравствуйте, MaximE, Вы писали:
ME>On Mon, 05 Dec 2005 15:39:00 -0000, SkyDance <38094@users.rsdn.ru> wrote:
>> В процессе создания важного bicycle "кэш в разделяемой памяти" натолкнулся на проблему в linux'е: во время вызова некоторых функций (fork(), system() и т.п., которые приводят к clone() ) наблюдается проблема. >> Все объекты размножатся на два процесса. Таким образом, был у меня один объект, унаследованный от счетчика ссылок, стало два. >> Пока счетчик ссылок живет в процессе, все хорошо. >> Но как только счетчик ссылок размещается в memory-mapped file, понятно, что все ломается, т.к. объект копируется без увеличения счетчика.
ME>memory mapping не копируется, оба процесса ссылаются на один mapping, в чем проблема?
ИМХО в автоматизации (т.е. АТ желает чтобы в Базовом классе счетчика ссылок все автоматов инкрементировалось и декриментировалось при clone)
"srggal" <21794@users.rsdn.ru> wrote in message news:1524073@news.rsdn.ru... > ИМХО в автоматизации (т.е. АТ желает чтобы в > Базовом классе счетчика ссылок все автоматов инкрементировалось > и декриментировалось при clone)
да-да Это и желаю.
Пока смотрю по наводке Cyberax на pthread_atfork, но идея держать глобальный список всех классов, счетчики которых расположены в разделяемой памяти, кажется слегка утопичной.
SkyDance wrote:
> да-да Это и желаю. > Пока смотрю по наводке Cyberax на pthread_atfork, но идея держать > глобальный список всех классов, счетчики которых расположены в > разделяемой памяти, кажется слегка утопичной.
По-другому никак, к сожалению Можно еще на семафорах попробовать
сделать что-нибудь, но IMHO проще всего ловить выозв fork() и
увеличивать счетчики разделяемых объектов.
On Tue, 06 Dec 2005 12:27:21 -0000, srggal <21794@users.rsdn.ru> wrote:
> Здравствуйте, MaximE, Вы писали: > > ME>On Mon, 05 Dec 2005 15:39:00 -0000, SkyDance <38094@users.rsdn.ru> wrote: > >>> В процессе создания важного bicycle "кэш в разделяемой памяти" натолкнулся на проблему в linux'е: во время вызова некоторых функций (fork(), system() и т.п., которые приводят к clone() ) наблюдается проблема. >>> Все объекты размножатся на два процесса. Таким образом, был у меня один объект, унаследованный от счетчика ссылок, стало два. >>> Пока счетчик ссылок живет в процессе, все хорошо. > >>> Но как только счетчик ссылок размещается в memory-mapped file, понятно, что все ломается, т.к. объект копируется без увеличения счетчика. > > > ME>memory mapping не копируется, оба процесса ссылаются на один mapping, в чем проблема? > > ИМХО в автоматизации (т.е. АТ желает чтобы в Базовом классе счетчика ссылок все автоматов инкрементировалось и декриментировалось при clone)
Простите, не въехал сразу, что проблема со счетчиком, а не с объектом. Придется все объекты в структурку/массивчик какую-нить положить.
Здравствуйте, Cyberax, Вы писали:
>> да-да Это и желаю. >> Пока смотрю по наводке Cyberax на pthread_atfork, но идея держать >> глобальный список всех классов, счетчики которых расположены в >> разделяемой памяти, кажется слегка утопичной.
C>По-другому никак, к сожалению Можно еще на семафорах попробовать C>сделать что-нибудь, но IMHO проще всего ловить выозв fork() и C>увеличивать счетчики разделяемых объектов.
А я верно понимаю, что при fork создаётся новый процесс с ноыв адресным пространством?
Тогда я не очень понимаю чем начинает "владеть" такой укатель. Объектом в каком адресном пространстве?
Вот какой из двух он должен разрушать в случае чего, например?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
"Erop" <39916@users.rsdn.ru> wrote in message news:1524700@news.rsdn.ru... > А я верно понимаю, что при fork создаётся новый > процесс с ноыв адресным пространством? >Тогда я не очень понимаю чем начинает "владеть" такой укатель. > Объектом в каком адресном пространстве?
если внимательно прочитать название темы, то можно заметить слова shared memory, а если еще и первое сообщение, то можно увидеть memory mapped files.
Если после этого подумать, то можно догадаться, что хочется сделать некую "разделяемую heap" для нескольких процессов. Конкретно в моем случае внутри этой кучи требуется делать snapshot'ы, для чего необходим reference counting объектов внутри кучи.
В общем, спасибо за внимание, воспользоваться pthread_atfork, вроде работает как надо.