操作系统信号量

时间:2015-03-13 19:29:48

标签: kernel system mutex semaphore

我环顾四周,似乎无法找到问题的答案。我一直试图绕着信号量和它们实际实现的地方。我知道信号量是一种操作系统功能,但也可以在应用程序级程序中使用。我的问题是,当操作系统(我认为)应该处理访问问题时,为什么需要在应用程序中使用信号量?

5 个答案:

答案 0 :(得分:2)

信号量是一种变量或抽象数据类型,用于控制多个进程对并发系统(如多道程序设计操作系统)中的公共资源的访问。

考虑信号量的一种有用方法是记录特定资源的可用单位数量,并结合安全操作(即,没有race conditions)将该记录作为需要或成为单位进行调整免费,并在必要时等待资源的一个单位可用。信号量是预防竞争条件的有用工具;

Courtesy

答案 1 :(得分:0)

应用程序是一组进程,都执行不同的代码。

让我们说有2个进程 - A和B在申请中。 A和B想要访问特定文件 - " play.txt"以另一种方式。我的意思是首先访问A,然后是B,然后是A,依此类推。

操作系统不知道这个执行顺序。操作系统只知道内核进程及其必须由用户实现的原因。用户将在他的程序中使用信号量,操作系统将读取该信号量以了解有关这两个过程的所有信息。

答案 2 :(得分:0)

信号量是OS提供的数据类型,用于进程同步 信号量有两个原子操作(原子意味着完全执行或根本不执行)wait和signal.during这两个操作上下文切换不会发生,因为它们是原子的。
程序员必须实现这些操作,以便OS在某些重要操作期间不进行上下文切换。 例如 - 读者写作者问题。

注意: - 操作系统非常复杂,操作系统概念可以让我们了解操作系统的工作情况。但是,当前的系统工作可能与每十年一样,在操作系统和硬件方面都有计算机系统升级。操作系统实现各种概念以保持其运行并提供更好的CPU利用率。

答案 3 :(得分:0)

sempahore用于保护对两个独立运行的线程或进程之间共享的数据结构的访问。您可能会遇到信号量描述中使用的短语“critical region”;忽略它。您不使用信号量保护代码,而是保护共享数据结构。

假设你有这些变量:

int savings;
int house_payment;

并且您想将一些钱从储蓄桶转移到house_payment桶中。在这种情况下,另一个过程需要知道您的银行余额和贷款余额。

流程A接受付款,从储蓄中减去价值。 然后,进程A将值添加到house_payment存储桶。

现在假设流程B需要检查负载平衡和您的储蓄余额。由于流程未同步,流程B会查看流程A从您的储蓄中移除资金时的值,但在流程A可以将付款添加到您的house_payment之前。

就流程B而言,储蓄桶的钱太少而且house_payment桶没有足够的钱。您的房屋付款资金在运输途中丢失。如果进程B再次查看,那么奇怪的是,缺少的钱出现在house_payment存储桶中。

为了防止该窗口,使用信号量。进程A在转移资金时获取信号量,并在资金被放入house_payment存储桶后释放信号量。

进程B在访问savings和house_payment存储桶之前获取信号量,并在完成后释放信号量。

使用信号量保护对共享数据的访问,当资金在传输过程中,任何进程都不会看到因检查存储桶而导致的不一致状态。

现在,操作系统无法知道何时应用信号量保护。这是应用程序必须管理的内容。

答案 4 :(得分:0)

是的,操作系统应该处理访问问题,而信号量只是帮助它做到这一点。 试着这样理解: 有一条铁路,有4列火车(比如火车A,B,C,D)等着进入铁路。现在,条件是,只有一列火车可以在给定的实例上访问它。因此,车站主人所做的是给列车的每个司机一个灯泡。如果列车(例如,列车A)的灯泡打开,这意味着列车A有权使用铁路。当A正在使用道路时,列车B,C,D将等待(在等待队列中)他们的灯泡被关闭。 协议是,一旦使用道路完成了火车A,它将关闭灯泡并且排队中的下一列火车(例如,火车B),打开灯泡并使用道路。这种情况一直持续到队列中的所有列车都有机会为止。

在这种情况下,灯泡是信号量列车是进程/作业,而铁路是关键部分(共享资源)。