北邮操作系统进程同步实验报告及源代码
更新时间:2023-12-28 06:33:01 阅读量: 教育文库 文档下载
- 操作系统进程同步例题推荐度:
- 相关推荐
进程管理实验报告
1.实验目的:
(1)理解进程/线程同步的方法,学会运用进程/线程同步的方法解决实际问题; (2)了解windows系统或unix/linux系统下中信号量的使用方法。
2.实验内容
编写一个有关生产者和消费者的程序:每个生产者每次生产一个产品存入仓库,每个消费者每次从仓库中取出一个产品进行消费,仓库大小有限,每次只能有一个生产者或消费者访问仓库。要求:采用信号量机制。
3、环境说明
本实验是在win7环境下使用dev编译器实现的,采用Win API的信号量机制。
4、程序设计说明
该程序根据教材中的消费者生产者问题编写的,使用了教材中提供的框架思路以及库函数,使用CreateThread建立新的线程,使用CreateMutex创建一个互斥信号量,使用CreateSemaphore创建信号量,使用ReleaseMutex释放线程的互斥信号量,使用ReleaseSemaphore对指定的信号量增加指定的值,使用WaitForSingleObject等待空位,使用CloseHandle在操作结束后关闭线程和信号量。
在这个程序里我设计了三个函数:
Int main()是主函数,其中包含了缓冲区大小的设置,生产者消费者发出请求等内容以及线程创建等内容
DWORD WINAPI producer(LPVOID lpPara)是生产者等待缓冲区的使用权并对缓冲区进行操作
DWORD WINAPI consumer(LPVOID lpPara)是消费者等待缓冲区的使用权并对缓冲区进行操作
该程序模拟生产者消费者问题,首先要设置缓冲区的大小,输入请求资源的各个进程的信息以及请求时间,并且按照请求时间对各进程进行排序,创建线程,然后按序依次对缓冲区进行操作,详细设计见源代码。
5、程序运行结果截图:
只有生产者请求,没有消费者请求,请求满足
只有消费者请求,没有生产者请求,消费者的请求不成功:
生产者请求大于消费者请求并且消费者请求在生产者放入产品之后:
消费者请求多于生产者请求,只能满足部分消费者请求,不能满足全部:
6、源代码:
#include
using namespace std; #define MAX_BUF 1000 #define MAX_REQ 20
HANDLE mutex; HANDLE full; HANDLE empty;
HANDLE thread[MAX_REQ]; DWORD pro_id[MAX_REQ]; DWORD con_id[MAX_REQ];
struct request{
int type;//记录生产者消费者的类型 intseq; //记录请求次序 }req[MAX_REQ];
intbuf_size; intreq_size; int no;
int buffer[MAX_BUF]; int in; int out; int result;
boolcmp(request a,request b) { returna.seq DWORD WINAPI producer(LPVOID lpPara) { WaitForSingleObject(full,INFINITE); WaitForSingleObject(mutex,INFINITE); printf(\生产者%d将第%d号产品放入缓冲区……\\n\buffer[in]=no++; in=(in+1)%buf_size; printf(\成功放入缓冲区!\\n\\n\ ReleaseMutex(mutex); ReleaseSemaphore(empty,1,NULL); return 0; } DWORD WINAPI consumer(LPVOID lpPara) { WaitForSingleObject(empty,INFINITE); WaitForSingleObject(mutex,INFINITE); printf(\消费者%d将第%d号产品从缓冲区取出……\\n\ buffer[out]=0; printf(\成功从缓冲区取出!\\n\\n\ ReleaseMutex(mutex); out=(out+1)%buf_size; ReleaseSemaphore(full,1,NULL); return 0; } int main() { inti; int p=0; no = 1; in=out=0; memset(buffer, 0, sizeof(buffer)); printf(\请设置缓冲区大小:\scanf(\ printf(\请输入请求使用资源进程的个数:\scanf(\ for(i=0;i printf(\请选择是消费者进程(0)还是生产者进程(1):\scanf(\ printf(\请输入该进程的请求时间:\ scanf(\ } sort(req,req+req_size,cmp); mutex=CreateMutex(NULL,FALSE,NULL); full=CreateSemaphore(NULL,buf_size,buf_size,NULL); empty=CreateSemaphore(NULL,0,buf_size,NULL); for(i=0;i if(req[i].type==0){ thread[i]=CreateThread(NULL, 0, consumer, (LPVOID)i, 0, &con_id[i]); if(thread[i]==NULL) return -1; printf(\消费者请求从缓冲区中取产品,请求时间为%d\\n\ } if(req[i].type==1){ thread[i]=CreateThread(NULL,0,producer,(LPVOID)i,0,&pro_id[i]); if(thread[i]==NULL) return -1; printf(\生产者请求往缓冲区中放产品,请求时间为%d\\n\ } } result = WaitForMultipleObjects(req_size, thread, TRUE, 500); if (result == WAIT_TIMEOUT) printf(\请求不能被完全满足\\n\else printf(\能够满足所有请求 \\n\ for(inti=0; i system(\return 0; } 7、实验总结: 本次实验基于书上的生产者消费者问题,原理在上课的时候老师已经详细地讲解过,但是在具体编程实现的过程中也遇到了很多问题,除了书上的库函数之外还有一些函数书上并没有给出用法,比如如何创建线程等函数,通过查阅参考相关资料解决,通过编写代码也系统地理解了生产者消费者问题的操作过程,线程的创建,信号量的创建以及信号量的使用方法等情况,遇到的好多编代码上的细节问题通过反复调试解决,有较大收获。
正在阅读:
北邮操作系统进程同步实验报告及源代码12-28
特殊天气驾驶技巧05-20
关于花的现代诗歌三首03-21
美丽的酒仙湖作文600字06-14
《白雪歌送武判官归京》教学设计(附板书)03-19
2017感恩教师节的散文03-30
起重机中吊钩装置的作用与区分05-05
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 北邮
- 源代码
- 进程
- 同步
- 操作系统
- 实验
- 报告
- 中国古代书院对现代民办高校办学的启示
- 公共艺术设计在公共空间中的作用
- 二年级下册认识秒教案苏教版
- 银行安全保卫基础知识课后测试
- 基于语文核心素养的高中现当代诗歌教学探究
- 关于针对网上电子放箱服务使用协议
- 探讨结核性脑膜炎患者的临床观察及护理措施
- 2019年分局创建文明单位工作总结
- 《红领巾相约中国梦》主题队会活动方案
- 20综合07年高考文综政治试题特点与启示
- 小学导学设计首页13
- 车载诊断标准ISO - 15765-1(中文)总体信息
- 法律移植问题综述
- 第一节 物质的分类(第一、二课时)
- 政府和社会资本合作模式操作指南操作指南2014113号
- 2018年新闻专业学生毕业实习报告
- 2013年房地产经纪人《制度与政策》题型及答题技巧每日一讲(7月2日)
- 《新课准》下的农村中学英语教学调查报告(一)
- 幼儿园安全自查报告范文三篇
- 一年级必背古诗辞20首(带拼音版对着书本校对过可直接转帖为PPT每首占一页分页原创)