C 一般信号量的范围是什么?

C 一般信号量的范围是什么?,c,linux,operating-system,semaphore,C,Linux,Operating System,Semaphore,一般信号量的范围是多少。我知道它可以取负值,0和1。 显示块队列中被阻止的进程数的负值。0表示块中没有进程,1表示有一个可用资源没有进程抢占它。我想知道它的值是否可能大于1(例如2),这意味着什么?这是否意味着一个信号量有多个资源?思考信号量的一种常见方式是将篮子与球类比。如果篮中有球,那么流程或任务可以从篮中取出球,并访问共享资源或共享执行空间 从篮子里拿球代表倒数信号灯,反之亦然,把球放进篮子就是倒数信号灯的类比。可用于相互隔离、同步等情况 信号量可以接受的值通常没有特定的限制,除此之外,

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

思考信号量的一种常见方式是将篮子与球类比。如果篮中有球,那么流程或任务可以从篮中取出球,并访问共享资源或共享执行空间

从篮子里拿球代表倒数信号灯,反之亦然,把球放进篮子就是倒数信号灯的类比。可用于相互隔离、同步等情况

信号量可以接受的值通常没有特定的限制,除此之外,它只是整数值,并且受平台的整数实现的限制


它可以取决于您的特定用例,信号量是否真的可以达到大于1的值,在某些情况下可能大于1,而在其他情况下,可以想象信号量不能大于1,但范围将取决于信号量的特定用途

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

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

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

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

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


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

它被称为计数信号。 例如:-您有一个共享内存的关键部分,并且您已经将计数信号量初始化为10,这意味着一次只有最大10个进程可以进入关键部分进行读取。 对于写入临界段,使用二进制信号量,并且在读取时使用上述和二进制信号量的组合来访问该区域


例如:-在写入时,将二进制信号量计数器减量为0,读取过程将仅在(0)等待(1)准备读取时检查二进制信号量计数器。

您应该确切指定您所说的信号量类型。Linux支持内核信号量、POSIX信号量和SystemV信号量

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在新闻组帖子()中所说:

然而,几乎所有实际使用的信号量都是一个特例 其中计数器初始化为1,并用作 仅允许一个用户在临界状态下进行简单互斥 区域这种信号量通常被称为“互斥”信号量 相互排斥

我从来没有见过有人使用更复杂的 信号量,尽管我知道在某些情况下它是有用的。对于 例如,更复杂的信号量的一个用途是作为“节流阀”,其中 你可以这样做:

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

init_sema(&sem, MAX_CONCURRENT_USERS);
然后,每个用户在启动 活动它不会阻止,直到你有20个用户-你没有 创建了互斥,但创建了节流 机制。看到了吗


寻找关于信号量的全面解释。维基百科的文章也有一些很好的解释。我非常感谢你的概念性回答。但迈克尔·伯尔的回答更具技术性,我应该接受。谢谢。是的,因此信号量的值大于1意味着可以在进程之间调度的类似资源的数量,并且不会在进程之间发生阻塞。这是真的吗?你的回答很有帮助。谢谢,就是这个主意。请记住,这种情况非常少见——绝大多数信号量的使用都是为了与