2014-01-31 55 views
0

我知道信號量用於同步訪問共享內存的進程。要創建多少個信號量?

基本上我不明白有多少信號量設置創建?

假設,我只有一段共享內存,兩個進程將訪問它。然後,只創建一個信號量。

但是如果我有三個或更多的進程將訪問相同的共享內存,那麼它需要更多的信號集?

信號集創建次數依賴於什麼條件?

在此先感謝。

回答

1

如果您使用的是semctl(IPC信號量),那麼您需要創建一個信號燈。如果你使用的是POSIX信號量(sem_init),那麼也是一個,但只有當你在創建pshared參數時傳遞一個真實值並將其放置在共享內存中。

信號量可以跨線程或進程共享。跨進程共享是在操作系統級別上實現的。即使這些進程不是通過派生單個父進程創建的,兩個或多個不同進程也可以共享相同的信號量。

兩種類型的信號是sysV和POSIX。找到更多關於defference的信息請到System V IPC vs POSIX IPC

sysV信號量在內核中維護,所以你不需要爲它們分配空間或者把它們放在共享內存中來共享它們。但是你確實需要一種方法來使用它們來找到它們。

見這個例子中,一種共享父進程和其子(用gcc來編譯,你需要使用-pthread標誌)之間的一個未命名的UNIX信號:

#include <semaphore.h> 
#include <stdio.h> 
#include <errno.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <sys/mman.h> 

int main(void) 
{ 
    /* place semaphore in shared memory */ 
    sem_t *sema = mmap(NULL, sizeof(sema), 
     PROT_READ |PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS, 
     -1, 0); 
    if (sema == MAP_FAILED) { 
    perror("mmap"); 
    exit(EXIT_FAILURE); 
    } 

    /* create/initialize semaphore */ 
    if (sem_init(sema, 1, 0) < 0) { 
    perror("sem_init"); 
    exit(EXIT_FAILURE); 
    } 
    int nloop=10; 
    int pid = fork(); 
    if (pid < 0) { 
    perror("fork"); 
    exit(EXIT_FAILURE); 
    } 
    if (pid == 0) { 
    /* child process*/ 
+0

你的意思是說,只有一個信號量集合是否需要訪問共享內存的進程是兩個還是更多? – pmverma

+0

是的,我正在使用一個semctl(IPC信號量)。 – pmverma

+1

'semctl()'?信號集不是單個值,而是具有一組值。它通過包含多個信號量的信號集來引用。每個信號集由一個標識信號量集的semid和一個標識集內信號量的semnum標識。一個'semop()'調用可以指定多個信號量操作。這些操作在信號集內的多個信號量上是原子的。 –

0

它不依賴於數量進程訪問資源。信號量用於避免同時訪問資源。如果只有一個資源使用一個資源初始化信號量。一旦進程佔用了資源,其他兩個或多個進程等待資源被釋放。一旦根據進程狀態/調度釋放資源,另一個進程將採用該資源。

序列會像

初始化與一個資源: sem_init()

接過資源: sem_wait()或sem_timedwait()

免費資源: sem_post()