《管程等解决生产者消费者问题——操作系统课程设计论.doc》由会员分享,可在线阅读,更多相关《管程等解决生产者消费者问题——操作系统课程设计论.doc(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 操作系统原理课程设计提优论文题 目: 利用管程解决“生产者消费者”问题 姓 名: 学 院: 信息科技学院 专 业: 网络工程 班 级: 网工81班 学 号: 指导教师: 2011年3月 20日利用管程解决“生产者消费者”问题摘要:现代操作系统引入并发程序设计技术之后,程序的执行不再是顺序的,封闭的。在多个进程并发运行的过程中,进程之间可能产生相互制约的关系,即竞争和协作。为了协调各进程有序正确的进行,就需要各进程间能相互通信。如果各进程之间不加以来控制,就会产生错误,如与时间有关的错误等。这就需要考虑进程之间的同步和互斥等问题。操作系统中经典的“生产者消费者”问题正反映了进程并发执行的这种关
2、系。本课程设计所完成的就是对“生产者消费者”问题的模拟,本系统根据操作系统中并发进程、临界区、同步和互斥等基本概念及理论进行设计,采用Java语言实现,用管程来对进程进行模拟同步和互斥的控制。本系统可按照用户设定的生产者消费者数目及缓冲区大小来进行模拟演示。这对深入理解操作系统中进程的同步和互斥问题,探求对进程控制方法的学习上有重大意义。关键字:管程;进程同步;进程互斥;临界资源1.研究目的及意义本课程设计通过模拟计算机操作系统中经典的“生产者消费者问题”,巩固在操作系统原理课上所学的知识,加深对操作系统中进程同步和互斥、临界区管理,管程等问题的认识和理解。前期主要利用P、V信号量来控制各进程
3、间的同步于互斥关系,确保各进程有序正确的进行。然而,我们也知道,使用信号量和P、V操作在实现进程同步时,对共享资源的管理分散于各个进程中,进程能够直接对共享变量进行处理,不利于系统对系统资源的管理,容易造成程序设计错误。因此,在后期我们改用管程来实现,目的是想把资源集中起来统一管理,即把相关的共享变量及其操作集中在一起统一的控制和管理,使各并发进程间的相互作用更为清晰。当然,我们本次课程设计也为我们了解软件设计的流程、方法以及思想,提高分析设计以及编程的能力提供了基础。2.理论基础及分析2.1问题的引入在操作系统引入并发程序设计技术之后,程序的执行不再是顺序和封闭的,程序外部的顺序特性消失,程
4、序与计算不再一一对应。于是人们引入进程来描述这种变化。而一组进程在执行的时间上是重叠的,即进程并发执行。在多个进程并发运行的过程中,进程之间可能是无关的,也可能是交互的。交互进程之间可能产生的关系,包括竞争和协作。竞争和协作就会出现对统一资源进行操作,进而引入临界区的概念并发进程中与共享变量有关的程序段称为临界区,共享变量所代表的资源成为临界资源。如不对临界区进行管理就会产生一些与时间有关的错误。在操作系统有多种方法可以实现对临界区、临界资源的管理。其中最基本的方法是设置相应的信号量和P、V操作。2.2信号量和P、V操作为了能让多个进程通过特殊变量展开交互,一个进程在某一关键点上被迫停止执行直
5、至收到对应的特殊变量,通过这一措施,来达到复杂进程间的交互,这种特殊变量就是信号量。为了能够用信号量传送信号,进程可用P、V两个特殊操作来发送和接收信号,如果协作进程的相应信号仍未送到,则进程被挂起直至信号达到为止。P、V操作的实现,是本次课程设计的基础,也是一个重点。本次设计能够成功,有一定的偶然性。即充分的借助于JAVA虚拟机提供的两个与线程有关的最重要的两个函数,即wait()和notify()。我们都知道,实现P、V操作的重点是如何将进程阻塞在相应的阻塞队列,以及如何唤醒相应的阻塞进程,而不会出现错误。要实现这一点,有一定的难度。前期,我们做过尝试,但最终以失败而告终。最后,我们找到了
6、JAVA虚拟机提供两个函数来实现我们的目的。函数如下:wait() 执行该方法的线程释放对象的锁,Java虚拟机把该线程放到该对象的等待池中。notify() 执行该方法的线程唤醒在该对象等待池中等待的一个线程。因为是面向对象的一门编程语言,一切属性与方法都与对象绑定,而这一点正是我们要解决的难点:如何将进程阻塞在相应的阻塞队列,以及如何唤醒相应的阻塞进程。可以说,我们是把这个难题交给了虚拟机来处理。但此种方法把资源交给各进程进行管理,容易出现进程有意或无意的破坏,所以我们才用管程来控制。2.3管程的基本概念代表共享资源的数据结构,以及由对该共享数据结构实施操作的一组过程所组成的资源管理程序,
7、共同构成了一个操作系统的资源管理模块,我们称之为管程。管程的四个组成部分: 1.管程内部的共享变量; 2.管程内部的条件变量; 3.管程内部并行执行的进程; 4.对局部于管程内部的共享数据设置初始值的语句。2.4用管程实现进程和互斥: (1)用管程实现互斥:当几个进程调用某个管程的时候,在一个时刻仅允许一个进程进入管程。管程中仅允许一个进程处于活跃状态,但不表示管程中只有一个进程,可能存在因资源不足而阻塞的进程等。当一个进程调用管程中的过程时,首先检查管程中是否有进程处于活跃态,如果有,则阻塞调用进程,直到管程内部的进程离开管程或其他操作。管程的互斥操作是由管程内部的互斥信号量实现的,其初值为
8、1。(2)用管程实现同步:在管程中要设置一对同步操作原语,Wait()和Signal()操作,注意这里操作作用于条件变量,不具有累加功能,如果管程中的进程发出了一个信号量,而在对应的条件变量上没有阻塞等待的进程,则该信号量没有作用,会被丢失。为了区别阻塞等待进程和不同阻塞对应,设置了不同条件变量。 当一个进程申请资源未能满足时,将调用Wait()阻塞自己,并进入相应的阻塞队列。当某进程释放出一个临界资源以后,将用Signal()唤醒等待在该临界区资源上的一个阻塞进程。3.系统设计3.1核心技术及技术路线 a. 模拟生产者消费者之间的同步和互斥关系 b. 模拟操作系统中进程的并发与共享环境 关键
9、技术: c. 模拟控制各线程对临界资源有序的访问 d. 可视化技术路线:(如下图示)多生产者多消费者多缓冲区核心技术路线图:生产者消费者同步互斥并发可视化P()/ V()多线程Java Swing和awtThreadJava中的wait()和notify()wait()和notify()管程实现3.2功能设计 简注:本系统模拟了多生产者多消费者及多缓冲区的情况,并且可由使用者自行设置。 设置完毕进入主界面后,单击开始按钮即可开始,用户可以通过滑动杆来根据具体要求随时改变生产者及消费者的相对速度,并可以看到输出的进程跟踪信息。 模拟完成或途中,用户可以单击分析按钮查看统计信息。 确定结束可以单击
10、退出以退出系统。观察模拟情况,按需要调整生产或消费速度开始界面设置生产者、消费者数目,及缓冲区大小点击开始模拟点击分析按钮查看统计分析数据退出系统3.3数据结构设计注:以下各函数中的字符串形式参数,以及调用函数的实际字符串参数,如,1等,均是设计后期用于跟踪和分析进程,以及跟踪和分析进程调用管程的整个过程而引入的。主要数据结构(1):信号量类(模拟操作系统中的P,V操作): public class Semaphore /信号量(即P V操作的类)private int Value;/信号量值public Semaphore(int semValue)this.Value=semValue;
11、/构造函数 public synchronized void p(String s) /P操作(即申请资源)Value-;if(Value0)/没有可用资源tryframe.a1.append(+s+进入阻塞队列n);此处的是后期为完善程序,对进程调用管程的各个过程进行跟踪而引入的,其值为进程的名字。frame.a1.append是将内容写入分析界面。this.wait(); /因资源不足而阻塞自己catch(InterruptedException e) public synchronized void v(String ss)/V操作Value+;if(Value0)/判断有否发出sign
12、al操作的线程 next.v(s1+释放一个因发出signal操作而阻塞自己的线程n);/若有就释放一个 else mutex.v(s1+离开管程n+开放管程);/否则开放管程 public void Wait(Semaphore x_sem,Count x_count,String s1)x_count.Cvalue+;/等待资源的线程数加1,初始值为0System.out.print(Waitn);if(next_count0)/判断是否有发出signal操作的线程。因为发出此操作的线程会阻塞自己。next.v(释放一个因发出signal操作,唤醒了其他线程而阻塞自己的线程现在n);/若有
13、就释放一个System.out.print(释放一个发出signal操作的线程n);elsemutex.v(没有因发出signal操作而阻塞自己的线程,也没有当前线程的可用资源 在阻塞当前线程之前先开放管程,让其他线程有机会获得管程n);/否则开放管程System.out.print(开放管程n);x_sem.p(s1+线程因没有可用资源(即缓冲区)而);/等待资源的线程阻塞自己,X_sem初始化为0x_count.Cvalue-;/等待资源的线程数减1public void Signal(Semaphore x_sem,Count x_count,String s2)frame.a1.app
14、end(s2+执行Signal操作 若当前有等待资源的线程则唤醒该线程并阻塞自己。否则唤醒信号丢失n );if(x_count.Cvalue0)/判断是否有等待资源的线程System.out.print(Signaln);next_count+;/发出signal操作的线程数加1x_sem.v( 资源可用,唤醒等待资源的线程! (缓冲区不满或者不空) 现在n);/释放一个等待资源的线程next.p(s2+线程因发出Signal操作阻塞自己,等待已唤醒的线程退出管程或其他 事件 n);/发出signal操作的线程阻塞自己,一旦阻塞,以下的next_count-;将不会执行,等待被其他管程内部事件
15、的唤醒。next_count-;/发出signal操作的线程数减13.4核心算法(用管程解决生产者消费者的伪代码):type producer_consumer=moitor item Bk; /缓冲区个数 int in,out; /存取指针 int count; /缓冲区中产品个数 semaphore noffull,notempty; /条件变量 int notfull_count,notempty_count; define append,take; use enter,leave,wait,signal;void append(item &x) enter(IM); if(count=
16、k) wait(notfull,notfull_count,IM);/缓冲区已满 Bin=x; in=(in+1)%k; count+; /增加一个产品 signal(notempty,notempty_count,IM);/唤醒等待的消费者 leave(IM);void take(item &x) enter(IM); if(count=0) wait(notempty,notempty_count,IM);/缓冲区已满 x=Bout; out=(out+1)%k; count-; /增加一个产品 signal(notfull,notfull_count,IM);/唤醒等待的消费者 leav
17、e(IM);cobeginprocess producer_i() item x; produce(x); producer_consumer.append(x);process consumer_j() item x; producer_consumer.take(x); consume(x);coend 核心算法示意流程:入口出口生产者阻塞队列消费者阻塞队列enterwaitsignalleave资源可用具体操作发出signal而阻塞自己的队列YN开关管程唤醒唤醒阻塞阻塞阻塞等待进入管程的队列4.运行环境及调试分析本系统采用Java实现,可运行于装有JDK的WindowsXp及以上的操作系
18、统上,可用eclipse平台操作源程序。以下为系统运行截图:(1)开始界面:可设置生产者数目,消费者数目以及缓冲区大小。本次运行设置生产者数目为:6,消费者数目为:5,缓冲区大小为50点击上图中确定按钮进入主界面点击开始进行模拟:如上图所示:生产者和消费者的速度都是可调的,可依据具体需要而进行调节,系统的模拟现状会体现在相应的进度条上,界面中间的输出文字是追踪进程状态的提示。此外使用者可以随时暂停和继续模拟操作,当需要分析时可以点击分析按钮:进入分析界面在分析界面中用户可以得到基本的统计信息和模拟结果。分析完毕可以点击确定按钮,进入上一个界面,即主界面,可以继续模拟或退出系统。5.总结5.1实
19、践心得体会 通过本次实践,我们小组体会到了团队的力量是无穷的。同时,我们也了解到,在我们遇到一个较大的较难的任务时,如果将其分解,组员各尽其责,抓其重点,各各突破,最后重组为一个整体,完成这个任务是很容易的。这种思想,是我们因该学习的。不论是在以后的学习中,或是工作中,我们都因该具有这种团队协作能力,我们每个人都要能找准位置,为这个团队尽最大的努力。只有这样,我们团队才能获得成功,我们个人才能成功。 由于时间紧促以及个人能力的不足,模拟系统在功能上尚存在一些问题,在很多方面都有改进的空间。但总体上是实现应有的功能。对于巩固在操作系统原理课上所学的知识,加深对操作系统中进程同步和互斥、临界区管理
20、等问题认识和理解,有着很好的效果,同时也初步体会了软件设计流程。 5.2创新点(1)本课程设计的所有数据结构均按照理论课本设计,与理论结合紧密(2)在运行过程中消费者速度和生产者速度是可调的参考文献1孙钟秀.操作系统教程M.第4版.高等教育出版社:2008.42汤子瀛等 计算机操作系统M.修订版.西安:西安电子科技大学出版社,2001.8. 3Bill Evjen (美)等著 李铭 译 黄静 校 c#高级编程(第六版).北京:清华大学出版社,2008.10. 4孙卫琴,java面向对象编程M.北京:电子工业出版社,2006.7.5张尧学,史美林编著计算机操作系统教程(第2版) M北京:清华大学出版社,2000.6黄祥喜 计算机操作系统实验教程M. 广州:中山大学出版社,1994.