文档介绍:2021年操作系统哲学家问题实验报告
2021年操作系统哲学家问题实验报告
1 / 12
2021年操作系统哲学家问题实验报告
试验汇报三
试验名称: 一、 调试验证“有限缓冲”经典同时问题
二、 利用Java同时处理“哲学家进餐”问题
日期: -11-5 班级: 13级计科 学号: 姓名:
试验目
了解信号量使用
掌握正确使用同时机制方法
实现生产者消费者进程互斥与同时
实现java同时处理“哲学家进餐”问题
试验内容
调试验证“有限缓冲”经典同时问题
利用Java同时处理“哲学家进餐”问题
项目要求与分析
“有限缓冲”经典同时问题
问题描述
有一群生产者进程在生产产品, 此产品提供给消费者去消费。为使生产者和消费者进程能并发实施, 在它们之间设置一个含有n个缓冲池, 生产者进程可将它所生产产品放入一个缓冲池中, 消费者进程可从一个缓冲区取得一个产品消费。
问题分析
设两个同时信号量:一个说明空缓冲区数目, 用empty表示, 初值为有界缓冲区大小N, 另一个说明已用缓冲区数目, 用full表示, 初值为0。因为 在实施生产活动和消费活动中要对有界缓冲区进行操作。有界缓冲区是一个临界资源, 必需互斥使用, 所以另外还需要设置一个互斥信号量mutex, 其初值为1。
“哲学家进餐”问题
2021年操作系统哲学家问题实验报告
2021年操作系统哲学家问题实验报告
2 / 12
2021年操作系统哲学家问题实验报告
问题描述
假如全部哲学家都同时拿起左侧筷子, 看到右侧筷子不可用, 又都放下左侧筷子, 等一会儿, 又同时拿起左侧筷子, 如此这般, 永远反复。对于这种情况, 即全部程序都在无限制地运行, 不过都无法得到任何进展, 即出现饿死, 全部哲学家都吃不上饭。
要求在拿起左侧筷子后, 先检验右面筷子是否可用。假如不可用, 则放下左侧筷子, 等一段时间后再反复整个过程。
问题分析
当出现以下情形, 在某一瞬间, 全部哲学家都同时启用这个算法, 拿起左侧筷子, 而看到右侧筷子都不可用, 又都放下左侧筷子, 等一会儿, 又同时拿起左侧筷子……如此永远反复下去。对于这种情况, 全部程序都在运行, 但却都无法取得进展, 即出现饿死, 全部哲学家都吃不上饭。
处理死锁问题: 为了避免死锁, 把哲学家分为三种状态: 思索, 饥饿(等候), 进食, 而且一次拿起两只筷子, 不然不拿。
具体实现
1.“有限缓冲”经典同时问题。
具体实现代码
//缓冲区实现
public class BoundeBuffer implements Buffer
{
private static final int BUFFER_SIZE=5;
private Object[] buffer;
private int in,out;
private Semaphore mutex;
private Semaphore empty;
private Semaphore full;
2021年操作系统哲学家问题实验报告
2021年操作系统哲学家问题实验报告
3 / 12
2021年操作系统哲学家问题实验报告
public BoundeBuffer()
{
in=0;
out=0;
buffer=new Object[BUFFER_SIZE];
mutex=new Semaphore(1);
empty=new Semaphore(BUFFER_SIZE);
full=new Semaphore(0);
}
public void insert(Object item)
{
try
{
();
();
buffer[in]=item;
in=(in+1)%BUFFER_SIZE;
();
();
}catch(InterruptedException e)
{();}
}
public Object remove()
{
2021年操作系统哲学家问题实验报告
2021年操作系统哲学家问题实验报告
4 / 12
2021年操作系统哲学家问题实验报告
try {
();
();
} catch (Interrup