




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验六 信号量厦门大学软件学院吴清强一 实验目的n 加强对进程概念的理解。n 进一步了解并发执行的实质。n 分析进程争用资源的现象,学习解决进程互斥的方法n 了解Linux系统中进程通信的基本原理二相关知识n 进程的概念。n 进程与程序的区别。n 进程并发执行的概念。n 进程互斥的概念n 进程通信的基本原理三实验内容n 使用信号量实现有限缓冲区的生产者和消费者问题n 使用信号量实现读进程具有优先权的读者和写者问题四实验环境n PC + Linux Red Hat操作系统n GCC1. 使用信号量实现有限缓冲区的生产者和消费者问题一 程序流程图开 始是该缓冲区是否已上锁?是否有空缓冲区?否是对该
2、缓冲区上锁模拟生产解 锁结 束阻 塞否 生产者进程生产流程图开 始是该缓冲区是否已上锁?是否有满缓冲区?否是对该缓冲区上锁模拟消费解 锁结 束阻 塞否 消费者进程消费流程图 二 源代码1、生产者生产进程函数DWORD WINAPI Producer(LPVOID lpParameter)while(true)for(int j=0;j4;j+)if(bufferj=0)/找到空缓冲区if(lockj=false)/同步锁为false,可以进行操作lockj=true;/加锁,防止其他线程操作此缓冲区if(bufferj1)/限定一个缓冲区只能存放一个资源+bufferj;/模拟生产资源cout
3、生产一个资源,放入缓冲区j中endl;lockj=false;/解锁break;/一次生产一个if(j=3)cout找不到空缓冲区,等待中。endl;Sleep(2000);return 0;2、消费者消费进程函数DWORD WINAPI Customer(LPVOID lpParameter)while(true)for(int n=0;n=1)-buffern;/模拟消费资源cout消费一个资源,从缓冲区n中取出endl;lockn=false;/解锁break;/一次生产一个if(n=3) cout找不到满缓冲区,等待中。endl; Sleep(2000);3、主函数,创建5个进程,其中
4、3个生产者进程,2个消费者进程int main(int argc,char* argv) HANDLE handle3;DWORD dw1,dw2,dw3,dw4,dw5;/创建5个进程 handle0=CreateThread(NULL,0,Producer,NULL,0,&dw1); handle1=CreateThread(NULL,0,Producer,NULL,0,&dw2); handle2=CreateThread(NULL,0,Producer,NULL,0,&dw3); handle3=CreateThread(NULL,0,Customer,NULL,0,&dw4); ha
5、ndle4=CreateThread(NULL,0,Customer,NULL,0,&dw5);三、 试验结果3个生产者2个消费者,共享4个缓冲区,运行结果如下:1、一个生产者生产,一个消费者消费:1、 两个生产者连续生产,两个消费者连续消费:2、 多个生产者于多个消费者进行生产消费操作: 2. 使用信号量实现读进程具有优先权的读者和写者问题. 一、 程序流程图 二、 源代码#include#include#include#include#include#includeint *critical;int createSem()/创建信号量 return semget(key_t)1000,2,
6、IPC_CREAT|0600);/the second parameter in semget is the number of signal we will createvoid initSignal(int semid,int index,int value)/初始化信号量 semctl(semid,index,SETVAL,value);void make_critical () /创建缓冲区 critical=mmap(NULL,10*sizeof(int),PROT_READ| PROT_WRITE,MAP_SHARED| MAP_ANONYMOUS,-1,0); critical0
7、=-1;/the value of the critical file is init as -1 critical1=0;/the reader count is 0;void semWait(int semid,int index)/判断当前进程是否进入缓冲区,被占用就挂起 struct sembuf sem_buf; sem_buf.sem_num=index; sem_buf.sem_op=-1; sem_buf.sem_flg=SEM_UNDO; semop(semid,&sem_buf,1);void semSignal(int semid,int index)/唤醒一个在阻塞队列
8、中等待的进程 struct sembuf sem_buf; sem_buf.sem_num=index; sem_buf.sem_op=1; sem_buf.sem_flg=SEM_UNDO; semop(semid,&sem_buf,1);/为了让读者优先,当读者获得控制权时,写者进程必须挂起;当第一个读者进程到来(等到写者进程释放控制权)时,第一个读者进程获得优先权,接着其他读者进程不再等待,同时执行。/故而用critical1记录读者进程读到的内容, 用semid0控制读者或写者进程, 用semid1更新critical1的值void reader(int semid) while(1)
9、 semWait(semid,1); critical1+; if(critical1=1) semWait(semid,0); semSignal(semid,1);/correctly update the reader count printf(reader: read value %dn,critical0); semWait(semid,1); critical1-;/have read it readers have decreased update it correctly if(critical1=0)/no readers semSignal(semid,0);/free t
10、he ownership of readers semSignal(semid,1); void writer(int semid) while(1) semWait(semid,0); printf(input:); scanf(%d,&critical0); printf(writer: write after update value is %dn,critical0); semSignal(semid,0); int main() int semid=createSem(); initSignal(semid,0,1);/初始化控制写者信号量W initSignal(semid,1,1
11、);/初始化控制读者信号量R /the critical number is init as -1 the writer will update it make_critical();/create critical region pid_t child=fork(); if(child=0) reader(semid); else writer(semid); return 0;三、 实验结果:五、 实验总结这次多线程的操作系统实验,使我对线程的概念以及多线程程序中线程间的运行有了更深的认识,同时也让我的编程能力得到了一定的提高。这次做的用多线程实现生产者与消费者模型的实验,由于我的编程能力
12、基础比较差,对线程也是一无所知,所以一开始觉得无从下手,但幸好老师给了充足的时间,我通过看网上找的视频资料以及请教同学才渐渐地有了一点概念,然后我试着从网上下了一些多线程的程序分析里面的语句,基本弄懂了多线程的原理附:#include iostream.h#include windows.h#include stdio.hbool lock4=false,false,false,false;/四把锁,分别对四个缓冲区进行同步int buffer4=0,0,0,0;/缓冲区,表示资源的个数void display() cout-endl; cout缓冲区 0 1 2 3endl; for(int
13、 i=0;i4;i+)cout bufferi ; coutendl;DWORD WINAPI Producer(LPVOID lpParameter)while(true)for(int j=0;j4;j+)if(bufferj=0)/找到空缓冲区if(lockj=false)/同步锁为false,可以进行操作lockj=true;/加锁,防止其他线程操作此缓冲区if(bufferj1)/限定一个缓冲区只能存放一个资源+bufferj;/模拟生产资源cout生产一个资源,放入缓冲区j中endl;lockj=false;/解锁break;/一次生产一个if(j=3)cout找不到空缓冲区,等待
14、中。endl;Sleep(2000);return 0;DWORD WINAPI Customer(LPVOID lpParameter)while(true)for(int n=0;n=1)-buffern;/模拟消费资源cout消费一个资源,从缓冲区n中取出endl;lockn=false;/解锁break;/一次生产一个if(n=3) cout找不到满缓冲区,等待中。endl; Sleep(2000);return 0;int main(int argc,char* argv) display();HANDLE handle3;DWORD dw1,dw2,dw3,dw4,dw0; handle0=CreateThread(NULL,0,Producer,NULL,0,&dw1); handle1=CreateThread(NUL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年项目管理专业人士资格认证内容试题及答案
- 2025年燃气安全生产管理人员模拟考试题及答案
- 植物园绿色建筑设计与节能环保考核试卷
- 2024年项目管理考试真题解析试题及答案
- 园艺师多功能果园管理试题及答案
- 2023年中国联通博尔塔拉蒙古自治州分公司招聘笔试参考题库附带答案详解
- 2023年中国石化高校毕业生专项招聘笔试参考题库附带答案详解
- 烟草机械设备的远程监控与故障分析考核试卷
- 地铁检修库维修施工方案
- 纸板容器市场前景预测考核试卷
- 怎样学习初中物理
- DB62∕T 25-3111-2016 建筑基坑工程技术规程
- 大班音乐《水果百变秀》课件
- 妇幼保健院医疗保健服务转介工作制度和流程
- 国家职业技能鉴定考评员考试题库1100题【含答案】
- 监察机关执法工作规定学习测试
- 产品鉴定试验大纲
- 2022职业病防治法宣传周PPT
- 常州市武进区征地拆迁房屋装修及附属设施补偿标准
- 民办教师人员花名册
- 国家开放大学《管理英语4》章节测试参考答案
评论
0/150
提交评论