操作系统课程设计Word下载.docx
《操作系统课程设计Word下载.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
子进程不断地从管道中读取字符,转换为大写字母后输出到标准输出设备上。
当读到x时,结束。
2信号量实现的同步互斥机制编制一个程序,程序中创建5个子进程,代表五位哲学家,然后父进程结束。
使用信号量机制解决哲学家进餐问题。
当哲学家进餐时,屏幕输出:
进程号eating!
当哲学家思考时,屏幕输出:
进程号thinging!
相关的系统调用和函数:
pipe();
write();
read();
semget();
sepop();
semctl();
要求:
查找并阅读上述系统调用的相关资料,将上述相关的函数封装为P()、V()操作,使用你封装的P()、V()操作实现5位哲学家的同步和互斥。
二二设计的基本概念和原理设计的基本概念和原理1.进程的管道通讯进程的管道通讯管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。
命名管道(NamedPipes)是在管道服务器和一台或多台管道客户机之间进行单向或双向通信的一种命名的管道。
一个命名管道的所有实例共享同一个管道名,但是每一个实例均拥有独立的缓存与句柄,并且为客户服务通信提供有一个分离的管道。
实例的使用保证了多个管道客户能够在同一时间使用同一个命名管道。
2.信号量实现的同步互斥机制信号量实现的同步互斥机制规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;
而偶数号的哲学家则相反.按此规定,将是1,2号哲学家竞争1号筷子,3,4号哲学家竞争3号筷子.即五个哲学家都竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有一个哲学家能获得两支筷子而进餐。
而申请不到的哲学家进入阻塞等待队列,根FIFO原则,则先申请的哲学家会较先可以吃饭,因此不会出现饿死的哲学家。
三三总体设计总体设计1.实现的方法和主要技术路线实现的方法和主要技术路线1.无名管道无名管道用于具有亲缘关系的父子进程,子子进程之间的通讯。
它的实现函数有intpipe(intfd2);
/fd2为描述符数组,包含一个读描述符与一个写描述符,在使用管道通信时,关闭某些不需要的读或写描述符,建立起单向的读或写管道,然后用read和write像操作文件一样去操作它即可。
如图便是进程1到进程2的一个读管道。
分别在父进程和父子进程里向管道写数据,然后在子进程和子子进程里读数据。
2.哲学家进餐伪码:
semaphorechopstick5=1,1,1,1,1;
voidphilosopher(inti)while(true)think();
if(i%2=0)/偶数哲学家,先右后左。
wait(chopsticki+1mod5);
wait(chopsticki);
eat();
signal(chopsticki+1mod5);
signal(chopsticki);
Else/奇数哲学家,先左后右。
四四详细设计详细设计进程的管道通信代码:
importjava.io.IOException;
importjava.io.PipedReader;
publicclassReceiverThread1extendsThreadPipedReaderpipedReader;
publicReceiverThread1(SenderThread1sender)throwsIOExceptionpipedReader=newPipedReader(sender.getPipedWriter();
publicvoidrun()charch=newchar100;
StringBuffersb=null;
Stringstr=null;
inti=0;
trywhile(i=pipedReader.read(ch)!
=-1)sb=newStringBuffer();
for(intj=0;
ji;
j+)sb.append(chj);
str=sb.toString();
System.out.println(子进程读取的字符为:
+str.toUpperCase();
if(!
str.endsWith(x)System.out.print(父进程读入字符为:
);
elseif(str.endsWith(x)System.out.println(结束无法再次输入字符);
catch(IOExceptione)e.printStackTrace();
finallytrypipedReader.close();
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.io.PipedWriter;
publicclassSenderThread1extendsThreadPipedWriterpipedWriter;
publicSenderThread1()pipedWriter=newPipedWriter();
publicPipedWritergetPipedWriter()returnpipedWriter;
publicvoidrun()BufferedReaderir=newBufferedReader(newInputStreamReader(System.in);
charch=newchar100;
System.out.print(父进程读入字符为:
trywhile(i=ir.read(ch)!
j=a&
chj0)/没完成的话剩余时间减少eattime-;
if(eattime=0)/完成的话归还筷子*left=true;
*right=true;
returntrue;
elsereturnfalse;
voidinit(intnum,intmax)/初始化哲学家,指定他们使用的筷子eattime=0;
left=&
chopnum;
if(nummax-1)right=&
chopnum+1;
elseright=&
chop0;
voidmain()system(title哲学家进餐问题);
intin,i,temp,time,j=1;
queueQ;
phP100;
for(inti=0;
i5;
i+)chopi=1;
i+)Pi.init(i,5);
cout输入哲学家进餐队列:
endl;
while(true)cout输入队列第j+个:
(输入0结束)in;
if(in=0)break;
elseif(in5)cout一共只有5个人!
elseQ.push(in-1);
cout每个人吃饭时间:
time;
system(CLS);
system(color0a);
while(!
Q.empty()temp=Q.front();
Q.pop();
if(Ptemp.check()Ptemp.eat(time);
couttemp+1号哲学家eating,他用的筷子号为temp+15)cout1endl;
elsecouttemp+2endl;
elseQ.push(temp);
for(i=0;
i+)if(Pi.finish()couti+1号哲学家吃完了endl;
/Q.push(-1);
iQ.size();
i+)temp=Q.front();
/if(temp!
=-1)couttemp+1哲学家正在思考endl;
Q.push(temp);
/else/Q.pop();
break;
jtime;
j+)for(i=0;
getch();