c - 什么是通用信号量范围?

标签 c linux operating-system semaphore

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

最佳答案

您应该准确指定您所谈论的信号量类型。 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 ) 中所说:

However, almost all practical use of semaphores is a special case where the counter is initialized to 1, and where they are used as simple mutual exclusion with only one user allowed in the critical region. Such a semaphore is often called a "mutex" semaphore for MUTual EXclusion.

I've never really seen anybody use the more complex case of semaphores, although I do know of cases where it can be useful. For example, one use of a more complex semaphore is as a "throttle", where you do something like this:

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

init_sema(&sem, MAX_CONCURRENT_USERS);

and then each user does a down() on the semaphore before starting an operation. It won't block until you have 20 users - you've not created a mutual exclusion, but you HAVE created a throttling mechanism. See?

关于c - 什么是通用信号量范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20656295/

相关文章:

c - 如何为本地主机服务器同时打开 1000 个客户端进程?

c - printf 有符号整数和小数点,带负号的问题

c - 我试图从正数倒数到零,然后使用负数从零向上数

c - C语言中外部变量的使用

linux - zImage 安装在 Raspberry PI 2 上

c - inotify_add_watch 用于几个掩码

linux - 递归查找不可公开读取的文件

linux - 函数和分形 - 递归树 - Bash!逻辑问题

c++ - 使用 g++,如何弃用虚拟类成员函数

assembly - 无法在 16 位实模式汇编中清除整个屏幕