软考-软件设计师:信号量机制、PV操作实现进程的互斥和同步 作者:马育民 • 2025-04-03 07:49 • 阅读:10005 # 临界资源 把 **一个时间段内只允许一个进程使用** 的资源称为临界资源。 如:许多物理设备(比如摄像头、打印机)都属于临界资源。此外还有许多变量、数据、内存缓冲区等都属于临界资源。 # 临界区 访问临界资源的那段代码 # 进程的互斥 进程 **并发** **执行** 时,需要访问 **临界资源**,这些进程是 **互斥的** 如:多个进程并行时,需要使用 **打印机**,像 **打印机** 这类 物理设备,同一时间段内 **只允许一个进程访问**。那这些进程就是互斥的 ### 互斥访问过程 1. 当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须 **等待**。 2. 当前访问临界资源的进程访问结束,**释放** 该资源之后,另一个进程才能去访问临界资源。 # 进程的同步 进程 **并发** **执行** 时,有速度上的差异,在一定情况下停下等待,不存在资源是否单独或共享的问题 用于 **生产者-消费者** 模式,如:食堂出餐速度慢,学生打饭多,学生需要等待食堂出餐,这两个进程是同步关系 # 信号量 是操作系统用来解决 **进程并发** 中的 **互斥** 和 **同步** 问题的一种方法 信号量一般用 `S` 表示,是一个整数变量 当 `S>=0` 表示 **资源可用数** 当 `S<0` 则其绝对值表示 **排队进程数** # PV操作 P操作:申请资源 V操作:表示释放一个资源 # 进程互斥-PV操作 [](https://www.malaoshi.top/upload/0/0/1GWsOgNqjrz.png) > 提示: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操作 [](https://www.malaoshi.top/upload/0/0/1GWsPQ3L2iQ.png) `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操作实现进程间的同步与互斤。 [](https://www.malaoshi.top/upload/0/0/1GWsQXdHr5z.png) 初始化时系统应将信号量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 原文出处:http://malaoshi.top/show_1GWsNyn2qpE.html