操作系统哲学家进餐实验Word格式.docx
- 文档编号:6656310
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:14
- 大小:645.72KB
操作系统哲学家进餐实验Word格式.docx
《操作系统哲学家进餐实验Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统哲学家进餐实验Word格式.docx(14页珍藏版)》请在冰点文库上搜索。
}argument;
intmain()
{
intid;
/*Numberbywhichthesemaphoreisknownwithinaprogram*/
argument.val=0;
//新建一个信号量集合,包含一个信号量
id=semget(IPC_PRIVATE,1,0666|IPC_CREAT);
if(id<
0)
{
printf("
Unabletoobtainsemaphore.\n"
);
exit(-1);
}
//将信号量的值置为0
if(semctl(id,0,SETVAL,argument)<
Cannotsetsemaphorevalue.\n"
else
Semaphoreinitialized.\n"
}
intlock_sem(intsemid,intmember)
/*初始化sembuf结构,将指定信号量值减1。
sem_flg指明操作的执行模式,它有两个标志位:
IPC_NOWAIT(04000):
指明以非阻塞方式操作信号灯,即如果信号灯不可使用,则不等待,立即返回。
SEM_UNDO(010000):
指明内核为信号灯操作保留恢复值,当进程调用exit退出时,内核自动为该进程恢复其操作以前的信号灯值。
引进SEM_UNDO标志的作用是为了防止当进程异常退出时没有释放信号灯,而其它进程只能永远处于等待状态。
*/
structsembufsem_lock={member,-1,SEM_UNDO};
//所要执行的是P操作
intsemval;
printf("
----------------------------------inbegintogetsemaphore---------------------------------\n"
semval=semctl(semid,member,GETVAL,0);
//取得指定信号量的当前值
currentvalue=%d\n"
semval);
if(semop(semid,&
sem_lock,1)==-1)//itwillbeblockeduntilgettheaccess
Lockfailed\n"
return-1;
else
Semaphoreresourcesdecrementedbyone(locked)\n"
//取得指定信号量的当前值,核对是否减了1
semvalformember%dis%d\n"
member,semval);
-------------------------------------Hasgetsemaphore-------------------------------------\n"
return0;
共享内存的使用
五、实验结果及分析
下图为程序结果显示,每个哲学家吃两次以后结束进程。
程序过程:
0试图去吃,发现旁边没人在吃,拿起筷子吃。
1试图去吃,发现旁边有人在吃,1不能吃。
等待旁边人吃完。
2试图去吃,发现旁边没人在吃,2拿起筷子吃。
3试图去吃,发现旁边有人在吃,3不能吃。
等待旁边人吃完
4试图去吃,发现旁边有人吃,4不能吃。
0吃完,放下筷子。
4发现旁边筷子没人吃,拿起筷子去吃。
2吃完,放下筷子。
1发现旁边筷子没人用,拿起筷子去吃。
0再一次试图去吃,发现旁边有人在吃,0不能吃,等待旁边人吃完。
4吃完,放下筷子。
3发现旁边筷子没人用,拿起筷子去吃。
2再一次试图去吃,发现旁边有人在吃,2不能吃,等待旁边人吃完。
1吃完,放下筷子。
0发现旁边筷子没人用,拿起筷子去吃。
4试图再一次吃,发现旁边有人在吃,4不能吃,等待旁边人吃完。
3吃完,放下筷子。
2发现旁边筷子没人用,拿起筷子去吃。
1试图再一次吃,发现旁边有人在吃,1不能吃,等待旁边人吃完。
4发现旁边筷子没人用,拿起筷子去吃。
3试图再一次吃,发现旁边有人在吃,1不能吃,等待旁边人吃完。
程序结果分析:
开始时,五人同时试图吃,同时只有0,和2能吃,其他在等待。
当有人放下筷子时,在等待的人立即有一人可以进餐。
直到没人都吃过两次以后,子进程全部结束,父进程结束。
附录:
程序源代码
#include<
unistd.h>
sys/wait.h>
stdlib.h>
errno.h>
#defineN5//哲学家个数
#defineLEFT(i+N-1)%N
#defineRIGHT(i+1)%N
#defineTHINKING0
#defineHUNGRY1
#defineEATING2
structstate{
intbuf[N];
//用于保存哲学家状态结构
};
unionsemun{//用于semctl的参数的结构
structsemid_ds*buf;
ushort*array;
intnewshm()//新建共享内存大小为sizeof(structstate)
intshmid;
shmid=shmget(IPC_PRIVATE,sizeof(structstate),IPC_CREAT);
if(shmid==-1)
printf("
newshmerror\n"
returnshmid;
char*getshm(intshmid)//获得共享内存映射的指针
char*ptr=NULL;
ptr=shmat(shmid,(void*)0,0);
if(ptr==(void*)-1)
getshmerror"
returnptr;
voidtest(intsemid,inti,intshmid)
structstate*t=(structstate*)getshm(shmid);
if(t->
buf[i]==HUNGRY&
&
t->
buf[LEFT]!
=EATING&
buf[RIGHT]!
=EATING)
t->
buf[i]=EATING;
structsembufsop={i,1,SEM_UNDO};
semop(semid,&
sop,1);
voidtake_forks(intsemid,inti,intshmid)
%dtrytotaketheforks\n"
i);
structsembufsop={5,-1,SEM_UNDO};
//p共享内存信号量
semop(semid,&
staticstructstate*sta;
sta=(structstate*)getshm(shmid);
sta->
buf[i]=HUNGRY;
test(semid,i,shmid);
//判断是否能吃
structsembufsop1={5,1,SEM_UNDO};
//v共享内存信号量
sop1,1);
structsembufsop2={i,-1,SEM_UNDO};
//p对应哲学家信号量
sop2,1);
%dhastakentheforks\n"
voidput_forks(intsemid,inti,intshmid)
%dhasputtheforks\n"
//p共享内存信号量
buf[i]=THINKING;
test(semid,LEFT,shmid);
test(semid,RIGHT,shmid);
voidprint(inti)//打印状态函数
switch(i)
case2:
eating\n"
break;
case1:
hungry\n"
case0:
thinking\n"
structstate*sta;
intsemid,numsems=6;
intpc,pr;
inti,j;
char*shm;
staticstructstate*t;
semid=semget(IPC_PRIVATE,numsems,IPC_CREAT|0666);
//创建六个信号量,最后一个5用于互斥共享内存中的数据
if(semid<
0)
createsemaphorefailed"
exit(-1);
else{
sussesscreatesemaphore\n"
argument.val=0;
for(i=0;
i<
N;
i++)//初始化信号量0-4为0
if(semctl(semid,i,SETVAL,argument)<
{
printf("
cannotsetsemaphorevalue.\n"
//exit(-1);
}
else
Semaphoreinitialized\n"
argument.val=1;
//初始化共享内存信号量为1
if(semctl(semid,5,SETVAL,argument)<
//exit(-1);
shmid=newshm();
//初始化共享内存中哲学家状态为THINKING
i++)
sta->
for(j=0;
j<
j++)//创建子进程
pc=fork();
if(pc==0||pc==-1)//如果是子进程,跳出循环,防止子进程继续创建子进程
break;
if(pc<
error!
"
elseif(pc==0)//子进程
intz=0;
while(z<
2)//吃两次
{
t=(structstate*)getshm(shmid);
//获得共享内存中的状态
%dis"
j);
print(t->
buf[j]);
take_forks(semid,j,shmid);
sleep(3);
put_forks(semid,j,shmid);
z++;
}
pr=wait(NULL);
mainprosessexit\n"
exit(0);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 哲学家 进餐 实验