2015-03-13 164 views
0

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

回答

0

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

假设有2个进程 - 应用程序中的A和B. A和B想要以另一种方式访问​​特定文件 - “play.txt”。我的意思是A先访问然后B然后A等等。

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

2

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

思考信号量的一种有用方法是记录特定资源的可用单元数量,以及安全操作(即,没有race conditions),因为单元需要或变得自由时调整该记录,以及如有必要,请等到资源的某个单元可用。信号量是预防竞争条件的有用工具;

Courtesy

0

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

注:操作系统非常复杂,操作系统的概念让我们对操作系统的工作有了一个想法。但是目前的系统工作可能与每十年一样,操作系统和硬件方面的计算机系统升级.OS实现各种概念以保持运行并提供更好的CPU利用率。

0

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

假设你有这些变量:

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在访问存储和house_payment存储区之前获取信号量,并在完成时释放信号量。

通过信号量守护访问共享数据,两个进程都不会看到由于在传输过程中检查桶而导致的不一致状态。

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

0

是的,操作系统应该考虑访问问题和信号量只是帮助它做到这一点。 尝试以这种方式了解它: 有一个铁路,有4列火车(说,火车A,B,C,D)等待访问铁路。现在,条件是,在给定的情况下,只有一列火车可以访问它。所以,车站大师所做的是给列车的每个司机一个灯泡。如果火车的灯泡(比如A列)开着,那就意味着列车A有权使用铁路。当A正在使用道路时,列车B,C,D将等待(在等待队列中)并关闭其灯泡。 协议是,一旦列车A使用道路完成,它关闭它的灯泡,并在队列中的下一列火车(比如说火车B),打开灯泡并使用道路。这一直持续到队列中的所有列车都有机会。

灯泡是在这种情况下,信号量,所述火车的过程/工作 s,并且铁路是临界段(共享资源)。