什么是一般信号量范围?

mur*_*din 4 c linux operating-system semaphore

一般信号量的范围是多少.我知道它可以取负值0和1.负值表示块队列中阻塞的进程数.0表示没有进程在块中,1表示有一个资源可用,没有进程已抢占它我想知道是否可能有大于1的值.(例如2)它是什么意思?这是否意味着我们为一个信号量提供了多个资源?

Mic*_*urr 6

您应该确切地指定您正在谈论的信号量类型.Linux支持内核信号量,POSIX信号量和System V信号量.

System V信号量API记录了信号量值不能小于0.

POSIX信号量API记录"如果sem被锁定,则sval点的对象应设置为零或负数,其绝对值表示在调用期间某个未指定时间等待信号量的进程数" .看起来POSIX信号量的glibc实现不允许信号量计数/值降到零以下.

Linux内核信号量曾经有一个使用负数计算跟踪服务员的实现 - 这是Bovet&Cesati的"理解Linux内核"一书中记录的实现.然而,在2.6内核的演变中(我认为在2.6.11之后和2.6.32之前的某个时间),实现发生了变化,因此信号量值不会降到零以下.

因此,所有信号量都允许大于零的计数,这表示可以同时获取的一些资源.信号量计数是否可以低于零是一个实现细节 - 在等待资源时,这些信号量的行为与不允许计数降至零以下的信号量实现相同.

但信号量大于1的用例很有用.正如Linus Torvalds在新闻组发帖中所说(http://yarchive.net/comp/linux/semaphores.html):

但是,几乎所有信号量的实际使用都是一种特殊情况,其中计数器初始化为1,并且它们被用作简单互斥,只允许一个用户进入关键区域.对于MUTual EXclusion,这种信号量通常被称为"互斥"信号量.

我从来没有真正看到任何人使用更复杂的信号量情况,虽然我知道它可能有用的情况.例如,使用更复杂的信号量就像"油门"一样,你可以这样做:

/* Maximum concurrent users */    #define MAX_CONCURRENT_USERS 20
struct semaphore sem;

init_sema(&sem, MAX_CONCURRENT_USERS);
Run Code Online (Sandbox Code Playgroud)

然后每个用户在开始操作之前对信号量执行down().在你有20个用户之前它不会阻止 - 你没有创建互斥,但是你已经创建了一个限制机制.看到?


小智 5

负数,信号量上正好有-N个线程排队。

,没有等待线程,等待操作会将调用线程放入队列。

正数,没有等待线程,等待操作不会将调用线程放入队列。

在此处输入图片说明

计数信号量通常用作离散量可用资源的保护。例如,计数器可以表示循环队列中已用插槽的数量,生产者线程将在队列中插入项目时“发出信号”信号,消费者线程将“等待”项目出现在队列中,这将确保没有如果没有可用的商品,消费者将能够从队列中获取商品。

最大数量取决于系统。信号量可以使用文件描述符来实现,在这种情况下,应用程序至少可以打开总共{OPEN_MAX}个文件和信号量。

您可以通过以下方法检查系统上的当前值: cat /proc/sys/fs/file-max