Kernel 操作系统信号量

Kernel 操作系统信号量,kernel,system,mutex,semaphore,Kernel,System,Mutex,Semaphore,我环顾四周,似乎找不到我问题的答案。我一直在试图了解信号量及其实际实现的位置。我知道信号量是操作系统的一个特性,但也可以在应用程序级程序中使用。我的问题是,当操作系统(我认为)应该处理访问问题时,为什么需要在应用程序中使用信号量?应用程序是一组进程,所有进程都执行不同的代码 假设一个应用程序中有两个进程-A和B。 A和B希望以另一种方式访问特定文件-“play.txt”。我的意思是先访问A,然后访问B,然后访问A,依此类推 操作系统不知道这种执行顺序。操作系统只知道内核进程,这就是为什么它必须由

我环顾四周,似乎找不到我问题的答案。我一直在试图了解信号量及其实际实现的位置。我知道信号量是操作系统的一个特性,但也可以在应用程序级程序中使用。我的问题是,当操作系统(我认为)应该处理访问问题时,为什么需要在应用程序中使用信号量?

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

假设一个应用程序中有两个进程-A和B。 A和B希望以另一种方式访问特定文件-“play.txt”。我的意思是先访问A,然后访问B,然后访问A,依此类推


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

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

将信号量视为一个特定资源有多少个单元可用的记录是一种有用的方式,加上在单元需要或可用时安全(即不需要)调整该记录的操作,如有必要,等待资源单元可用。信号量是防止种族状况的有用工具


信号量是操作系统提供的一种数据类型,用于进程同步。
信号量有两个原子操作(原子表示完全执行或根本不执行)等待和信号。在这两个操作期间,上下文切换不会发生,因为它们是原子操作。
程序员必须实现这些操作,以便操作系统在某些重要操作期间不会切换上下文。 例如读写器问题


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

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

假设您有以下变量:

int savings;
int house_payment;
你想把一些钱从储蓄桶转移到房屋支付桶。在这个过程中,另一个过程需要了解您的银行余额和贷款余额

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

现在假设进程B需要检查负载平衡和您的储蓄平衡。由于这些流程未同步,流程B将查看流程A从您的储蓄中取出钱时的值,但在流程A将付款添加到您的房屋付款之前

就流程B而言,储蓄桶的钱太少,而房屋支付桶的钱不够。你的房款在运输途中丢失了。如果流程B再次查看,丢失的钱神奇地出现在house_付款桶中

为了防止出现该窗口,使用了一个信号量。进程A在转移资金时接收信号量,并在资金放入house_支付桶后释放信号量

进程B在访问储蓄和住房支付桶之前获取信号量,完成后释放信号量

有了一个信号灯来保护对共享数据的访问,这两个进程都不会看到由于在资金传输过程中检查存储桶而导致的不一致状态


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

是的,操作系统应该负责访问问题,信号量只是帮助它做到这一点。 试着这样理解它: 有一条铁路,有4列火车(比如a、B、C、D列)等着进入铁路。现在,条件是,在给定的情况下,只有一列火车可以访问它。因此,站长所做的就是给每一位列车司机一个灯泡。如果列车(比如A列)的灯泡打开,这意味着A列有权使用铁路。当A在道路上行驶时,B、C、D列将在灯泡关闭的情况下等待(在等待队列中)。 协议是,一旦A列通过道路,它将关闭灯泡,队列中的下一列列车(比如B列)将打开灯泡并使用道路。这一直持续到排队的所有火车都有机会

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