版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1. 需求分析11.1课程设计题目 11.2课程设计任务11.3课程设计原理 11.4课程设计要求11.5实验环境 12. 概要设计22.1课程设计方案概述22.2课程设计流程图 23. 详细设计 33.1主程序模块 33.2 生产者程序模块43.3消费者程序模块 54. 调试中遇到的问题及解决方案55. 运行结果66. 实验小结7参考文献7附录:源程序清单 7武汉理工大学华夏学院操作系统原理课程设计报告1. 需求分析1.1课程设计题目用多线程同步方法解决生产者-消费者问题1.2课程设计任务(1) 每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前指针位置和生产者/消
2、费者线程的标识符。(2) 生产者和消费者各有两个以上。(3) 多个生产者或多个消费者之间须共享对緩冲区进行操作的函数代码。1.3课程设计原理生产者和消费者问题是从操作系统中的许多实际同步问题中抽象岀来的具有代表性的问题,它反映了操作系统中典型的同步例子,生产者进程 (进程由多个线程组成)生产信息, 消费者进程使用信息,由于生产者和消费者彼此独立,且运行速度不确定,所以很可能出现生产者已产生了信息而消费者却没有来得及接受信息这种情兄为此,需要引入由一个或者若干个存储单元组成的临时存储区(即缓冲区),以便存放生产者所产生的信息,解决平滑进程间由于速度不确定所带来的问题。1.4课程设计要求(1) 有
3、界缓冲区内设有20个存储单元,放入/取岀的数据项设定为120这20个整型数。(2) 每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前指针位置和生产者/消费者线程的标识符。(3) 生产者和消费者各有两个以上。(4) 多个生产者或多个消费者之间须共享対緩冲区进行操作的函数代码。1.5实验环境系统平台:LINUX开发语言:C开发工具:PC机一台2. 概要设计2.1课程设计方案概述作为有界缓冲区,纟爰冲区为 0时,代表该本设计中设置一个长度为20的一维数组buff20緩冲区内没有产品,buffi=i+1 表示有产品,产品为i+1 o设置3个同步信号灯:一个说明空缓冲区的数目
4、,用empty表示,其初值为有界缓冲区的大小20 ;另一个说明满缓冲区(即产品)的数目,用full表示,其初值为00由于緩冲区是临界资源,必须互斥使用,所以还设置了一个互斥信号灯mutex ,其初值为1。用这3个信号灯有效控制多个生产者线程和多个消费者线程的同步准确的运行。Main ()函数中调用函数sem_init()对信号灯进行初始化;利用 for语句循环创建5个producer(生产者)分离线程和 5个consumed消费者)分离线程;Producer线程通过调用函数 sem_wait(&empty)判断是否有空缓冲区。若无,则阻塞当前线程,若有则调用函数sem_wait(&mutex)
5、等待对临界资源的操作权,当 mntex为1时,便获得临界资源的操作权,可 将产品放入缓冲区,及时输出缓冲区里的内容。然后依次调用函数sem_post(&mutex)和sem_post(&full)来释放緩冲区操作权和增加满缓冲区信号量的值; Consumer线程通过调用函 数sem_wait(&full) 判断是否有满緩冲区若无,则阻塞当前线程,若有则调用函数 sem_wait(&mutex)等待対临界资源的操作权,当 mntex为1时,便获得临界资源的操作权,可 从满缓冲区中取出产品消费,并及时输出缓冲区里的内容。然后依次调用函数sem_post(&mutex) 和sem_post(&emp
6、tyl)来释放缓冲区操作权和增加空满缓冲区信号量的值。Producer和Consumer线程中均用缓冲区指针b指出当前是对哪一个缓冲区进行放入/取出操作;并调用pthread_self()函数来显示其自身的标识符。2.2课程设计流程图设计中主要有三个模块,首先从主程序中进入,完成初始化及创建好生产者和消费 者线程后,进入生产者或消费者模块,具体流程见程序设计流程图如图1所示:武汉理工大学华夏学院操作系统原理课程设计报告3生产者消费者图1程序设计流程图3. 详细设计for语句循环创建 3个3.1主程序模块主程序中利用函数sem_init()对信号灯进行初始化;利用producer生产者)分离线程
7、和3个consume*消费者)分离线程,程序段如下:int main(void)武汉理工大学华夏学院操作系统原理课程设计报告 inti;initbuff();for(i=0;i5;i+)(pthread_create(&id 1 i,NULL,(void *)producer,(&i);) 创建生产者线程for(i=0;i5;i+)(pthread_create(&id2i,NULL,(void consumer,(&i);创建消费者线程for(i=0;i5;i+)( pthreadjoin(id1 i,NULL);pthreadjoin(id2i,NULL);exit(O); 等待生产者线程
8、,消费者线程,结束主线程3.2 生产者程序模块Producer线程通过调用函数 sem_wait(&empty)判断是否有空缓冲区。若无,则阻塞当前线程,若有则调用函数sem_wait(&mutex)等待对临界资源的操作权,当 mntex为及时输出缓冲区里的内容;并1时,便获得临界资源的操作权,可将产品放入缓冲区,用指针b指出当前是对哪一个緩冲区进行放入/取出操作,且调用 pthread_self()函数来显示其自身的标识符。然后依次调用函数sem_post(&mutex)和 sem_post(&full)来释放緩冲区操作权和增加满緩冲区信号量的值,程序段如下:void producer()
9、/生产者(int pid=O;intj.k;pid=pthread_self();/获得生产者标识符while(1)for(j=0;j5;j+)if(pid=id10D k=j+1; )sem_wait(&empty);/P操作,判断缓冲区是否有空位置sem_wait(&mutex);/P操作,获得对临界资源的操作权(buffb=p%21;printf(producer %d produce:%dn,k,p%21);printbuff();b+; p+;else p+;操作,释放临界资源sem_post(&mutex); /Vsem_post(&full); /V操作,满纟套冲区信号灯加sle
10、ep(4); 3.3消费者程序模块Consumer线程调用调用函数 sem_wait(&full)判断是否有满纟爰冲区。若无,则阻塞 当前线程,若有则调用函数sem_wait(&mutex)等待对临界资源的操作权,当 mntex为1 时,便获得临界资源的操作权,可从满缓冲区中取出产品消费,并及时输出缓冲区里的内容,并用指针b指出当前是对哪一个缓冲区进行放入/取出操作,且调用pthread_self()函数来显示其自身的标识符。然后依次调用函数sem_post(&mutex)和sem_post(&emptyl) 来释放纟爰冲区操作权和増加空满缓冲区信号量的值,程序段如下:void consume
11、r() /消费者(int cid=0;cid=pthread_self();获得消费者标识符while(1)( for(j=0;j/whj1 produce:1 buff arc:1 02 produce:2 buff are:1 23 produce:3 buff are:1 24 produce:4 buff are:1 25 produce:5 buff are:1 21 consuoke : 5 buff are:1 22 consune : 4 buff are:1 23 consuate : 3 buff are:1 24 consuoM? :2 buff are:1 05 con
12、sune:1 buff arc:0 01 produce:6 buff are:6 02 produce:? buff are:6 73 produce:8 buff are:6 74 produce:9 buff are75 produce:10whj6. 实验小结这次i果程设计主要针対的是操作系统中的经典问题即:生产者消费者问题使用多线程控制,刚拿到设计题目时心里其实挺没底的,因为之前我对线程不是很了解,不过幸好老师上课的时候给了我们一个关于Linux多线程编程的文档,里面详细的介绍了线程的一些基本命令,所以我在这次设计中基本上都用的是文档里的命令。从这次课程设计中,我对线程的概念以及一些
13、命令都有了一定的理解和掌握,并且也知道了它与进程之间的区别,除此之外,通过这次课程设计让我对操作系统中的经典问题, 生产者消费者问题有了更深的理解,在做设计的过程中,也对上课的内容加深了理解并进行了巩固。参考文献1 庞丽萍.操作系统原理.华中科技大学出版社.2009年1月。2 蒋静 徐志伟.操作系统原理技术与编程M.北京:机械工业出版社,20043 张红光李福才.UNIX操作系统。机械工业出版社。 2006年1月4 汤子瀛等.计算机操作系统.西安电子科技大学出版社.2001年5月5 付国瑜 杨武 周敏.计算机操作系统原理及应用上机实验指导,重庆工学院计算机学院.2005年1月.附录:源程序清单
14、#include#include#include#includeint buff20=0; /有界缓冲区定义int b=0;/缓冲区的输出指针int p=1;int c=1 ;int c1=0;/消费数据变量semj full; /緩冲区的数量信号灯semj empty; /纟爰冲区满信号灯sem_t mutex; /互斥信号灯pthread_t id15;pthread_t id25;武汉理工大学华夏学院操作系统原理课程设计报告void initbuffQ 初始化信号灯sem_init(&empty,0,20);sem_init(&mutex,0,1); /初始化互斥信号灯void prin
15、tbuff() /打印緩冲区intj;printf(datas in buff are:);for(j=0;j20;j+)printf(%d ”,buff。);void producer() /生产者(int pid=O;intj.k;pid=pthread_self();while(1) for(j=0;j5;j+) if(pid=id10D k=j+1; sem_wait(&empty);sem_wait(&mutex);( buffb=p%21;printf(producer %d produce:%dn,k,p%21);printbuff();b+;P+;)else p+;sem_po
16、st(&mutex);sem_post(&full);sleep(4); ) void consumer()/消费者int cid=0;intj.k;cid=pthread_self();while(1) for(j=0;j5;j+)( if(cid=id2j) k=j+1; )sem_wait(&full); 看是否有数据在缓冲区sem_wait(&mutex); / 临界区if(c%21 !=0) c1=buffb-1;printf(consumer %d consume:%dn,k,c1);buffb-1=0;printbuff();b-;C+; else C+;sem_post(&mutex);sem_post(&empty);sleep(6); int main(void)int i;initbuff();for(i=0;i5;i+)pthread_create(&id1i,NULL,(void producer,(&i); /创建生产者线程for(i=0;i5;i+)(pthread_create(&id2i,NULL,(void consumer,(&i); /创建消费者线程for(i=0;i5;i+) pthreadJoin(id1i,NULL);pthreadjoin(id2i,NULL); exit(O); /等待生产者线程,消费者线程,结束主线
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 漳州市2026年中小学教师招聘考试-教育综合知识题库(含答案)
- 庆阳市2026幼儿园教师招聘考试-学前教育专业知识题库(含答案)
- 开关插座安装接线方案
- 水稳施工安全技术交底
- 拆除模板支架安全施工方案
- 电力换电站工程监理实施细则
- 徐州市2026电子商务师初级职业技能测试卷(含答案)
- 2025年县乡教师选调考试《教育学》综合提升试卷附答案详解(a卷)
- 2026年县乡教师选调考试《教育学》题库必刷100题带答案详解(突破训练)
- 2025-2026年注册岩土工程师之《岩土基础知识》通关题库带答案详解(培优b卷)
- 《NBT 20485-2018 核电厂应急柴油发电机组设计和试验要求》(2026年)实施指南
- 2025年证券投顾考试真题及答案
- 结直肠癌筛查方案
- 足浴店安全管理制度及安全措施
- 深圳仓库出租合同范本
- 液化石油气库站工理论考试题库(含答案)
- 起重装卸机械操作工(初级工)理论考试复习题(附答案)
- 混凝土沟渠建设施工方案
- 有砟人工铺轨施工方案
- 露天采装作业安全课件
- (正式版)DB46∕T 721-2025 《产业链质量图谱绘制指南》
评论
0/150
提交评论