Skip to main content

System V vs Posix Semaphores


http://stackoverflow.com/questions/368322/differences-between-system-v-and-posix-semaphores
the semaphore set must be initialized using semget(); the semaphore creator can change its ownership or permissions using semctl(); and semaphore operations are performed via the semop()
http://www.cim.mcgill.ca/~franco/OpSys-304-427/lecture-notes/node31.html#SECTION00071100000000000000

Three features contribute to this unnecessary complication:

A semaphore counter is not just a single value. It's rather a set of one or more values, and the exact number of values is specified upon semaphore creation.
The creation of a semaphore is independent of its initialization. This is a fatal flaw, since we cannot atomically create a new semaphore set and initialize all the values in the set: a competing process may sneak in and access the semaphore after creation but before initialization, thus finding semagarbage.
A semaphore must be explicitly destroyed when the shared resource is no longer necessary, since the systemwide total number of semaphore sets is limited.
Allocation :
semget(key, nsems, flags) => semid ; semid is like a file descriptor and can be used from the same process to access that semaphore set.. but, the key is like file path which processes share to gain access to the same semaphore set.... Cooperating processes wishing to access the semaphore set must use the same key, much like a file name is used to store on disk shared data by cooperating processes.

flag = IPC_PRIVATE creates a private semaphore set that is accessible only to the current process. Hence, no need for a key to be remembered and other processes cannot access this semaphore.

Initialization :
http://linuxdevcenter.com/pub/a/linux/2007/05/24/semaphores-in-linux.html?page=2
Use int semctl(int semid, int semnum, int cmd, ...); to initialize the nth semaphore.

Performing a WAIT or SIGNAL
int semop(int semid, struct sembuf *sops, size_t nsops);
sembuf.semop = 0 waits on 0; > 0 increments counter by that amount; <>

Clean up
int ret = semctl(semid,0,IPC_RMID); //removing the 0th semaphore in the set
if you don't do this we will leak..


How many can we allocate ????


Typically, 128 arrays of maximum 256 semaphores each


So, looking at all these, It appears that implementing a shared memory infrastructure using System V Semaphore is a real pain ... :(

The problems include

-- Cleaning up of Global Semaphores after a total system failure.
Hashing algorithms can identify which shared memory segments are yours.
-- Clean up of local or ipc_private semaphores, allocated in each process
This is kind of tricky. The best way would be to not use private semaphores., but lease semaphores out of the global semaphore array..

Comments


  1. đồng tâm
    game mu
    cho thuê phòng trọ
    cho thuê phòng trọ
    nhac san cuc manh
    tổng đài tư vấn luật miễn phí
    văn phòng luật
    số điện thoại tư vấn luật
    thành lập công ty

    Một tiếng rên khẽ truyền ra từ trong hư vô trước người quái nhân tóc bạc. Ngay sau đó ở nơi cách đại môn tiên giới hơn năm mươi trượng, thân hình Vương Lâm xuất hiên. Tay phải hắn đẩy Lý Nguyên ra. Lúc này Lý Nguyên thất khiếu chảy máu, hai mắt ảm đạm vô quang, trong đó lộ ra vẻ hoảng hốt mê mang.

    Trong nháy mắt khi xuất hiện, thân thể Lý Nguyên phun ra một đám sương máu lớn, hiển nhiên là do thần thông mà Vương Lâm thi triển hắn không thể thừa nhận.

    Trong nháy mắt Vương Lâm hiện thân liền không hề do dự một chút mà ném Lý Nguyên trong tay về phía trước. Một cỗ nguyên lực khổng lồ tràn ngập trong thân thể Lý Nguyên, khiến cho tốc độ của hắn như tia chớp lao thẳng tới cửa đại môn tiên giới đã nhỏ như nắm tay, sắp sửa tan biến.

    Quái nhân tóc bạc cười lạnh, thân thể bước về phía trước một bước, thân ảnh lập tức biến mất. Trong nháy mắt hắn biến mất, ánh mắt Vương Lâm lóe lên hàn mang, không chút do dự bộc phát nguyên lực toàn thân, bên ngoài thân thể hình thành một dòng chảy nguyên lực. Nguyên thần trong cơ thể lại càng phát ra lôi uy mạnh mẽ, lập tức vô số tia chớp từ trong cơ thể lao ra dung nhập vào trong dòng chảy nguyên lực.

    ReplyDelete

Post a Comment

Popular posts from this blog

Thoughts On Adding Spatial Indexing to Voldemort

This weekend, I set out to explore something that has always been a daemon running at the back of my head. What would it mean to add Spatial Indexing support to Voldemort, given that Voldemort supports a pluggable storage layer.. Would it fit well with the existing Voldemort server architecture? Or would it create a frankenstein freak show where two systems essentially exist side by side under one codebase... Let's explore..

Basic Idea The 50000 ft blueprint goes like this.

Implement a new Storage Engine on top Postgres sql (Sorry innoDB, you don't have true spatial indexes yet and Postgres is kick ass)Implement a new smart partitioning layer that maps a given geolocation to a subset of servers in the cluster (There are a few ways to do this. But this needs to be done to get an efficient solution. I don't believe in naive spraying of results to all servers)Support "geolocation" as a new standard key serializer type in Voldemort. The values will still be  opaque b…

Learning Spark Streaming #1

I have been doing a lot of Spark in the past few months, and of late, have taken a keen interest in Spark Streaming. In a series of posts, I intend to cover a lot of details about Spark streaming and even other stream processing systems in general, either presenting technical arguments/critiques, with any micro benchmarks as needed.

Some high level description of Spark Streaming (as of 1.4),  most of which you can find in the programming guide.  At a high level, Spark streaming is simply a spark job run on very small increments of input data (i.e micro batch), every 't' seconds, where t can be as low as 1 second.

As with any stream processing system, there are three big aspects to the framework itself.


Ingesting the data streams : This is accomplished via DStreams, which you can think of effectively as a thin wrapper around an input source such as Kafka/HDFS which knows how to read the next N entries from the input.The receiver based approach is a little complicated IMHO, and …

Setting up Hadoop/YARN/Spark/Hive on Mac OSX El Capitan

If you are like me, who loves to have everything you are developing against working locally in a mini-integration environment, read on

Here, we attempt to get some pretty heavy-weight stuff working locally on your mac, namely

Hadoop (Hadoop2/HDFS)YARN (So you can submit MR jobs)Spark (We will illustrate with Spark Shell, but should work on YARN mode as well)Hive (So we can create some tables and play with it) We will use the latest stable Cloudera distribution, and work off the jars. Most of the methodology is borrowed from here, we just link the four pieces together nicely in this blog. 
Download StuffFirst off all, make sure you have Java 7/8 installed, with JAVA_HOME variable setup to point to the correct location. You have to download the CDH tarballs for Hadoop, Zookeeper, Hive from the tarball page (CDH 5.4.x page) and untar them under a folder (refered to as CDH_HOME going forward) as hadoop, zookeeper


$ ls $HOME/bin/cdh/5.4.7 hadoop hadoop-2.6.0-cdh5.4.7.…