信号量机制知识点整理


操作系统——信号量机制

1、基础概念

1.1 背景介绍

  • 并发问题:竞争条件

  • 多线程同步问题中锁不够用

    mark

1.2 信号量

  • 抽象数据类型
    • 一个整形(sem),两个原子操作
    • P():sem减1,如果sem<0,等待,否则继续
    • V():sem加1,如果sem<=0,唤醒一个等待的进程P
  • 例如铁路上的信号灯
  • DI jkstra在20世纪69年代提出

2、信号量的使用和实现

2.1 使用

  • 信号量是整数
  • 信号量是被保护的变量
    • 初始化完成后,唯一改变一个信号量的值的办法是通过P()和V()
    • 操作必须是原子的
  • P()能够阻塞,V()不会被阻塞
  • 在实践中,FIFO经常使用
  • 两种类型信号量
    • 二进制信号量:0或1,实现lock的功能
    • 一般/计数信号量:可取任何非负值
    • 两者相互表现
  • 信号量可以用在
    • 互斥
    • 更复杂的条件同步

2.2 实现

  • 用二进制信号量实现的互斥

  • 每个约束用一个单独的信号量

    • 案例:生产者、消费者问题

      • 设置信号量
      • 进行操作,生产者添加,消费者减少
      • 通知消费者为满,通知生产者为空

      mark

  • P、V操作交换顺序

    • P操作交换产生死锁
    • V操作交换无影响
  • P、V操作实现原理

    mark

3、管程

3.1 目的

  • 分离互斥和条件同步的关注

3.2 什么是管程

  • 一个锁:指定临界区

  • 0或者多个条件变量:等待/通知信号量用于管理并发访问共享数据

    mark

3.3 一般方法

  • 收集在对象/模块中的相关共享数据
  • 定义方法来访问共享数据

3.4 管程的实现

  • 条件变量的实现

    • 条件变量并不需要加减平衡,例如,执行Wait,numWaiting++,但是执行Signal时,如果numWaiting>0不成立,则numWaiting–不会执行

    mark

  • 管程的实现

    • 设置lock锁
    • 设置管理线程数量
    • 设置buffer信号量,notFull,notEmpty

    mark