Date: Wed, 06 Jun 2012 09:52:35 +0300 From: Resit Sahin <resit.sahin@inforcept.com> To: freebsd-threads@freebsd.org Subject: Re: Inter Process Synchronisation Message-ID: <4FCEFE33.9010708@inforcept.com> In-Reply-To: <4FCE0AB6.32705.5122593A@s_sourceforge.nedprod.com> References: <4FCDF845.9080704@inforcept.com> <4FCE0AB6.32705.5122593A@s_sourceforge.nedprod.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Hello, I thought i can ask inter-process related issues in this list. Which list is appropriate for such issues? I did not get why should i need to create a new copy of the stats each time? I have users and a counter for each user. This counter is incremented for each incoming network packet destined to this user. I consider to use a semaphore for the whole data structure. This means i have to lock the semaphore at least 100.000 times a second and all processes have to wait for that. Is it possible to use a semaphore so frequent? I would lock only the specific user if was able to use memory-based semaphores but i can use named semaphores only as we are using FreeBSD 8.2 at the moment. My structure: User1,counter=x User2,counter=y .......................... I wanted to post in this list because i want to learn if there are other ways to synchronise between processes without using semaphores. As far as i understand from your answer i can use atomic variables between multiple processes. Do you mean this <http://www.freebsd.org/cgi/man.cgi?query=atomic_add&apropos=0&sektion=0&manpath=FreeBSD+9.0-RELEASE&arch=default&format=html> with atomic operations? On 06/05/2012 04:33 PM, Niall Douglas wrote: > General programming questions aren't really an appropriate topic for > this list. However, if I were you, I'd have an atomic pointer which > points to the "current" version of the statistics. I'd then write a > new copy of the statistics each time there is a new copy, having an > atomic incremented usage count per copy, and set the "current" > version pointer atomically. When the atomic usage count goes to zero, > you retire that memory section for reuse if it is no longer current. > > The reason you should choose this design is because it's friendly on > cache coherency. You only have one cache line for the "current" > version pointer being bounced between all CPU cores rather than all > the cache lines which make up your statistics. > > Niall > > On 5 Jun 2012 at 15:15, Resit Sahin wrote: > >> Hello Everybody, >> >> >> I am working on a multi process system. I have 10 or more processes >> (that are created with fork) and i want to synchronise them. There is a >> data structure which must be shared among the processes. The data >> structure contains statistics about some users which are more then some >> thousands. Each process needs to "read from" / "write to" this data >> structure thousands of times in a second. They all may need to update it >> 500.000 times a second in total. This is the scenario i need to build. >> >> I am using NUMA architecture and ia64 CPUs like E5506. >> >> I have investigated the options i have in FreeBSD and come up with few >> solutions. I am already using sockets for inter-process communication >> but it does not seem to be suitable for the above scenario. It is very >> slow. >> >> The most suitable way seems to create a shared memory between the >> processes. The question is how to synchronise the access to the memory: >> >> I have found two solutions for synchronisation. One is mutexes and >> other is semaphores. >> >> The mutexes works only between threads but not between processes. Is >> there any support for inter process mutexes in FreeBSD 8.2 ? >> >> The second option is semaphores. There are two types of semaphores, they >> are named semaphores and the memory based semaphores. Memory based >> semaphores seem to be a better option but they do not support inter >> process operation in FreeBSD 8.2 . >> >> The only option seems to be using named semaphores and locking the whole >> data structure for each access. Would it be feasible to use named >> semaphores for locking 500.000 times a second? >> >> >> >> I have read about atomic operations here: >> http://www.freebsd.org/cgi/man.cgi?query=atomic_add&apropos=0&sektion=0&manpath=FreeBSD+9.0-RELEASE&arch=default&format=html >> >> >> Would atomic operations be an option in my case? >> >> The manual page says : >> >> "On the i386 architecture, the cache coherency >> model requires that the hardware perform this task, thus the atomic oper- >> ations are atomic across multiple processors. On the ia64 architecture, >> coherency is only guaranteed for pages that are configured to using a >> caching policy of either uncached or write back." >> >> >> Is it safe to use named semaphores for*ia64* architecture ? Does FreeBSD >> 8.2 support interprocess locking for ia64 architecture? >> >> >> >> Kind Regards >> Res,i S,ahin >> >> _______________________________________________ >> freebsd-threads@freebsd.org mailing list >> http://lists.freebsd.org/mailman/listinfo/freebsd-threads >> To unsubscribe, send any mail to "freebsd-threads-unsubscribe@freebsd.org" >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4FCEFE33.9010708>