1、
5 个作业 A~E 同时到达一个单 CPU 系统,且以 A~E 的顺序进入就绪队列。估计运行
时间分别为 10,6,2,4 和 8 分钟,优先级分别为 3,5,2,1 和 4(其中 5 为最高优先级)。
假设它们都是纯计算型作业,系统开销时间忽略不计。对下面的调度算法,计算平均周转
时间。
1)优先级调度。
2)短作业优先。
3)时间片为 1 分钟的轮转法。
答:评分标准:每个 3 分。
- 优先级调度:调度顺序 BEACD,平均周转时间=20 分钟。
- 短作业优先:调度顺序 CDBEA,平均周转时间=14 分钟。
- 时间片为 1 分钟的轮转法:周转时间 C-8,D-17,B-23,E-28,A-30。平
均周转时间=21.2 分钟。
周转时间是指作业从提交到完成所经历的时间。
1)优先级调度:
优先级从高到低:B(5),E(4),A(3),C(2),D(1)
计算周转时间:
B 的周转时间 = B 的运行时间 = 6 分钟
E 的周转时间 = B 的运行时间 + E 的运行时间 = 6 + 8 = 14 分钟
以此类推
A 24
C 26
D 30
平均周转时间=100/5=20分钟
2)短作业优先:
即 C(2),D(4),B(6),E(8),A(10)。
计算周转时间:
C 的周转时间 = C 的运行时间 = 2 分钟
D 的周转时间 = C 的运行时间 + D 的运行时间 = 2 + 4 = 6 分钟
以此类推
平均周转时间=70/5=14分钟
3)时间片为 1 分钟的轮转法:
按照时间片轮转,每个作业先运行 1 分钟,直到完成或时间片用完。
计算周转时间:
C 第二轮完成,周转时间 = 8 分钟
D 剩下四个作业,17分钟
B 剩下三个作业,23分钟
E 28分钟
A 30分钟
平均周转时间=106/5=21.2分钟
2、
不死锁的哲学家进餐问题。五支叉子放在五位哲学家之间,进餐前哲学家必须先拿起左边叉子,再拿起右边叉子,吃完后放下两支叉子。为防止死锁,只允许四位哲学家同时拿起一支或两支叉子。用信号量方法实现此不死锁的哲学家进餐问题。
答:设信号量:评分标准:每个信号量 1.5 分,共 3 分
semaphore fork[5] = {1};//每把叉子就是一个临界资源。
semaphore room = {4};//至多允许四人同时拿起叉子
int i;
void philosopher (int i)
{
while (true) {
think();
wait (room); 评分标准:每个 wait(), signal() 1 分,共 6 分
wait (fork[i]);
wait (fork [(i+1) mod 5]);
eat();
signal (fork [(i+1) mod 5]);
signal (fork[i]);
signal (room);
}
}
semaphore fork[5] = {1};: 定义了一个数组,其中每个元素都是一个信号量,表示一把叉子。初始值都是1,表示每把叉子都是可用的。
semaphore room = {4};: 这是另一个信号量,用于控制同时拿起叉子的哲学家数量。初始值为4,意味着最多可以有4个哲学家同时拿起叉子(因为第五个哲学家需要两把叉子,所以同时只能有4个哲学家拿起叉子)。
void philosopher (int i): 这是一个函数,表示第i个哲学家的行为。
while (true): 哲学家不断地重复思考和吃饭的过程。
think();: 哲学家在思考。
wait (room);: 哲学家等待有足够的叉子可用。如果room的值大于0,则room减1,哲学家可以进入;否则,哲学家需要等待。
wait (fork[i]); 和 wait (fork [(i+1) mod 5]);: 哲学家等待他左边和右边的叉子。只有当两把叉子都可用时(即信号量的值大于0),哲学家才能拿起它们并开始吃饭。
eat();: 哲学家在吃饭。
signal (fork [(i+1) mod 5]); 和 signal (fork[i]);: 哲学家吃完饭后,释放他左边和右边的叉子。这通过增加相应信号量的值来实现。
signal (room);: 哲学家释放了一个"房间"的位置,允许其他哲学家进入。