15

我试图了解命名信号量和未命名信号量之间的异同,所以我的谷歌搜索得到了这个。我对页面上的措辞有疑问,它说:

  • 未命名的信号量可能被多个进程使用
  • 命名信号量可由多个进程共享

这两个词是否在这两种类型的信号量之间产生了任何重要的区别,或者它们是不相关的?

到目前为止,这就是我所拥有的:

Similarities
    -Several processes can do something with the semaphore

Difference
    -Named are referenced with pathname and unnamed are referenced by pshared value

这就是我能从这个定义中收集到的全部信息。这就是一切,它们是否正确?还是我错过了一些重要的概念?

4

3 回答 3

19

考虑可以访问信号量。

未命名的信号量(缺少任何名称或句柄来定位它们)必须存在于某个预先存在的、商定的内存位置中。在子进程的情况下,通常是(1)共享内存(由fork子进程继承);或 (2) 共享内存、全局变量或堆(如果它们在单个进程的线程之间共享)。这里最重要的是父、子或线程中的代码已经知道信号量的地址。

命名信号量对于不相关的进程是必需的。例如,生产者和消费者可能由两个不同的开发人员编写,并作为完全不相关的进程运行。但是它们必须共享一些需要受信号量保护的资源。命名信号量为它们提供了通往信号量的路径。

实际上,您可以在所有场景中使用命名信号量,但它们会带来一些额外的负担,因为您必须处理路径和权限,如果程序相关并且已经知道如何访问未命名信号量,则这些都是不必要的。例如,使用命名信号量在线程之间共享资源有点愚蠢。线程已经可以访问未命名信号量可能驻留的相同内存。

于 2012-10-30T22:06:01.717 回答
8

接受的答案是错误的(以及@electron 给出的另一个答案)。不相关的进程可以使用未命名的 POSIX 信号量。您只需将数据结构存储在相关进程可访问的共享内存中,并在将可共享标志设置为 1 的情况下对其进行初始化,如此处所示(无耻地复制自http://blog.superpat.com/2010/07/14/信号量-on-linux-sem_init-vs-sem_open/):

int shm;
sem_t * mutex;

if ((shm = shm_open("myshm", O_RDWR | O_CREAT, S_IRWXU))   0) {
    perror("shm_open");
    exit(1);
}

if (ftruncate(shm, sizeof(sem_t)) < 0 ) {
    perror("ftruncate");
    exit(1);
}

if ((mutex = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED, shm, 0)) == MAP_FAILED) {
    perror("mmap");
    exit(1);
}

if (sem_init(mutex, 1, 1) < 0) {
    perror("semaphore initialization");
    exit(1);
}

共享内存到其地址空间的另一个进程映射可以访问相同的信号量并与原始进程同步。另请参阅sem_init()的 POSIX 规范及其linux 手册页

于 2015-11-17T01:50:53.170 回答
-2

命名信号量actual name中有一个file system并且可以shared由多个不相关的进程组成。

未命名的信号量只能在threads属于同一进程的情况下使用。

信号量是使用函数创建的

                 sem init(ptr_semaphore, flag, initial_value);

在哪里

ptr_semaphore:指向信号量的指针

flag : 表示共享级别的标志

initial_value:信号量的初始值

如果传递flag=0sem_init()然后信号量只能由属于创建信号量的进程的线程共享。因此它将创建未命名的信号量

          sem_init(ptr_semaphore,0,initial_value)   //unamed semaphore

传递一个非零值也会让allow 其他进程访问信号量。因此,它将导致命名信号量

          sem_init(ptr_semaphore,1,initial_value)   //named semaphore
于 2015-07-28T12:52:36.910 回答