软考-软件设计师:信号量机制、PV操作实现进程的互斥和同步

临界资源

把 一个时间段内只允许一个进程使用 的资源称为临界资源。

如:许多物理设备(比如摄像头、打印机)都属于临界资源。此外还有许多变量、数据、内存缓冲区等都属于临界资源。

临界区

访问临界资源的那段代码

进程的互斥

进程 并发 执行 时,需要访问 临界资源,这些进程是 互斥的

如:多个进程并行时,需要使用 打印机,像 打印机 这类 物理设备,同一时间段内 只允许一个进程访问。那这些进程就是互斥的

互斥访问过程

  1. 当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须 等待。

  2. 当前访问临界资源的进程访问结束,释放 该资源之后,另一个进程才能去访问临界资源。

进程的同步

进程 并发 执行 时,有速度上的差异,在一定情况下停下等待,不存在资源是否单独或共享的问题

用于 生产者-消费者 模式,如:食堂出餐速度慢,学生打饭多,学生需要等待食堂出餐,这两个进程是同步关系

信号量

是操作系统用来解决 进程并发 中的 互斥 和 同步 问题的一种方法

信号量一般用 S 表示,是一个整数变量

当 S>=0 表示 资源可用数
当 S<0 则其绝对值表示 排队进程数

PV操作

P操作:申请资源

V操作:表示释放一个资源

进程互斥-PV操作

提示:S表示信号量

当进程执行时,先执行 P操作,申请资源:

  1. 执行 S=S-1
  2. 若 S>=0,S 表示资源 可用数量,说明资源 够用,进程继续执行;
  3. 若 S<0,S 表示 排队进程数,说明资源 不够用,将该进程放入阻塞队列

当该进程执行结束后,再执行 V操作,释放资源:

  1. 执行 S=S+1
  2. 若 S>0,S 表示资源 可用数量,没有进程排队;
  3. 若 S<=0,S 表示 排队进程数,从阻塞队列中取出进程,告诉该进程可以执行

总结

信号量初值:表示 资源的数量,一般 非0

先执行 P操作,申请资源
再执行 V操作,释放资源

进程同步-PV操作

S1 表示市场的数量,数量是 1
S2 表示产品数量,数量是 0

如果生产者先执行

  1. 先执行 P(S1) 操作后,S1 是 0
  2. 生成产品,并放入到 缓冲区(市场)后,执行 V(S2),通过释放 产品 操作让 S2的数量加1
然后,消费者执行
  1. 先执行 P(S2),由于 S2 非 0(上面执行 加1),执行后,S2>=0,会继续执行

  2. 从缓冲区取商品后,执行 V(S1),通过释放操作 市场,让 S1的数量加1,表示 市场 可被下一个进程使用

如果消费者先执行

  1. 先执行 P(S2),由于 S2 初始值 0,执行后,S2是-1,该进程会放入阻塞队列中
然后,生产者执行
  1. 先执行 P(S1) 操作后,S1 是 0
  2. 生成产品,并放入到 缓冲区(市场)后,执行 V(S2),通过释放 产品 操作让 S2的数量加1
  3. 唤醒阻塞队列中的进程
最后,消费者执行

从缓冲区取商品后,执行 V(S1),通过释放操作 市场,让 S1的数量加1,表示 市场 可被下一个进程使用

总结

信号量初值:一般是 共享资源的数量,通常 为0

先执行 V操作,释放资源,目的是让可用资源 数量+1
再执行 P操作,申请资源

题1

思考:2台打印机3个进程要互斥使用打印机。模拟整个PV过程,信号量S的初值为多少?取值范围是多少?

初值:资源数量,即 S = 2

进程1访问打印机时:S = 2 - 1 = 1
进程2访问打印机时:S = 1 - 1 = 0
进程3访问打印机时:S = 0 - 1 = -1

题2

假设铁路自动售票系统有n个售票终端,该系统为每个售票终端创建一个进程Pi(i=1,2,…,n)管理车票销售过程。假设Tj(j=1,2,…,m)单元存放某日某趟车的车票剩余票数,Temp为Pi进程的临时工作单元,x为某用户的购票张数。Pi进程的工作
流程如下图所示,用P操作和V操作实现进程间的同步与互斤。

初始化时系统应将信号量S赋值为()

图中(a)、(b)和(c)处应分别填入()。

A、n-1B、0C、1D、2
A、V(S)、P(S)和P(S)B、P(S)、P(S)和V(S)
C、V(S)、V(S)和P(S)D、P(S)、V(S)和V(S)

参考:
https://blog.csdn.net/m0_48241022/article/details/142315009


原文出处:/show_1GWsNyn2qpE.html