操作系统_生产者与消费者问题的实现_第1页
操作系统_生产者与消费者问题的实现_第2页
操作系统_生产者与消费者问题的实现_第3页
操作系统_生产者与消费者问题的实现_第4页
操作系统_生产者与消费者问题的实现_第5页
免费预览已结束,剩余5页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、河南师范大学计算机学院实验报告操作系统实验报告年月日学号XXX姓名XXX时间XXX专业XXX班级XXX-实验目的:通过生产者-消费者问题的模拟,加深对进程同步、共享存储器通信的理。实验内容与步骤:1 .启动LINUX操作系统,打开终端,输入命令"vis.c进入编辑页面编写程序,主要调用的函数有:<i>shmget()创建、获得一个共享存储区。<2>shmat()共享存储区的附接。从逻辑上将一个共享存储区附接到进程的虚拟地址空间上。<3>shmdt()把一个共享存储区从指定进程的虚地址空间断开。<4>shmctl()共享存储区的控制,对其

2、状态信息进行读取和修改。2 .编译原程序在终端输入命令"gcGlrts.c"若无错误再输入命令”./a.ou即运行出结果。(注:在命令"gcc-lrts.c'中,lrt选项是编译带有信号量的程序,命令”./a.out中./a.out是默认生成的原文件。)3 .实验所需程序及运行结果如下:(1)实验源程序:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/ipc.h>#incl

3、ude<sys/sem.h>#include<sys/mman.h>/提供了共享内存的相关操作#include<fcntl.h>#include<sys/stat.h>unionsemunintval;structsemid_ds*buf;unsignedshort*array;arg;生成信号量河南师范大学计算机学院实验报告intsem_creat(key_tkey,intvalue)(unionsemunsem;intsemid;sem.val=value;semid=semget(key,1,IPC_CREAT|0666);if(-1=se

4、mid)(printf("createsemaphoreerrorn");exit(-1);semctl(semid,0,SETVAL,sem);returnsemid;删除信号量voiddel_sem(intsemid)(unionsemunsem;sem.val=0;semctl(semid,0,IPC_RMID,sem);/p操作intp(intsemid)(structsembufsops=0,-1,SEM_UNDO;return(semop(semid,&sops,1);/v操作intv(intsemid)河南师范大学计算机学院实验报告(structsem

5、bufsops=0,+1,SEM_UNDO;return(semop(semid,&sops,1);intbuffer;int*pData;intvalue_read=0,value_write=0;intfull,empty;voidproducer(key_t,key_t);生产者所执行的代码voidconsumer(int,int);intmain(void)key_tkeyFull,keyEmpty;intfd;pid_tpid;void*ptr;指向共享内存的指针/*shm_open是一个POSIX函数,用来打开或创建一个与“/shm联的共享内存区*/if(fd=shm_op

6、en("/shm",O_RDWR|O_CREAT,S_IRUSR|S_IWUSR)=-1)printf("shm_openerror'n");/*出错提示*/if(ftruncate(fd,(sizeof(int)*5)=-1)/*截短共享内存的长度到我们所需要的长度*/printf("ftruncateerrorn");if(ptr=mmap(0,(sizeof(int)*5),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0)=MAP_FAILED)/*将共享内存映射到进程地址空间*/河南师范大学计

7、算机学院实验报告(printf("mmaperror");)pData=(int*)ptr;keyFull=ftok("/",0);keyEmpty=ftok("/",5);full=sem_creat(keyFull,0);empty=sem_creat(keyEmpty,5);switch(pid=fork()(case-1:/*生成子进程失败*/break;case0:/*子进程*/producer(keyFull,keyEmpty);/*子进程是生产者*/sleep(2);break;default:consumer(full

8、,empty);/*父进程是消费者*/break;)wait(0);shm_unlink("/shm");/*删除共享内存区,程序中基本上保证了子进程先退出,因此父进程中无wait操作且这部操作放在父进程这里*/shmctl(shmid,IPC_RMID,&buf);return0;/del_sem(semid);)河南师范大学计算机学院实验报告/*生产者写5次后退出*/voidproducer(key_tkeyFull,key_tkeyEmpty)(intin=0;full=semget(keyFull,1,0);empty=semget(keyEmpty,1,0

9、);while(value_write<10)/*退出条件判定*/(printf("PrepareWrite'n");printf("emptyWriteP1:%dn",semctl(empty,0,GETVAL,0);p(empty);/*是否有空缓冲区,有则占有,无则被挂起,是原子操作*/printf("emptyWriteP2:%dn",semctl(empty,0,GETVAL,0);value_write+;in=in+;pDatain=value_write;in=in%5;printf("in=%

10、dn",in);printf("Write:%5dn",pDatain);printf("fullWriteV1:%dn",semctl(full,0,GETVAL,0);v(full);/*写完一个缓冲区,释放信号量full(值加1)*/printf("fullWriteV2:%dn",semctl(full,0,GETVAL,0);printf("WriteFinish'n");/sleep(1);)/*消费者读5次后退出*/voidconsumer(intfull,intempty)河南师范

11、大学计算机学院实验报告(intout=0;while(value_read<10)/*退出条件判定*/(printf("PrepareRead'n");printf("fullReadP1:%dn",semctl(full,0,GETVAL,0);p(full);/*获取信-号量*/printf("fullReadP2:%dn",semctl(full,0,GETVAL,0);value_read+;out=out+;pDataout=value_read;out=out%5;printf("out=%dn&q

12、uot;,out);printf("Read:%5dn",pDataout);printf("emptyReadV1:%dn",semctl(empty,0,GETVAL,0);*/v(empty);/*读完一个缓冲区,释放信号量empty(值加1)printf("emptyReadV2:%dn",semctl(empty,0,GETVAL,0);printf("ReadFinish'n");)(2)实验运行结果:rootlocalhost#gcc-lrts.crootlocalhost#./a.outPr

13、epareWriteemptyWriteP1:5emptyWriteP2:4in=1Write:1fullWriteV1:0河南师范大学计算机学院实验报告fullWriteV2:1WriteFinishPrepareWriteemptyWriteP1:4emptyWriteP2:3in=2Write:2fullWriteV1:1fullWriteV2:2WriteFinishPrepareWriteemptyWriteP1:3emptyWriteP2:2in=3Write:3fullWriteV1:2fullWriteV2:3WriteFinishPrepareWriteemptyWriteP

14、1:2emptyWriteP2:1in=4Write:4fullWriteV1:3fullWriteV2:4WriteFinishPrepareReadfullReadP1:4PrepareWritefullReadP2:3out=1河南师范大学计算机学院实验报告Read:1emptyReadV1:1emptyReadV2:2ReadFinishPrepareReadfullReadP1:3fullReadP2:2out=2Read:2emptyReadV1:2emptyReadV2:3ReadFinishPrepareReadfullReadP1:2fullReadP2:1out=3Read

15、:3emptyReadV1:3emptyReadV2:4ReadFinishPrepareReadfullReadP1:1fullReadP2:0out=4Read:4emptyReadV1:4emptyReadV2:5ReadFinishPrepareReadfullReadP1:0emptyWriteP1:2河南师范大学计算机学院实验报告emptyWriteP2:4in=0Write:5fullWriteV1:0fullWriteV2:0fullReadP2:0out=0Read:5emptyReadV1:4emptyReadV2:5ReadFinishPrepareReadfullRea

16、dP1:0WriteFinishPrepareWriteemptyWriteP1:5emptyWriteP2:4in=1Write:6fullWriteV1:0fullWriteV2:0fullReadP2:0out=1Read:6emptyReadV1:4emptyReadV2:5ReadFinishPrepareReadfullReadP1:0WriteFinishPrepareWrite河南师范大学计算机学院实验报告emptyWriteP1:5emptyWriteP2:4in=2Write:7fullWriteV1:0fullWriteV2:0fullReadP2:0out=2Read:

17、7emptyReadV1:4emptyReadV2:5ReadFinishPrepareReadfullReadP1:0WriteFinishPrepareWriteemptyWriteP1:5emptyWriteP2:4in=3Write:8fullWriteV1:0fullWriteV2:0fullReadP2:0out=3Read:8emptyReadV1:4emptyReadV2:5ReadFinishPrepareReadfullReadP1:0WriteFinish河南师范大学计算机学院实验报告PrepareWriteemptyWriteP1:5emptyWriteP2:4in=4Write:9fullWriteV1:0fullWriteV2:0fullReadP2:0out=4Read:9emptyReadV1:4emptyReadV2:5ReadFinishPrepareReadfullReadP1:0WriteFinishPrepareWriteemptyWriteP1:5emptyWriteP2:4in=0Write:10fullWriteV1:0fullWriteV2:0fullReadP2:0out=0Read:10emptyReadV1:4emptyReadV2:5ReadFinishWriteFinish

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论