【问题标题】:Where do we really need a set of System v Semaphores?我们在哪里真正需要一组 System v Semaphores?
【发布时间】:2011-06-30 17:39:22
【问题描述】:

每次我阅读semget: The semget() system call returns the semaphore set identifier associated with the argument key. 的描述时,我都在想,我们在哪里真正需要一组 System V 信号量。

我总是将nsems 参数指定为1,因为大多数时候我需要一个信号量。即使我不需要二进制信号量,我为什么要创建一组 5-6 个信号量(比如说)。

如果一个进程创建了一组与单个键关联的 6 个信号量,而另一个进程尝试在同一个键上执行 semget 只要求 3 个信号量,该怎么办。也不是所有这 6 个信号量 6 个单独的二进制信号量。我口渴了,寻找这个问题的答案 2 个月(当然不是连续的)。

如果这个问题似乎是最愚蠢的问题,我很抱歉,但除非我得到一个真正使用信号量集的例子,否则这个疑问将留在我的脑海中。我试图搜索一个示例 C 代码,其中有人正在使用一组信号量,但我找不到。

如果你们能帮我解决这个问题,我会非常感谢你们。提前致谢。

【问题讨论】:

  • 如果我有一个程序需要 5 个信号量来保护 5 个资源,这样我就可以使用一个键和一个信号量 ID 来访问它们。但是在这种情况下,如果我也有一个子进程并且它确实 semget 并要求这 5 个信号量中的 3 个,会发生什么。我现在就去试试。

标签: unix operating-system semaphore sysv


【解决方案1】:

我在一个 DBMS 上工作,它对一组协作进程中的每一个都使用一个信号量,这些进程处理相同的数据,通过共享内存进行协作。必须一次分配一个会很麻烦;设置一个包含 20 个(或其他)信号量的信号量非常方便。

【讨论】:

  • 即使我也这么认为。所以它基本上也是为了节省资源。因为如果您使用信号量集为 20 个信号量获取 1 个键,那么它比为这些信号量获取 20 个键和 20 个 id 并处理它们就像处理 20 个整数一样好。 sem1,sem2,sem3...sem20。你能告诉我另一个例子吗? (我同意你的回答,所以我投票赞成)
  • @Anirudh:不;我没有替代的例子。这是我所知道的唯一使用信号量集的程序,其中信号量集的大小大于一。
【解决方案2】:

我所知道的信号量最典型的情况是当一个或多个处理线程正在处理一个数据队列时。每个线程都会减少从队列中删除的每个条目的信号量,并且当新数据放入队列时,信号量会增加。那么您需要做的就是等待信号量,而不是不断地轮询更新。

【讨论】:

  • 所以您描述的是一个所有线程都使用单个信号量的系统?或者每个线程都有一个信号量?
  • 每个队列使用一个信号量。多个线程可以处理来自单个队列的数据,但是如果您有多个队列,则需要多个信号量才能唤醒正确的线程。
【解决方案3】:

我在大学操作系统课程的作业中使用了一组信号量。

任务是创建一个生成客户端的服务器。客户端可以发送请求并从服务器接收响应。一次只有一个客户端可以向服务器发送请求。

所以我使用了三个信号量:

  • 1 作为互斥体(初始化为 1),仅在客户端之间使用
  • 1 表示客户端和服务器之间的请求。
  • 1 表示服务器和客户端之间的响应

【讨论】:

    猜你喜欢
    • 2017-03-09
    • 2013-08-10
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多