操作系统实验报告生产者消费者问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统
课程设计报告书
题目:生产者-消费者问题
姓名:
学号:
专业:
指导教师:
完成时间:2013年11月----2013年12月
课程设计的任务和具体要求
1、课程设计的任务:基于线程的生产者-消费者的合作问题
–其中(生产者)从外设获取数据进行生产
–另外(消费者)消费后进行输出,并存储输出结果。
- 在Linux环境下使用POSIX库进行设计实现
指导教师评语:
成绩:指导教师签字:日期:
课程设计所需软件、硬件等
Windows 7系统 VM虚拟机并安装ubuntu系统
软件:Vi编辑器GCC4.41
设计语言:C语言
第1章 引言
1.1 设计背景
生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
生产者-消费者方案很适合于后台处理类别的情况。这些情况通常围绕一个作业“生产者”方和一个作业“消费者”方。当然,关于作业并行执行还有其它考虑事项。在大多数情况下,对于使用同一资源的作业,应以FCFS的方式按顺序处理,这可以通过使用单进程的消费者轻松实现。通过使用这种方法,使用单个进程来访问单个资源,而不是用多个进程来访问单个资源。要启用标准消费者,当作业到来时创建一个作业队列来存储所有作业。生产者进程通过将新对象添加到消费者队列来交付这个要处理的新对象。然后消费者进程从队列取出每个对象,并依次处理。当队列为空时,消费者进入休眠。当新的对象添加到空队列时,消费者会醒来并处理该对象。
其中11-20号生产者线程生产的产品仅供对应编号的消费者线程消费。
其他编号生产者线程生产的产品可由任意的消费者线程消费。
每个生产线程生产30个消息后结束运行。如果一个消费者线程没有对应的生产者线程在运行后,也结束运行。所有生产者都停止生产后,如果消费者线程已经没有可供消费的产品,则也退出运行。
指导教师签字:日期:
生产者-消费者方案是多进程应用程序开发中最常用的构造之一。因此困难也在于此。因为在一个应用程序中可以多次重复生产者-消费者行为,其代码也可以如此。设计中创建了Consumer 类,该类通过在一些多进程应用程序中促进代码重用以及简化代码调试和维护来解决这个问题。多进程应用程序通常利用生产者-消费者编程方案,其中由生产者进程创建重复性作业,将其传递给作业队列,然后由消费者进程处理作业。
由于本系统我们研究的是有限缓冲区(Bounded-Buffer)的生产者消费者问题。而且根据初始条件可知,该缓冲区内有20个缓冲项,每个缓冲项存储一个整形数。信号量mutex提供了对缓冲池访问的互斥要求,并初始化为1。信号量empty和full分别用来表示空缓冲项和满缓冲项的数量。信号量empty初始化为20,而信号量full初始化为0;
多进程是一种使应用程序能同时处理多个操作的编程技术。通常有两种不同类型的多进程操作使用多个进程:适时事件,当作业必须在特定的时间或在特定的间隔内调度执行时;后台处理,当后台事件必须与当前执行流并行处理或执行时;适时事件的示例包括程序提醒、超时事件以及诸如轮询和刷新之类的重复性操作。后台处理的示例包括等待发送的包或等待处理的已接收的消息。
2、课程设计的具体要求:
完成N个生产者和M个消费者线程之间的并发控制,N、M不低于30,数据发送和接收缓冲区尺寸不小于20个(每个产品占据一个)。
其中生产者线程1、3、5、7、9生产的产品供所有奇数编号的消费者线程消费,只有所有奇数编号的消费者线程都消费后,该产品才能从缓冲区中撤销。
其中生产者线程2、4、6、8、10生产的产品所有偶数编号的消费者线程都可消费,任一偶数编号消费者线程消费该消息后,该产品都可从缓冲区中撤销。
3.消费者模块:消费者对缓冲区的操作,如图3-1-3所示。
程序相关模块的流程图
图3-1-1 主程序
图3-1-2 生产者流程
图3-1-3 消费者流程
3.2程序代码结构
通过分析,我们已经了解到了可以采用信号量来解决n个进程的临界区问题,这n个进程共享一个信号量mutex(mutual exclusion),并初始化为1。每个进程Pi的组织结构如下图。
1.2 设计目标
以生产者和消费者问题为例,学习Linux和Windows下进程通信、同步机制的具体实现方法,主要是信号量和共享内存。
第2章 设计原理、函数说明
设计原理:
多进程是一种非常简洁的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种烦琐的多任务工作方式。
函数说明:
a.主程序(main):
i.创建信号量并进行初始化
ii.创建生产者、消费者线程,生产者执行void *product(),消费者执行void *prochase()
iii.等待所有子进程的结束
iv.销毁所有线程
b.生产者方法product():
这个函数是生产者进行的生产过程,为所有的生产者所共享。
c.消费者方法prochase():
这个函数是消费者进行的生产过程,为所有的消费者所共享。
第3章 程序详细设计
3.1程序模块设计
该实验主wenku.baidu.com分为三大模块:
1.主程序,创建并控制程序的流程,
其中控制线程的活动以及信号量的操作,如图3-1-1所示;
2.生产者模块:生产者对缓冲区的操作,如图3-1-2所示;
生产者进程和消费者进程的代码如图。注意生产者和消费者之间的对称性可以这样来理解代码:生产者为消费者生产满缓冲项,或消费者为生产者生产空缓冲项。
第4章 实验结果
实验结果如图4-1截图所示:
图4-1实验结果截图
第5章 实验总结
进程的同步与互斥是操作系统课程中非常重要的一部分内容。通过本次课程设计,我不仅学会了使用信号量机制解决有限缓冲区的生产者消费者问题,而且对Linux系统下多线程编程有了更深入的了解。
课程设计报告书
题目:生产者-消费者问题
姓名:
学号:
专业:
指导教师:
完成时间:2013年11月----2013年12月
课程设计的任务和具体要求
1、课程设计的任务:基于线程的生产者-消费者的合作问题
–其中(生产者)从外设获取数据进行生产
–另外(消费者)消费后进行输出,并存储输出结果。
- 在Linux环境下使用POSIX库进行设计实现
指导教师评语:
成绩:指导教师签字:日期:
课程设计所需软件、硬件等
Windows 7系统 VM虚拟机并安装ubuntu系统
软件:Vi编辑器GCC4.41
设计语言:C语言
第1章 引言
1.1 设计背景
生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
生产者-消费者方案很适合于后台处理类别的情况。这些情况通常围绕一个作业“生产者”方和一个作业“消费者”方。当然,关于作业并行执行还有其它考虑事项。在大多数情况下,对于使用同一资源的作业,应以FCFS的方式按顺序处理,这可以通过使用单进程的消费者轻松实现。通过使用这种方法,使用单个进程来访问单个资源,而不是用多个进程来访问单个资源。要启用标准消费者,当作业到来时创建一个作业队列来存储所有作业。生产者进程通过将新对象添加到消费者队列来交付这个要处理的新对象。然后消费者进程从队列取出每个对象,并依次处理。当队列为空时,消费者进入休眠。当新的对象添加到空队列时,消费者会醒来并处理该对象。
其中11-20号生产者线程生产的产品仅供对应编号的消费者线程消费。
其他编号生产者线程生产的产品可由任意的消费者线程消费。
每个生产线程生产30个消息后结束运行。如果一个消费者线程没有对应的生产者线程在运行后,也结束运行。所有生产者都停止生产后,如果消费者线程已经没有可供消费的产品,则也退出运行。
指导教师签字:日期:
生产者-消费者方案是多进程应用程序开发中最常用的构造之一。因此困难也在于此。因为在一个应用程序中可以多次重复生产者-消费者行为,其代码也可以如此。设计中创建了Consumer 类,该类通过在一些多进程应用程序中促进代码重用以及简化代码调试和维护来解决这个问题。多进程应用程序通常利用生产者-消费者编程方案,其中由生产者进程创建重复性作业,将其传递给作业队列,然后由消费者进程处理作业。
由于本系统我们研究的是有限缓冲区(Bounded-Buffer)的生产者消费者问题。而且根据初始条件可知,该缓冲区内有20个缓冲项,每个缓冲项存储一个整形数。信号量mutex提供了对缓冲池访问的互斥要求,并初始化为1。信号量empty和full分别用来表示空缓冲项和满缓冲项的数量。信号量empty初始化为20,而信号量full初始化为0;
多进程是一种使应用程序能同时处理多个操作的编程技术。通常有两种不同类型的多进程操作使用多个进程:适时事件,当作业必须在特定的时间或在特定的间隔内调度执行时;后台处理,当后台事件必须与当前执行流并行处理或执行时;适时事件的示例包括程序提醒、超时事件以及诸如轮询和刷新之类的重复性操作。后台处理的示例包括等待发送的包或等待处理的已接收的消息。
2、课程设计的具体要求:
完成N个生产者和M个消费者线程之间的并发控制,N、M不低于30,数据发送和接收缓冲区尺寸不小于20个(每个产品占据一个)。
其中生产者线程1、3、5、7、9生产的产品供所有奇数编号的消费者线程消费,只有所有奇数编号的消费者线程都消费后,该产品才能从缓冲区中撤销。
其中生产者线程2、4、6、8、10生产的产品所有偶数编号的消费者线程都可消费,任一偶数编号消费者线程消费该消息后,该产品都可从缓冲区中撤销。
3.消费者模块:消费者对缓冲区的操作,如图3-1-3所示。
程序相关模块的流程图
图3-1-1 主程序
图3-1-2 生产者流程
图3-1-3 消费者流程
3.2程序代码结构
通过分析,我们已经了解到了可以采用信号量来解决n个进程的临界区问题,这n个进程共享一个信号量mutex(mutual exclusion),并初始化为1。每个进程Pi的组织结构如下图。
1.2 设计目标
以生产者和消费者问题为例,学习Linux和Windows下进程通信、同步机制的具体实现方法,主要是信号量和共享内存。
第2章 设计原理、函数说明
设计原理:
多进程是一种非常简洁的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种烦琐的多任务工作方式。
函数说明:
a.主程序(main):
i.创建信号量并进行初始化
ii.创建生产者、消费者线程,生产者执行void *product(),消费者执行void *prochase()
iii.等待所有子进程的结束
iv.销毁所有线程
b.生产者方法product():
这个函数是生产者进行的生产过程,为所有的生产者所共享。
c.消费者方法prochase():
这个函数是消费者进行的生产过程,为所有的消费者所共享。
第3章 程序详细设计
3.1程序模块设计
该实验主wenku.baidu.com分为三大模块:
1.主程序,创建并控制程序的流程,
其中控制线程的活动以及信号量的操作,如图3-1-1所示;
2.生产者模块:生产者对缓冲区的操作,如图3-1-2所示;
生产者进程和消费者进程的代码如图。注意生产者和消费者之间的对称性可以这样来理解代码:生产者为消费者生产满缓冲项,或消费者为生产者生产空缓冲项。
第4章 实验结果
实验结果如图4-1截图所示:
图4-1实验结果截图
第5章 实验总结
进程的同步与互斥是操作系统课程中非常重要的一部分内容。通过本次课程设计,我不仅学会了使用信号量机制解决有限缓冲区的生产者消费者问题,而且对Linux系统下多线程编程有了更深入的了解。