《生产者消费者问题操作系统课程设计思路》由会员分享,可在线阅读,更多相关《生产者消费者问题操作系统课程设计思路(17页珍藏版)》请在金锄头文库上搜索。
1、目的及方法,技术路线,核心技术,测试情况及分析,4,1,2,3,OS课程设计总结汇报,目录一,工作总结,存在问题,改进及讨论,系统演示,8,5,6,7,目录二,目的及方法,本课程设计通过模拟计算机操作系统中经典的“生产者消费者问题”,巩固在操作系统原理课上所学的知识,加深对操作系统中进程同步和互斥、临界区管理等问题认识和理解,同时又了解了软件设计的流程、方法以及思想,提高分析设计以及编程的能力。,技术路线,生产者消费者,多生产者多消费者,同步,互斥,并发,可视化,P()/ V(),多线程,Java Swing和awt,Thread,Java中的 wait()和notify(),管程实现,核心技
2、术(1),模拟P、V操作:,public class Semaphore /信号量(即P V操作的类) private int Value;/信号量值 public Semaphore(int semValue) this.Value=semValue; ,PS:用Java中的wait()和notify()模拟操作系统的P/V操作,public synchronized void p(String s) /P操作(即申请资源) Value-; if(Value0)/没有可用资源 try System.out.print(“+s+“进入阻塞队列n“); frame.a1.append(“+s+“
3、进入阻塞队列n“); this.wait(); /因资源不足而阻塞自己 /System.out.print(“+this.toString()+“is waittingn“);/* catch(InterruptedException e) ,类Semaphore的定义和重要方法方法,模拟操作系统的P操作,public synchronized void v(String ss)/V操作 Value+; if(Value0)/判断有否发出signal操作的线程 next.v(s1+“释放一个因发出signal操作而阻塞自己的线程n“);/若有就释放一个 /frame.a1.append(“释放
4、一个因发出signal操作而阻塞自己的线程n“); else mutex.v(s1+“离开管程n“+“开放管程“);/否则开放管程/frame.a1.append(“线程即将要离开管程,在离开之前开放管程n“); /System.out.print(“n离开管程n“); ,核心技术(2)续核心函数,public void Wait(Semaphore x_sem,Count x_count,String s1) x_count.Cvalue+;/等待资源的线程数加1,初始值为0 System.out.print(“Waitn“); frame.a1.append(s1+“执行Wait操作 因资
5、源不可用而该线程 即将 阻塞自己!(缓冲区已满或者已为空)n在阻塞自己之前,先判断是否有发出signal操作的线程。若有,则释放之。否则准备开放管程。之后便阻塞自己 n “); if(next_count0)/判断是否有发出signal操作的线程。因为发出此操作的线程会阻塞自己。 next.v(“释放一个因发出signal操作,唤醒了其他线程而阻塞自己的线程 现在n“);/若有就释放一个 System.out.print(“释放一个发出signal操作的线程n“); else mutex.v(“没有因发出signal操作而阻塞自己的线程,也没有当前线程的可用资源 在阻塞当前线程之前先开放管程,
6、让其他线程有机会获得管程n“);/否则开放管程 System.out.print(“开放管程n“); x_sem.p(s1+“线程因没有可用资源(即缓冲区)而“);/等待资源的线程阻塞自己,X_sem初始化为0 x_count.Cvalue-;/等待资源的线程数减1 ,核心技术(2)续核心函数,public void Signal(Semaphore x_sem,Count x_count,String s2) frame.a1.append(s2+“执行Signal操作 若当前有等待资源的线程则唤醒该线程并阻塞自己。否则唤醒信号丢失n “);if(x_count.Cvalue0)/判断是否有
7、等待资源的线程System.out.print(“Signaln“);next_count+;/发出signal操作的线程数加1x_sem.v(“ 资源可用,唤醒等待资源的线程! (缓冲 区不满或者不空) 现在n“);/释放一个等待资源的线程 next.p(s2+“线程因发出Signal操作阻塞自己,等待已唤醒的线程退出管程或其他 事件 n“);/发出signal操作的线程阻塞自己,一旦阻塞,以下的next_count-;将不会执行,等待被其他管程内部事件的唤醒。next_count-;/发出signal操作的线程数减1 ,核心技术图示,入口,出口,等待进入管程的队列,生产者阻塞队列,消费者阻
8、塞队列,enter,wait,signal,leave,资源可用,具体操作,发出signal而阻塞自己的队列,Y,N,开关管程,唤醒,唤醒,阻塞,阻塞,阻塞,测试情况及分析,工作总结,寒假期间:小组成员共同选定课题项目,商讨开发语言,确定基本的技术路线,由组长完成程序框架及基本结构和类的设计。 2月20日2月27:完成了核心程序并进行基本测试,编写出各类中的方法代码。完成方案幻灯片的制作。 2月28日3月4日:完善核心程序。完成用户界面程序的编写。 3月6日3月7日:完成将各模块函数的组合,成功将核心程序与界面融合。完成算法汇报PPT 3月8日:根据老师的要求改用管程实现,完善整体程序。 3月
9、9日现在:完成总结汇报PPT,进行进程跟踪测试分析。开始进行设计报告和提优论文的撰写。,存在的问题,系统上的不足:,(1)对于进程的追踪和管理尚不到位,(2),自身上的不足:,(1)对软件开发流程还不熟悉,(2)从理论到实践还有一定程度的困难,改进及讨论,(1)因为应用Java封装好的方法来阻塞和唤醒进程,不知道其具体实现的方式和管理方式,已经自定义了一个PCB类尝试跟踪进程,取得一定的效果,但还未完全实现对其管理与控制。,(2)在课程设计中发现了自身的不足,经过此锻炼,我们逐步熟悉了软件开发流程,也初步学会如何把理论知识转为实际应用。,系统演示,开始界面:,可设置生产者数目,消费者数目以及缓冲区大小,单击确定即可,系统演示,主界面:,可按需要调节生产者和消费者的速度,如需统计请单击分析按钮,系统演示,分析界面:,可以得到统计数据也可从滚动面板中看出各线程的状态,