refcounters in shared memory & fork()
От: SkyDance Земля  
Дата: 05.12.05 15:39
Оценка:
В процессе создания важного bicycle "кэш в разделяемой памяти" натолкнулся на проблему в linux'е: во время вызова некоторых функций (fork(), system() и т.п., которые приводят к clone() ) наблюдается проблема.
Все объекты размножатся на два процесса. Таким образом, был у меня один объект, унаследованный от счетчика ссылок, стало два.
Пока счетчик ссылок живет в процессе, все хорошо.
Но как только счетчик ссылок размещается в memory-mapped file, понятно, что все ломается, т.к. объект копируется без увеличения счетчика.
Как с этим можно бороться?
Posted via RSDN NNTP Server 2.0
Re: refcounters in shared memory & fork()
От: Cyberax Марс  
Дата: 05.12.05 15:40
Оценка:
SkyDance wrote:

> Как с этим можно бороться?


Может стоит посмотреть на shmem
(http://ice.prohosting.com/newfunk/boost/libs/shmem/doc/html/)? Там все
уже есть...

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[2]: refcounters in shared memory & fork()
От: SkyDance Земля  
Дата: 06.12.05 06:58
Оценка:
"Cyberax" <37054@users.rsdn.ru> wrote in message news:1522505@news.rsdn.ru...
> Может стоит посмотреть на shmem

Если бы там это было хоть как-то решено, я бы не спрашивал
Posted via RSDN NNTP Server 2.0
Re[3]: refcounters in shared memory & fork()
От: Cyberax Марс  
Дата: 06.12.05 11:38
Оценка:
Здравствуйте, SkyDance, Вы писали:

>> Может стоит посмотреть на shmem

SD>Если бы там это было хоть как-то решено, я бы не спрашивал
Извиняюсь, ответил прежде чем подумать

Посмотрите на вызов pthread_afork: http://www.opengroup.org/onlinepubs/007908799/xsh/pthread_atfork.html
Sapienti sat!
Re: refcounters in shared memory & fork()
От: MaximE Великобритания  
Дата: 06.12.05 12:08
Оценка:
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, в чем проблема?

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0
Re[2]: refcounters in shared memory & fork()
От: srggal Украина  
Дата: 06.12.05 12:27
Оценка:
Здравствуйте, 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)
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[3]: refcounters in shared memory & fork()
От: SkyDance Земля  
Дата: 06.12.05 12:30
Оценка:
"srggal" <21794@users.rsdn.ru> wrote in message news:1524073@news.rsdn.ru...
> ИМХО в автоматизации (т.е. АТ желает чтобы в
> Базовом классе счетчика ссылок все автоматов инкрементировалось
> и декриментировалось при clone)

да-да Это и желаю.
Пока смотрю по наводке Cyberax на pthread_atfork, но идея держать глобальный список всех классов, счетчики которых расположены в разделяемой памяти, кажется слегка утопичной.
Posted via RSDN NNTP Server 2.0
Re[4]: refcounters in shared memory & fork()
От: Cyberax Марс  
Дата: 06.12.05 12:34
Оценка:
SkyDance wrote:

> да-да Это и желаю.

> Пока смотрю по наводке Cyberax на pthread_atfork, но идея держать
> глобальный список всех классов, счетчики которых расположены в
> разделяемой памяти, кажется слегка утопичной.

По-другому никак, к сожалению Можно еще на семафорах попробовать
сделать что-нибудь, но IMHO проще всего ловить выозв fork() и
увеличивать счетчики разделяемых объектов.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[3]: refcounters in shared memory & fork()
От: MaximE Великобритания  
Дата: 06.12.05 12:53
Оценка:
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)

Простите, не въехал сразу, что проблема со счетчиком, а не с объектом. Придется все объекты в структурку/массивчик какую-нить положить.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0
Re[5]: А может выпрямить архитектуру?
От: Erop Россия  
Дата: 06.12.05 15:44
Оценка:
Здравствуйте, Cyberax, Вы писали:

>> да-да Это и желаю.

>> Пока смотрю по наводке Cyberax на pthread_atfork, но идея держать
>> глобальный список всех классов, счетчики которых расположены в
>> разделяемой памяти, кажется слегка утопичной.

C>По-другому никак, к сожалению Можно еще на семафорах попробовать

C>сделать что-нибудь, но IMHO проще всего ловить выозв fork() и
C>увеличивать счетчики разделяемых объектов.

А я верно понимаю, что при fork создаётся новый процесс с ноыв адресным пространством?

Тогда я не очень понимаю чем начинает "владеть" такой укатель. Объектом в каком адресном пространстве?

Вот какой из двух он должен разрушать в случае чего, например?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: А может выпрямить архитектуру?
От: SkyDance Земля  
Дата: 09.12.05 09:33
Оценка:
"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, вроде работает как надо.


.
Posted via RSDN NNTP Server 2.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.