生产者消费者问题操作系统课程设计思路

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

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

1 / 17
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功