文档介绍:该【操作系统哲学家问题实验报告 】是由【文艺人生】上传分享,文档一共【21】页,该文档可以免费在线阅读,需要了解更多关于【操作系统哲学家问题实验报告 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。操作系统哲学家问题实验报告
2/21
实验报告三
实验名称:一、调试验证“有限缓冲”经典同步问题
二、利用Java同步解决“哲学家进餐”问题
日期:2015-11-5班级:13级计科学号:姓名:
实验目的
了解信号量的使用
掌握正确使用同步机制的方法
实现生产者消费者进程的互斥与同步
实现java同步解决“哲学家进餐”问题
实验内容
调试验证“有限缓冲”经典同步问题
利用Java同步解决“哲学家进餐”问题
项目要求与分析
“有限缓冲”经典同步问题
问题描述
有一群生产者进程在生产产品,此产品提供给消费者去消费。为使生产者和消费者进程能并发执行,在它们之间设置一个具有n个缓冲池,生产者进程可将它所生产的产品放入一个缓冲池中,消费者进程可从一个缓冲区取得一个产品消费。
问题分析
设两个同步信号量:一个说明空缓冲区的数目,用empty表示,初值为有界缓
3/21
的筷子,而看到右侧筷子都不可用,又都放下左侧筷子,等一会儿,又同时拿起左侧筷子……如此永远重复下去。对于这种情况,所有的程序都在运行,但却都无法取得进展,即出现饿死,所有的哲学家都吃不上饭。
解决死锁问题:为了避免死锁,把哲学家分为三种状态:思考,饥饿(等待),进食,并且一次拿起两只筷子,否则不拿。
具体实现
1.“有限缓冲”经典同步问题。
具体实现代码
//缓冲区实现
publicclassBoundeBufferimplementsBuffer
{
privatestaticfinalintBUFFER_SIZE=5;
privateObject[]buffer;
privateintin,out;
privateSemaphoremutex;
4/21
privateSemaphoreempty;
privateSemaphorefull;
publicBoundeBuffer()
{
in=0;
out=0;
buffer=newObject[BUFFER_SIZE];
mutex=newSemaphore(1);
empty=newSemaphore(BUFFER_SIZE);
full=newSemaphore(0);
}
publicvoidinsert(Objectitem)
{
try
{
();
5/21
();
buffer[in]=item;
in=(in+1)%BUFFER_SIZE;
();
();
}catch(InterruptedExceptione)
{();}
}
publicObjectremove()
{
try{
();
();
}catch(InterruptedExceptione)
{
();
}
6/21
Objectitem=buffer[out];
out=(out+1)%BUFFER_SIZE;
();
();
returnitem;
}
//生产者实现
publicclassProducerimplementsRunnable
{
privateBufferbuffer;
publicProducer(Bufferbuffer)
{
=buffer;
}
publicvoidrun()
{
Datemessage;
7/21
while(true)
{
();
message=newDate();
("生产者产生了"+message);
(message);
}
}
}
//消费者实现
publicclassConsumerimplementsRunnable
{
privateBufferbuffer;
publicConsumer(Buffer
8/21
buffer)
{
=buffer;
}
publicvoidrun()
{
Datemessage;
while(true)
{
();
message=(Date)();
("消费者者消费了"+message);
//工厂测试类
publicclassFactory
9/21
{
publicstaticvoidmain(String[]args)
{
Bufferbuffer=newBoundeBuffer();
Threadproducer=newThread(newProducer(buffer));
Threadconsumer=newThread(newConsumer(buffer));
();
();
}
运行结果:
10/21