next up previous contents
下一主题: 内部数据结构 上一级: 6.4.3 信号量 前一主题: 6.4.3 信号量

基本概念

信号量最好被描述为计数器,用于控制多个进程对共享资源的访问。它们最常被用作锁定机制,以防止进程在另一个进程对其执行操作时访问特定资源。信号量通常被认为是 System V IPC 对象的三种类型中最难掌握的。为了充分理解信号量,我们将在深入探讨任何系统调用和操作理论之前,先简要讨论它们。

信号量”这个名称实际上是一个古老的铁路术语,指的是十字路口的“臂”,它阻止汽车在交叉路口穿过轨道。对于一个简单的信号量集来说,情况也是如此。如果信号量是“开启”的(臂是抬起的),那么资源是可用的(汽车可以穿过轨道)。但是,如果信号量是“关闭”的(臂是放下的),那么资源是不可用的(汽车必须等待)。

虽然这个简单的例子可以用来介绍这个概念,但重要的是要认识到信号量实际上是以集合的形式实现的,而不是作为单个实体。当然,给定的信号量集可能只有一个信号量,就像我们的铁路示例中那样。

也许理解信号量概念的另一种方法是将它们视为资源计数器。让我们将这个概念应用到另一个真实世界的场景中。考虑一个打印假脱机程序,它能够处理多台打印机,每台打印机处理多个打印请求。一个假设的打印假脱机管理器将利用信号量集来监控对每台打印机的访问。

假设在我们的公司打印室中,我们有 5 台打印机在线。我们的打印假脱机管理器分配一个包含 5 个信号量的信号量集,系统中每台打印机对应一个信号量。由于每台打印机在物理上一次只能打印一个作业,因此我们集合中的五个信号量中的每一个都将被初始化为值 1(一),这意味着它们都已在线并接受请求。

John 向假脱机程序发送一个打印请求。打印管理器查看信号量集,并找到第一个值为 1 的信号量。在将 John 的请求发送到物理设备之前,打印管理器将相应打印机的信号量递减负一 (-1)。现在,该信号量的值为零。在 System V 信号量的世界中,值为零表示该信号量上的资源利用率为 100%。在我们的示例中,在它不再等于零之前,不能向该打印机发送其他请求。

当 John 的打印作业完成后,打印管理器递增与打印机对应的信号量的值。它的值现在又回到 1 (一),这意味着它再次可用。当然,如果所有 5 个信号量的值都为零,那将表明它们都在忙于打印请求,并且没有打印机可用。

尽管这是一个简单的例子,但请不要对分配给集合中每个信号量的初始值 1 (一) 感到困惑。当信号量被视为资源计数器时,可以初始化为任何正整数值,并且不限于零或一。如果我们的五台打印机中的每一台都可能一次处理 10 个打印作业,我们可以将我们的每个信号量初始化为 10,每当有新作业时递减 1,并在打印作业完成时递增 1。正如您将在下一章中发现的那样,信号量与共享内存段有着密切的工作关系,充当看门狗,以防止对同一内存段进行多次写入。

在深入研究相关的系统调用之前,让我们简要地了解一下在信号量操作期间使用的各种内部数据结构。


next up previous contents
下一主题: 内部数据结构 上一级: 6.4.3 信号量 前一主题: 6.4.3 信号量

转换于
Fri Mar 29 14:43:04 EST 1996