




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课 程 设 计 报 告课程名:操作系统专业学生姓名班级学号指导教师完成日期博 雅 学 院- 1 -“操作系统”课程设计报告生产者-消费者问题的模拟实现1. 课程设计的目的本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。2设计内容2.1 概述用多进程同步方法解决生产者-消费者问题,C 或 C+语言实现。通过研究 Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有 20 个存储单元,放入/取出的数据项设定为 1-20 这 20 个整型数。设计要求:(1) 每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者县城的标识符。 (2)生产者和消费者各有两个以上。(3)多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码。2.2 设计原理多进程是一种非常简洁的多任务操作方式。在 Linux 系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种烦琐的多任务工作方式。生产者-消费者方案是多进程应用程序开发中最常用的构造之一。因此困难也在于此。因为在一个应用程序中可以多次重复生产者-消费者行为,其代码也可以如此。设计中创建了 Consumer 类,该类通过在一些多进程应用程序中促进代码重用以及简化代码调试和维护来解决这个问题。多进程应用程序通常利用生产者-消费者编程方案,其中由生产者进程创建重复性作业,将其传递给作业队列,然后由消费者进程处理作业。多进程是一种使应用程序能同时处理多个操作的编程技术。通常有两种不同类- 2 -型的多进程操作使用多个进程:适时事件,当作业必须在特定的时间或在特定的间隔内调度执行时;后台处理,当后台事件必须与当前执行流并行处理或执行时;适时事件的示例包括程序提醒、超时事件以及诸如轮询和刷新之类的重复性操作。后台处理的示例包括等待发送的包或等待处理的已接收的消息。生产者-消费者方案很适合于后台处理类别的情况。这些情况通常围绕一个作业“生产者”方和一个作业“消费者”方。当然,关于作业并行执行还有其它考虑事项。在大多数情况下,对于使用同一资源的作业,应以 FCFS 的方式按顺序处理,这可以通过使用单进程的消费者轻松实现。通过使用这种方法,使用单个进程来访问单个资源,而不是用多个进程来访问单个资源。要启用标准消费者,当作业到来时创建一个作业队列来存储所有作业。生产者进程通过将新对象添加到消费者队列来交付这个要处理的新对象。然后消费者进程从队列取出每个对象,并依次处理。当队列为空时,消费者进入休眠。当新的对象添加到空队列时,消费者会醒来并处理该对象。2.3 详细设计及编码(1)调试问题分析为解决生产者/消费者问题,应该设置两个资源信号量,其中一个表示空缓冲区的数目,用 Full 表示,其初始值为有界缓冲区的大小 BUFFER_NUM;另一个表示缓冲区中产品的数目,用 Empty 表示,其初始值为 0。另外,由于有界缓冲区是一个临界资源,必须互斥使用,所以还需要再设置一个互斥信号量 Mutex,起初值为1。在生产者/消费者问题中,信号量实现两种功能。首先,它是生产产品和消费产品的计数器,计数器的初始值是可利用的资源数目(有界缓冲区的长度)。其次,它是确保产品的生产者和消费者之间动作同步的同步器。生产者要生产一个产品时,首先对资源信号量 Full 和互斥信号量 Mutex 进行 P操作,申请资源。如果可以通过的话,就生产一个产品,并把产品送入缓冲区。然后对互斥信号量 Mutex 和资源信号量 Empty 进行 V 操作,释放资源。消费者要消费一个产品时,首先对资源信号量 Empty 和互斥信号量 Mutex 进行P 操作,申请资源。如果可以通过的话,就从缓冲区取出一个产品并消费掉。然后对互斥信号量 Mutex 和资源信号量 Full 进行 V 操作,释放资源。如果缓冲区中已经没有可用资源,就把申请资源的进程添加到等待队列的队尾。如果有一个资源被释放,在等待队列中的第一个进程被唤醒并取得这个资源的使用权。 - 3 -(2)流程图生产者线程开开开始资源信号量 P操作互斥信号量 P操作生产一个产品把产品送入缓冲区互斥信号量 V操作资源信号量 V操作等待队列中有消费者线程等待队列中有消费者线程线程自我阻塞添加到等待队列线程自我阻塞添加到等待队列未通过未通过通过通过唤醒对头的消费者线程唤醒对头的消费者线程生产者线程结束YYN未通过图 2-1 生产者流程图- 4 -消费者线程开始资源信号量 P操作互斥信号量 P操作从缓冲区取出一个产品消费一个产品互斥信号量 V操作资源信号量 V操作等待队列中有生产者线程等待队列中有生产者线程线程自我阻塞添加到等待队列线程自我阻塞添加到等待队列未通过N通过通过唤醒对头的生产者线程唤醒对头的生产者线程消费者线程结束YYN图 2-2 消费者流程图- 5 -(3)源程序#include #include #include #include typedef HANDLE Semaphore; / 信号量的Windows原型 #define P(S) WaitForSingleObject(S,INFINITE) / 定义Windows 下的P操作 #define V(S) ReleaseSemaphore(S,1,NULL) / 定义Windows下的V操作 #define rate 1000 #define CONSUMER_NUM 2 /* 消费者个数 */ #define PRODUCER_NUM 3 /* 生产者个数 */ #define BUFFER_NUM 20 /* 缓冲区个数 */ char *thing8 = “豆浆“, “油条“, “烧饼“, “牛奶“, “包子 “, “烧卖“, “煎蛋“,“雪碧“; /生产和消费的产品名称 struct Buffer int productBUFFER_NUM; / 缓冲区 int start,end; / 两个指针相当于教材中的 in out 指针g_buf; Semaphore Empty,Full,Mutex; /分别相当于Empty, Full, Mutex三个信号量/* 消费者线程*/ DWORD WINAPI Consumer(LPVOID para) / i表示第i个消费者 int i = *(int *)para; /利用para传入当前消费者的编号int ptr; / 待消费的内容的指针 printf(“消费者%1d: 需要资源n“, i); int j=0;while (j+4) / 等待产品 P(Full); / 有产品,先锁住缓冲区 P(Mutex); / 记录消费的物品 ptr=g_buf.start; / 再移动缓冲区指针 g_buf.start= (g_buf.start+1)%BUFFER_NUM; - 6 -/让其他消费者或生产者使用 printf(“ 消费者%01d : 我需要buf%d=%sn“,i, ptr, thingg_ductptr); /消费完毕,并释放一个缓冲 printf(“ 消费者%01d: 我消费完毕%sn“, i,thingg_ductptr); V(Mutex); V(Empty); Sleep(rate*rand()%10+110); return 0; /* 生产者线程*/ DWORD WINAPI Producer(LPVOID para) int i = *(int *)para - CONSUMER_NUM; int ptr; int data; /产品 int j=0;while(j+4) data=rand()%8; printf(“生产者%01d: 生产出: %s!n“,i,thingdata); /等待存放空间 P(Empty); /有地方,先锁住缓冲区 P(Mutex); /记录消费的物品 ptr=g_buf.end; /再移动缓冲区指针 g_buf.end =(g_buf.end+1)%BUFFER_NUM; printf(“生产者%01d: 放到缓冲区 buf%d=%sn“,i,ptr,thingdata); g_ductptr=data; /放好了完毕,释放一个产品 /让其他消费者或生产者使用 V(Mutex); V(Full); Sleep(rate/2*rand()%10+110); return 0; - 7 -int main(int argc,char *argv) /线程技术,前面为消费者线程,后面为生产者线程 HANDLE hThreadCONSUMER_NUM+PRODUCER_NUM; / 线程计数 srand(time(NULL); rand();DWORD tid; int i=0; /初始化信号量 Mutex=CreateSemaphore(NULL,1,1,“MutexOfConsumerAndProducer“); Empty=CreateSemaphore(NULL, BUFFER_NUM, BUFFER_NUM, “BufferSemaphone“); Full=CreateSemaphore(NULL,0,BUFFER_NUM,“ProductSemaphone“); if(!Empty|!Full|!Mutex) printf(“Create Semaphone Error!n“); return -1; int totalThreads=CONSUMER_NUM+PRODUCER_NUM; /开启消费者线程 printf(“先请消费者上席!n“); for(i=0;iCONSUMER_NUM; i+) hThreadi=CreateThread(NULL, 0, Consumer, if(hThreadi)WaitForSingleObject(hThreadi,10); printf(“生产者就位!n“); for(;itotalThreads;i+) hThreadi=CreateThread(NULL,0,Producer, if(hThreadi)WaitForSingleObject(hThreadi,10); /生产者和消费者的执行 WaitForMultipleObjects(totalThreads,hThread,TRUE,INFINITE); return 0; - 8 -3 结果及分析- 9 -4 设计小结本次课程设计通过模拟计算机操作系统中经典的“生产者消费者问题” ,巩固了我在操作系统原理课上所学的知识,加深了对操作系统中进程同步和互斥等问题,完成了多进程同步方法解决生产者消费者问题全部过程,结果满足设计要求。设计过程中遇到不少困难,在反复研究老师的 PPT 及课本的原理后才逐渐明晰怎样将代码实现,虽然这学期学过 Java,但 java 不是很熟悉,因此还是选择 C+语言。以前学习 C+没有深入了解到线程这个概念,在学习 Java 的时候才知道有专门的线程类。所以我在网上也参考了其他人用 C+编写尤其是关于多进程程序的设计实现。在代码的实现过程中,我是主要定义了两个函数 DWORD WINAPI Consumer(LPVOID para) 和 DWORD WINAPI Producer(LPVOID para),在这两个函数中实现 PV 操作。通过本次设计,我较好地掌握了通过研究 Linux 的进程机制和信号量实现生产者消费者问题的并发控制全过程,尤其是对多进程程序设计方法有了更深的理解,开拓了思
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 自动化销售预测创新创业项目商业计划书
- 电商数据加密系统创新创业项目商业计划书
- 海外汽车设计工作室探访创新创业项目商业计划书
- 海外汽车市场动态创新创业项目商业计划书
- 2025年甘肃培黎职业学院招聘考试笔试试题(含答案)
- 自动化医学影像分析创新创业项目商业计划书
- 2025年游戏化营销助力餐饮品牌传播:案例分析与效果评估报告
- 2025年新能源微电网在能源互联网中的稳定性风险评估报告
- 2025年职业教育创新模式深度分析报告
- 辽宁省大连市庄河高级中学2026届高一化学第一学期期中联考模拟试题含解析
- 设备开停机管理制度
- 2025至2030中国水利信息系统行业发展趋势分析与未来投资战略咨询研究报告
- 2025年4月自考15044马克思主义基本原理概论试题及答案含解析
- 数字证据取证技术-洞察及研究
- (2025)公共基础知识真题库和答案
- 电机学模拟习题(含答案解析)
- 餐饮区域保护合同范本
- 医院药物使用流程及监控机制
- 绿化工程挂靠合同协议
- 2025年消防设施操作员(中级)职业技能鉴定参考试题库(500题含答案)
- 2025年交管12123驾驶证学法减分题库(含答案)
评论
0/150
提交评论