• 《操作系统概念》学习笔记-信号量


    《操作系统概念》第六章 6.5

    信号量S十个整数变量,除了初始化外,它只能通过两个标准原子操作:wait()和signal()来访问。

    Wait()的定义可表示为:

    wait(S) {
        while(S <= 0)
            ;// no-op
        S--;
    } 

    signal的定义可表示为

    signal(S) {
        S++;
    }

    在wait()和signal()操作中,对信号量整型值的修改必须不可分地执行,即当一个进程修改信号量值时,不能有其他进程同时修改同一信号量的值。对于wait(S),对S的整型值的测试(S<=0)和对其可能的修改(S--),也必须不被中断地执行。

    操作系统区分计数信号量和二进制信号量。计数信号量的值域不受限制。而二进制信号量的值只能为0或1.。有的系统把二进制信号量称为互斥锁。

    计数信号量可以用来控制访问具有若干实例的某种资源。该信号量初始化为可用资源的数量。当每个进程需要使用资源时,需要对该信号量执行wait()操作(减少信号量的计数)。当进程释放资源时,需要对该信号量执行signal()操作(增加信号量的计数)。

    这里所定义的信号量的主要缺点是都要求忙等待(busy waiting)。当一个进程位于其临界值内时,任何其他试图进入其临界区的进程都必须在其进入代码中连续地循环。这种类型的信号量也称为自旋锁,这是因为进程在其等待时还在运行(自旋锁有其优点,进程在等待锁时不进行上下文切换,而上下文切换可能需要花费相当长的时间。自旋锁常用于多处理器系统,这样一个进程在一个处理自旋锁时,另一线程可在另一处理器上在其临界区内执行。)

    克服忙等:修改信号量的wait()和signal()的定义,当一个进程执行wait()时,发现信号量的值不为正,则它不是忙等而是阻塞自己。阻塞操作将一个进程放入到与信号量相关的等待队列中,并将该进程的状态切换成等待状态。可以在其它进程执行signal()操作之后被重新执行,该进程的重新执行是通过wakeup()来进行的,将进程从等待状态切换到就绪状态。

    typedef struct {
      int value;   struct process *list; //进程链表。当一个进程必须等待信号量时,就加入到进程链表上。 } semaphore; wait(semaphore *S) {   S->value--;   If (S->value < 0) {     add this process to S->list;     block();   } } signali(semaphore *S) {   S->value++;   if (S->value <= 0) {     Remove a process P from S->list;     wakeup(P);   } }

    等待进程的链表可以利用进程控制块PCB中的一个连接域来实现。

    必须确保没有连个进程能同时对同一信号量执行操作wait()和signal()。有两种方法:1.在单处理器环境下,可以在执行wait()和signal()操作时简单地禁止中断。2.在多处理器环境下,必须禁止每个处理器的中断,但是这个很难,还会严重影响性能。

    这里对wait()和signal()操作的定义,并没有完全取消忙等,而是取消了应用程序进入临界区的忙等。而且,将忙等限制在操作wait()和signal()的临界区内。

    死锁与饥饿:

    具有等待队列的信号量的实现可能导致这样的情况:两个或多个进程无限地等待一个事件,而这个事件只能由这些等待进程之一来产生。这里主要关心的事件是资源获取和释放。当出现这样的状态时,这些进程就称为死锁。

    与死锁相关的另一个问题是无限期阻塞(indefinite blocking)或饥饿(starvation),即进程在信号量内无限期等待。如果对与信号量相关的链表按LIFO顺序来增加和移动进程,那么可能会发生无限期阻塞。

  • 相关阅读:
    python语法基础-并发编程-协程-长期维护
    python语法基础-并发编程-线程-其他
    python语法基础-并发编程-线程-线程池
    python语法基础-并发编程-线程-各种锁以及队列
    python语法基础-并发编程-线程-线程理论和线程的启动
    python语法基础-并发编程-进程-其他
    python语法基础-并发编程-进程-进程池以及回调函数
    python语法基础-并发编程-进程-进程锁和进程间通信
    python语法基础-并发编程-进程-进程理论和进程的开启
    二、提高期(Upping the Ante)
  • 原文地址:https://www.cnblogs.com/linjj/p/4372739.html
Copyright © 2020-2023  润新知