山东大学操作系统实验报告4进程同步实验Word格式.docx
《山东大学操作系统实验报告4进程同步实验Word格式.docx》由会员分享,可在线阅读,更多相关《山东大学操作系统实验报告4进程同步实验Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
MobileIntel?
Sandybridgex86/MMX/SSE2
4G
内存3操作系统:
20.1GB
磁盘:
软件环境:
ubuntu13.04
实验步骤:
(1)新建定义了producer和consumer共用的文件。
ipc.h函数原型和变量的IPC.
(2)新建ipc.c文件,编写producer和consumer共用的IPC的具体相应函数。
(3)新建Producer文件,首先定义producer
的一些行为,利用系统调用建立共享内存区域,设定其长度并获取共享内存的首地址。
然后设定生产者互斥与同步的信号灯,并为他们设置相应的初值。
当有生产者进程在运行而其他生产者请求时,相应的信号灯就会阻止他,当共享内存区域已满时,信号等也会提示生产者不能再往共享内存中放入内容。
(4)新建Consumer文件,定义consumer的一些行为,利用系统调用来创建共享内存区域,并设定他的长度并获取共享内存的首地址。
然后设定消费者互斥与同步的信号灯,并为他们设置相应的初值。
当有消费进程在运行而其他消费者请求时,相应的信号灯就会阻止它,当共享内存区域已空时,信号等也会提示生产者不能再从共享内存中取出相应的内容。
运行的消费者应该与相应的生产者对应起来,只有这样运行结果才会正确。
结论分析与体会:
实现方式:
Consumer:
#includeipc.h
intmain(intargc,char*argv[]){
intrate=3;
intconsumerid=atoi(argv[1]);
buff_h=101;
buff_number=1;
cget_h=103;
cget_number=1;
shm_flg=IPC_CREAT|0644;
buff_ptr=(char*)set_shm(buff_h,buff_number,shm_flg);
cget_ptr=(int*)set_shm(cget_h,cget_number,shm_flg);
prod_h=201;
pmtx_h=202;
cons_h=301;
cmtx_h=302;
sem_flg=IPC_CREAT|0644;
sem_val=buff_number;
prod_sem=set_sem(prod_h,sem_val,sem_flg);
sem_val=0;
cons_sem=set_sem(cons_h,sem_val,sem_flg);
sem_val=1;
cmtx_sem=set_sem(cmtx_h,sem_val,sem_flg);
if(consumerid==0)
*cget_ptr=0;
while
(1){
if(buff_ptr[0]-'
A'
==consumerid){
down(cons_sem);
down(cmtx_sem);
sleep(rate);
if(buff_ptr[0]=='
){
printf(%dTheconsumerhasglue.\nTheconsumergets
tobaccoandpaper\n,getpid());
}
B'
printf(%dTheconsumerhaspaper.\nTheconsumergets
tobaccoandglue\n,getpid());
C'
printf(%dTheconsumerhastobacco.\nTheconsumergets
glueandpaper\n,getpid());
*cget_ptr=(*cget_ptr+1);
if(*cget_ptr%2==0)
buff_ptr[0]='
D'
;
else
E'
up(cmtx_sem);
up(prod_sem);
}
returnEXIT_SUCCESS;
Produce
#includeipc.h
intmain(intargc,char*argv[]){
intrate=3;
intproducerid=atoi(argv[1]);
buff_h=101;
buff_number=1;
pput_h=102;
pput_number=1;
shm_flg=IPC_CREAT|0644;
pput_ptr=(int*)set_shm(pput_h,pput_number,shm_flg);
cons_h=301;
cmtx_h=302;
sem_flg=IPC_CREAT|0644;
sem_val=buff_number;
prod_sem=set_sem(prod_h,sem_val,sem_flg);
sem_val=0;
cons_sem=set_sem(cons_h,sem_val,sem_flg);
sem_val=1;
pmtx_sem=set_sem(pmtx_h,sem_val,sem_flg);
if(producerid==0){
*pput_ptr=0;
while
(1){
if(buff_ptr[0]-'
==producerid){
down(prod_sem);
down(pmtx_sem);
*pput_ptr=(*pput_ptr+1)%3;
if(*pput_ptr==0){
buff_ptr[0]='
printf(%dTheproducergivestobaccoand
paper\n,getpid());
if(*pput_ptr==1){
glue\n,getpid());
if(*pput_ptr==2){
printf(%dTheproducergivesglueandpaper\n,getpid());
sleep(rate);
up(pmtx_sem);
up(cons_sem);
}
Ipc.
intget_ipc_id(char*proc_file,h_th){
FILE*pf;
intm,n;
charline[BUFSZ],colum[BUFSZ];
if((pf=fopen(proc_file,
))==NULL){
perror(Procfilenotopen);
exit(EXIT_FAILURE);
fgets(line,BUFSZ,pf);
while(!
feof(pf)){
m=n=0;
while(line[m]=='
'
)
m++;
while(line[m]!
='
colum[n++]=line[m++];
colum[n]='
\0'
if(atoi(colum)!
=h)
continue;
n=0;
while(line[m]=='
)
while(line[m]!
colum[n++]=line[m++];
colum[n]='
m=atoi(colum);
fclose(pf);
returnm;
return-1;
intdown(intsem_id){
structsembufbuf;
buf.sem_op=-1;
buf.sem_number=0;
buf.sem_flg=SEM_UNDO;
if((semop(sem_id,&
buf,1))<
0){
perror(downerror);
exit(EXIT_FAILURE);
intup(intsem_id){
structsembufbuf;
buf.sem_op=1;
buf.sem_number=0;
buf.sem_flg=SEM_UNDO;
if((semop(sem_id,&
perror(%uperror);
returnEXIT_SUCCESS;
intset_sem(h_tsem_h,intsem_val,intsem_flg){
intsem_id;
Sem_unssem_arg;
if((sem_id=get_ipc_id(\/proc/sysvipc/sem,sem_h))<
0){
if((sem_id=semget(sem_h,1,sem_flg))<
0){
perror(semaphorecreateerror);
sem_arg.val=sem_val;
if(semctl(sem_id,0,SETVAL,sem_arg)<
0){
perror(semaphoreseterror);
retu