【问题标题】:what is general semaphores range?一般信号量范围是多少?
【发布时间】:2014-01-06 12:31:52
【问题描述】:

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

【问题讨论】:

标签: c linux operating-system semaphore


【解决方案1】:

您应该准确说明您所谈论的信号量类型。 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 的位置,以及它们用作 简单的互斥,只允许一个用户在关键 地区。这样的信号量通常被称为“互斥”信号量,用于 互斥。

我从未真正见过有人使用更复杂的情况 信号量,尽管我确实知道它可能有用的情况。为了 例如,更复杂的信号量的一种用途是作为“节流阀”,其中 你做这样的事情:

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

init_sema(&sem, MAX_CONCURRENT_USERS);

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

【讨论】:

  • 是的,所以信号量大于 1 的值意味着可以在进程之间分派的类似资源的数量,并且它们之间不会发生阻塞。是真的吗?你的回答很有帮助。谢谢
  • 是的,就是这样。请记住,这种情况并不常见 - 绝大多数信号量用于互斥,最大资源数为 1。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

    • 非常感谢您的概念性回答。但迈克尔伯尔的回答更具技术性,我应该接受它。谢谢。
    【解决方案4】:

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

    从篮筐中拿球代表信号量倒数,反之亦然,将球放入篮子类似于对信号量进行计数。可用于互斥、同步等情况。

    信号量可以取什么值通常没有具体限制,除了它只是整数值并且受平台的整数实现限制。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 2020-03-19
      • 2019-06-20
      相关资源
      最近更新 更多