信号量
编辑在计算机科学中,信号量是一种变量或抽象数据类型,用于控制多个线程对公共资源的访问并避免并发系统(如多任务操作系统)中的临界区问题。 信号量是一种同步原语。 普通信号量是根据程序员定义的条件更改(例如,递增或递减或切换)的普通变量。
将信号量视为在现实世界系统中使用的一种有用的方法是记录有多少个特定资源的单位可用,加上操作以安全地调整该记录(即避免竞争条件)作为单位 获得或变得免费,并且,如果有必要,等待直到资源的一个单元变得可用。
信号量是防止竞争条件的有用工具; 但是,使用它们并不能保证程序没有这些问题。 允许任意资源计数的信号量称为计数信号量,而限制为值 0 和 1(或锁定/未锁定、不可用/可用)的信号量称为二进制信号量,用于实现锁定。
信号量概念是由荷兰计算机科学家 Edsger Dijkstra 在 1962 年或 1963 年发明的,当时 Dijkstra 和他的团队正在为 Electrologica X8 开发操作系统。 该系统最终被称为多道程序系统。
类比图书馆
编辑假设一个图书馆有 10 个相同的自习室,一次供一个学生使用。 如果学生想使用自习室,他们必须向前台申请房间。 如果没有房间空闲,学生会在办公桌前等待,直到有人放弃房间。 当学生用完一个房间后,学生必须返回桌子并表明一个房间已空闲。
在最简单的实施中,前台的职员只知道可用房间的数量,他们只有在所有学生在他们注册并在完成后归还他们的房间时实际使用他们的房间时才能正确知道 . 当学生要求房间时,店员会减少这个数字。 当学生释放一个房间时,店员会增加这个数字。 房间可无限次使用,无法提前预约。
在这个场景中,前台计数员代表一个计数信号量,房间是资源,学生代表进程/线程。 此场景中信号量的值最初为 10,所有房间都是空的。 当一个学生申请房间时,他们被授予访问权限,信号量的值变为 9。下一个学生来后,它下降到 8,然后是 7,依此类推。 如果有人请求房间并且信号量的当前值为 0,他们将被迫等待直到房间被释放(当计数从 0 开始增加时)。 如果其中一个房间被释放,但有几个学生在等待,那么可以使用任何方法来选择将占用房间的人(例如 FIFO 或随机选择一个)。 当然,学生在真正离开房间后才需要通知店员释放他们的房间,否则,当学生在离开房间的过程中(他们正在收拾课本等)时,可能会出现尴尬的情况。 另一个学生在他们离开之前进入了房间。
重要观察
当用于控制对资源池的访问时,信号量仅跟踪有多少资源是空闲的; 它不会跟踪哪些资源是免费的。 可能需要一些其他机制(可能涉及更多信号量)来选择特定的空闲资源。
该范例特别强大,因为信号量计数可以作为许多不同操作的有用触发器。 当没有学生时,上面的图书管理员可能会关掉自习室的灯,或者可能会在大部分房间都被占用时放置一个标语,说房间很忙。
该协议的成功需要应用程序正确地遵循它。 如果即使是单个进程行为不正确,公平性和安全性也可能受到损害(这实际上意味着程序可能运行缓慢、行为不稳定、挂起或崩溃)。
这包括:
- 请求资源却忘记释放;
- 释放从未被请求的资源;
- 长期持有资源而不需要它;
- 在未先请求(或释放资源)的情况下使用资源。
即使所有进程都遵循这些规则,当存在由不同信号量管理的不同资源以及进程需要一次使用多个资源时,多资源死锁仍可能发生,如哲学家就餐问题所示。
语义和实现
编辑计数信号量配备了两个操作,历史上表示为 P 和 V。
内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/198045/