文章

267

粉丝

1101

获赞

1683

访问

136w

头像
【2019年】408计算机统考真题模拟考试 - 第43题答案笔记
操作系统
发布于2025年5月15日 13:58
阅读数 73

计算机考研408统考历年真题及答案解析

方法一
综合考虑碗的数量m和最大可进餐名额数量n-1,限制碗的数量为 min{m, n-1},得到新的最大可进餐名额数量。
伪代码如下:
semaphore bowls = min(n-1, m);    // 可用碗数量即可进餐名额数量
semaphore chopsticks[n];   // 所有筷子资源的信号量
for (int i=0; i<n; i++) {
    chopsticks[i] = 1;
}
CoBegin
Process 哲学家i() {
    while (true) {
        思考;
        P(bowls);
        P(chopsticks[i]);    // 取左边筷子
        P(chopsticks[(i+1)%n]);    // 取右边筷子
        进餐;
        V(chopsticks[i]);    // 放回左边筷子
        V(chopsticks[(i+1)%n]);    // 放回右边筷子
        V(bowls);
    }
}
CoEnd

方法二
仅当哲学家的左、右两只筷子和碗均可用时,才允许他拿起筷子进餐。
这里需要引入互斥信号量,保证进餐请求能够按照顺序执行,根据银行家算法,对于任意一个请求序列,均存在安全序列,不会产生死锁。
这里拿左、右两只筷子和碗的顺序不会影响结果的正确性。
semaphore bowls = m;    // 所有碗资源的信号量
semaphore mutex = 1;   // 保证每个时刻只有一个哲学家取筷子的互斥信号...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发