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

  • 格式:doc
  • 大小:480.00 KB
  • 文档页数:13

下载文档原格式

  / 13
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

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

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

日期:20120409 班级:计基地12 姓名:

实验目的:

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

操作的效果,分析与研究经典进程同步与互斥问题的实际解决方案。了解 Linux 系统中 IPC 进程同步工具的用法,练习并发协作进程的同步与互斥操作的编程与调试技术。

实验内容:

抽烟者问题。假设一个系统中有三个抽烟者进程,每个抽烟者不断地卷烟并抽烟。抽烟者卷起并抽掉一颗烟需要有三种材料:烟草、纸和胶水。一个抽烟者有烟草,一个有纸,另一个有胶水。系统中还有两个供应者进程,它们无限地供应所有三种材料,但每次仅轮流提供三种材料中的两种。得到缺失的两种材料的抽烟者在卷起并抽掉一颗烟后会发信号通知供应者,让它继续提供另外的两种材料。这一过程重复进行。请用以上介绍的 IPC 同步机制编程,实现该问题要求的功能。

硬件环境:

处理器:Intel® Core™i3-2350M CPU @ 2.30GHz ×4

图形:Intel® Sandybridge Mobile x86/MMX/SSE2

内存:4G

操作系统:32位

磁盘:20.1 GB

软件环境:

ubuntu13.04

实验步骤:

(1)新建定义了producer和consumer共用的IPC函数原型和变量的ipc.h文件。

(2)新建ipc.c文件,编写producer和consumer 共用的IPC的具体相应函数。

(3)新建Producer文件,首先定义producer

的一些行为,利用系统调用,建立共享内存区域,设定其长度并获取共享内存的首地址。然后设定生产者互斥与同步的信号灯,并为他们设置相应的初值。当有生产者进程在运行而其他生产者请求时,相应的信号灯就会阻止他,当共享内存区域已满时,信号等也会提示生产者不能再往共享内存中放入内容。

(4)新建Consumer文件,定义consumer的一些行为,利用系统调用来创建共享内存区域,并设定他的长度并获取共享内存的首地址。然后设定消费者互斥与同步的信号灯,并为他们设置相应的初值。当有消费进程在运行而其他消费者请求时,相应的信号灯就会阻止它,当共享内存区域已空时,信号等也会提示生产者不能再从共享内存中取出相应的内容。

运行的消费者应该与相应的生产者对应起来,只有这样运行结果才会正确。

结论分析与体会:

实现方式:

Consumer:

#include "ipc.h"

int main(int argc,char *argv[]) {

int rate = 3;

int consumerid=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("%d The consumer has glue.\nThe consumer gets tobacco and paper\n",getpid());

}

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

printf("%d The consumer has paper.\nThe consumer gets tobacco and glue\n",getpid());

}

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

printf("%d The consumer has tobacco.\nThe consumer gets glue and paper\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);

}

}

return EXIT_SUCCESS;

}

Producer:

#include "ipc.h"

int main(int argc,char *argv[]){

int rate=3;

int producerid=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;