2025秋《操作系统原理》期末复习

第4章 进程与进程管理

生产者——消费者问题。一般是设empty=缓冲区大小,full=0,mutex=1保护临界资源。对于生产者,用前p(empty)检查是否有空位,用时mutex保护,用后v(full)表示占位;对于消费者,用前p(full)检查是否有可取资源,用时mutex保护,用后v(empty)表示取完。也可理解为生产者到消费者的过程是关于full的同步进程,消费者到生产者的过程是关于empty的同步进程。若有双缓冲区,则形如copy的中间进程一般把一个缓冲区的取操作和另一个缓冲区的写操作前后分开,同时保证了顺序性。
长凳使用问题。设计一个count=可用大小,需要用一个mutex保护之。
还没有遇到读者——写者问题、理发师问题、哲学家进餐问题等。

  1. 对于生产者——消费者问题,由于缓冲区是临界资源,读操作和写操作前后需要放一个mutex进行pv操作以保护之。但是为什么如4-15的get-copy-put问题,4-32的双缓冲区问题,答案都没有对缓冲区进行保护?

一般缓冲区容量>1时才会使用mutex保护。

  1. 对于进程同步问题,可不可以像4-31一样用两次相同的p或v(s1)而不需要形如4-13的两次p或v(s12)、v(s13)?

可以,4-31做了演示。

  1. 形如4-29的长凳使用问题,此处设计了一个count=可用大小,需要用一个mutex保护之。什么时候用empty和full,什么时候用count?生产者——消费者问题的mutex保护的是谁,长凳使用问题的mutex保护的又是谁?为什么这里的count没有进行p操作和v操作?

对于长凳使用问题,没位置立刻离开而不能阻塞等待,故选择用count记录剩余座位,mutex保护对count的检查与修改,因为count不是信号量,故不具备原子阻塞、等待队列、唤醒机制,不能进行p操作和v操作。对于生产者——消费者问题,需要阻塞等待。

  1. semaphore和int有何区别?

count-- 不是原子操作,不会让进程阻塞/唤醒,不能表达同步关系;semaphore内部有一个整数值,但配套了p操作和v操作的原子性、等待队列与唤醒机制,是操作系统提供的同步原语。

  1. 4-34停车场问题答案疑有误。

设三个信号量:
spaces = N:空车位数(可进的名额)
cars = 0:已停车辆数(可出的名额)
lane = 1:通道互斥(一次只能一辆车通过)
进车进程 in()
in() {
while(1){
P(spaces); // 等车位
P(lane); // 独占通道
开车进入停车场;
V(lane); // 释放通道
V(cars); // 车数量+1,允许出车
}
}
出车进程 out()
out() {
while(1){
P(cars); // 等有车可出
P(lane); // 独占通道
开车离开停车场;
V(lane); // 释放通道
V(spaces); // 车位+1,允许进车
}
}

posted on 2026-01-09 17:27  汐寻  阅读(3)  评论(0)    收藏  举报