山东大学操作系统实验报告4进程同步实验.docx

上传人:b****3 文档编号:1075956 上传时间:2022-10-16 格式:DOCX 页数:21 大小:439.31KB
下载 相关 举报
山东大学操作系统实验报告4进程同步实验.docx_第1页
第1页 / 共21页
山东大学操作系统实验报告4进程同步实验.docx_第2页
第2页 / 共21页
山东大学操作系统实验报告4进程同步实验.docx_第3页
第3页 / 共21页
山东大学操作系统实验报告4进程同步实验.docx_第4页
第4页 / 共21页
山东大学操作系统实验报告4进程同步实验.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

山东大学操作系统实验报告4进程同步实验.docx

《山东大学操作系统实验报告4进程同步实验.docx》由会员分享,可在线阅读,更多相关《山东大学操作系统实验报告4进程同步实验.docx(21页珍藏版)》请在冰豆网上搜索。

山东大学操作系统实验报告4进程同步实验.docx

山东大学操作系统实验报告4进程同步实验

山东大学操作系统实验报告4进程同步实验

计算机科学与技术学院实验报告

实验题目:

实验四、进程同步实验学号:

日期:

20120409班级:

计基地12姓名:

实验目的

加深对并发协作进程同步与互斥概念的理解,观察和体验并发进程同步与互

操作的效果,分析与研究经典进程同步与互斥问题的实际解决方案了Linux

系统IPC进程同步工具的用法,练习并发协作进程的同步与互斥操作的编与调试技术

实验内容

抽烟者问题假设一个系统中有三个抽烟者进程每个抽烟者不断地卷烟并抽烟抽烟者卷起并抽掉一颗烟需要有三种材料烟草纸和胶水一个抽烟者有烟草一个有纸,另一个有胶水。

系统中还有两个供应者进程,它们无限地供应所有种材料但每次仅轮流提供三种材料中的两种。

得到缺失的两种材料的抽烟者卷起并抽掉一颗烟后会发信号通知供应者让它继续提供另外的两种材料。

这过程重复进行请用以上介绍IPC同步机制编程实现该问题要求的功能

硬件环境@CPUi3-2350MIntel?

Cor42.30GHz

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]=='A'){

printf(%dTheconsumerhasglue.\nTheconsumergets

tobaccoandpaper\n,getpid());

}

if(buff_ptr[0]=='B'){

printf(%dTheconsumerhaspaper.\nTheconsumergets

tobaccoandglue\n,getpid());

}

if(buff_ptr[0]=='C'){

printf(%dTheconsumerhastobacco.\nTheconsumergets

glueandpaper\n,getpid());

}

*cget_ptr=(*cget_ptr+1);

if(*cget_ptr%2==0)

buff_ptr[0]='D';

else

buff_ptr[0]='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;

buff_ptr=(char*)set_shm(buff_h,buff_number,shm_flg);

pput_ptr=(int*)set_shm(pput_h,pput_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;

pmtx_sem=set_sem(pmtx_h,sem_val,sem_flg);

if(producerid==0){

buff_ptr[0]='D';

*pput_ptr=0;

}

while

(1){

if(buff_ptr[0]-'D'==producerid){

down(prod_sem);

down(pmtx_sem);

*pput_ptr=(*pput_ptr+1)%3;

if(*pput_ptr==0){

buff_ptr[0]='A';

printf(%dTheproducergivestobaccoand

paper\n,getpid());

}

if(*pput_ptr==1){

buff_ptr[0]='B';

printf(%dTheproducergivestobaccoand

glue\n,getpid());

}

if(*pput_ptr==2){

buff_ptr[0]='C';

printf(%dTheproducergivesglueandpaper\n,getpid());

}

sleep(rate);

up(pmtx_sem);

up(cons_sem);

}

}

returnEXIT_SUCCESS;

}

Ipc.

#includeipc.h

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;

fgets(line,BUFSZ,pf);

while(line[m]=='')

m++;

while(line[m]!

='')

colum[n++]=line[m++];

colum[n]='\0';

if(atoi(colum)!

=h)

continue;

n=0;

while(line[m]=='')

m++;

while(line[m]!

='')

colum[n++]=line[m++];

colum[n]='\0';

m=atoi(colum);

fclose(pf);

returnm;

}

fclose(pf);

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);

}

returnEXIT_SUCCESS;

}

intup(intsem_id){

structsembufbuf;

buf.sem_op=1;

buf.sem_number=0;

buf.sem_flg=SEM_UNDO;

if((semop(sem_id,&buf,1))<0){

perror(%uperror);

exit(EXIT_FAILURE);

}

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);

exit(EXIT_FAILURE);

}

sem_arg.val=sem_val;

if(semctl(sem_id,0,SETVAL,sem_arg)<0){

perror(semaphoreseterror);

exit(EXIT_FAILURE);

}

}

retu

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1