生产者消费者问题操作系统课程设计思路
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//System.out.print(""+this.toString()+"is
waitting\n");//**
}catch(InterruptedException e){}
}
}
模拟操作系统的P操作
public synchronized void v(String ss){//V操作
Value++;
mutex.v(s1+"离开管程\n"+"开放管程"); //否则开放管程
//frame.a1.append("线程即将要离开管 程,在离开之前开放管程\n"); }
//System.out.print("\n离开管程\n"); }
生产者消费者问题操作系统课程设计 思路
核心技术(2)续——核心函数
生产者消费者问题操作系统课程设计 思路
核心技术(2)续——核心函数
public void Signal(Semaphore x_sem,Count x_count,String s2) {
frame.a1.append(s2+"执行Signal操作 若当前有等待资源的 线程则唤醒该线程并阻塞自己。否则唤醒信号丢失\n ");
操作系统的P/V操作
public class Semaphore { //信号量(即P V操作的类) private int Value;//信号量值 public Semaphore(int semValue){ this.Value=semValue; }
类Semaphore的定义和重要方法方法
(2)在课程设计中发现了自身的不足,经过此锻炼,我们 逐步熟悉了软件开发流程,也初步学会如何把理论知识转 为实际应用。
生产者消费者问题操作系统课程设计 思路
系统演示
开始界面:
可设置生产 者数目,消 费者数目以 及缓冲区大 小,单击确 定即可
生产者消费者问题操作系统课程设计 思路
系统演示
主界面:
可按需要 调节生产 者和消费 者的速度, 如需统计 请单击分 析按钮
PS:mutex.p要使用到前面模拟的 P/V操作函数
public void leave(String s1) { frame.a1.append(s1+"当前正在执行管程的 leave操作\n"); if(next_count>0)//判断有否发出signal操作 的线程 {
next.v(s1+"释放一个因发出signal操作 而阻塞自己的线程\n");//若有就释放一个 //frame.a1.append("释放一个因发出signal 操作而阻塞自己的线程\n"); } else {
生产者消费者问题操作 系统课程设计思路
2020/11/8
生产者消费者问题操作系统课程设计 思路
目录二
5 6 7 8
工作总结 存在问题 改进及讨论 系统演示
生产者消费者问题操作系统课程设计 思路
目的及方法
本课程设计通过模拟计算机操作系统中 经典的“生产者—消费者问题”,巩固在操作系统 原理课上所学的知识,加深对操作系统中进程同步 和互斥、临界区管理等问题认识和理解,同时又了 解了软件设计的流程、方法以及思想,提高分析设 计以及编程的能力。
管程类InterfaceModule类的重要方法:
(1)public void enter()//进入管程
(2)public void leave()//离开管程
(3)public void Wait(Semaphore x_sem,Count x_count) //wait 函数
(4)public void Signal(Semaphore x_sem,Count x_count) //Signal 函数
生产者消费者问题操作系统课程设计 思路
3rew
演讲完毕,谢谢听讲!
再见,see you again
2020/11/8
生产者消费者问题操作系统课程设计 思路
if(x_count.Cvalue>0){//判断是否有等待资源的线程 System.out.print("Signal\n"); next_count++;//发出signal操作的线程数加1 x_sem.v(“ 资源可用,唤醒等待资源的线程!! (缓冲
区不满或者不空) 现在\n");//释放一个等待资源的线程 next.p(s2+"线程因发出Signal操作阻塞自己,等待已唤醒的线程 退出管程或其他 事件 \n");//发出signal操作的线程阻塞自己,一旦 阻塞,以下的next_count--;将不会执行,等待被其他管程内部事 件的唤醒。
public synchronized void p(String s){
//P操作(即申请资源)
Value--;
if(Value<0){//没有可用资源
try{
System.out.print(""+s+"进入阻塞队列\n");
frame.a1.append(""+s+"进入阻塞队列\n");
this.wait(); //因资源不足而阻塞自己
生产者消费者问题操作系统课程设计 思路
技术路线
Leabharlann Baidu
生产者—消费者
多生产者多消费者
同步
互斥
并发
可视化
管程实现
P()/ V()
Java中的 wait()和notify()
多线程
Thread
Java Swing和awt
生产者消费者问题操作系统课程设计 思路
核心技术(1)
模拟P、V操 作: PS:用Java中的wait()和notify()模拟
生产者消费者问题操作系统课程设计 思路
存在的问题
系统上的不足 :
(1)对于进程的追踪和管理尚不到位 (2)
自身上的不足 :
(1)对软件开发流程还不熟悉 (2)从理论到实践还有一定程度的困难
生产者消费者问题操作系统课程设计 思路
改进及讨论
(1)因为应用Java封装好的方法来阻塞和唤醒进程,不 知道其具体实现的方式和管理方式,已经自定义了一个 PCB类尝试跟踪进程,取得一定的效果,但还未完全实现 对其管理与控制。
up\n");//**
}
} }
模拟操作系统的V操作
生产者消费者问题操作系统课程设计 思路
核心技术(2)
管程的实现 : 管程类InterfaceModule类的属性
private Semaphor:e mutex;//进程调用管程之前所使用的互斥信号量
private Semaphore next;//发出signal操作的线程挂起自己的信号量 int next_count;//在next上等待的线程数
生产者消费者问题操作系统课程设计 思路
核心技术(2)续——核心函数
public void enter(String s) { mutex.p(s+"因无法进入管程而 ");//互斥的进入管程 frame.a1.append(""+s+"已经进入 管程\n"); //System.out.print("\n进入管程 \n"); }
if(Value<=0){
//System.out.print(""+ss+"唤醒");
frame.a1.append(""+ss+"\n");
frame.a1.append("唤醒一个等待资源的线程\n");
this.notify(); //释放一个等待资源的线程
//System.out.print(""+this.toString()+"is waking
public void Wait(Semaphore x_sem,Count x_count,String s1) { x_count.Cvalue++;//等待资源的线程数加1,初始值为0 System.out.print("Wait\n"); frame.a1.append(s1+"执行Wait操作 因资源不可用而该线程 即将 阻塞自己!! (缓冲区已满或者已为空)\n在阻塞自己之前,先判断是否有发出signal操作的线程。若 有,则释放之。否则准备开放管程。之后便阻塞自己 \n "); if(next_count>0)//判断是否有发出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初始化为0 x_count.Cvalue--;//等待资源的线程数减1 }
next_count--;//发出signal操作的线程数减1 } } }
生产者消费者问题操作系统课程设计 思路
核心技术图示 等待进入管程的队列
enter
入口
生产者阻塞队列
阻塞
消费者阻塞队列
唤醒
阻塞
N
资源可用 Y
wait 具体操作
signal
leave
开 关 管 程
阻塞 发 出
signal
而
阻
塞
自
己
的
唤醒
队
列
生产者出消费口者问题思操路作系统课程设计
测试情况及分析
生产者消费者问题操作系统课程设计 思路
工作总结
寒假期间:小组成员共同选定课题项目,商讨开发语 言,确定基本的技术路线,由组长完成程序框架及基 本结构和类的设计。 2月20日—2月27:完成了核心程序并进行基本测试, 编写出各类中的方法代码。完成方案幻灯片的制作。 2月28日—3月4日:完善核心程序。完成用户界面程序 的编写。 3月6日—3月7日:完成将各模块函数的组合,成功将 核心程序与界面融合。完成算法汇报PPT 3月8日:根据老师的要求改用管程实现,完善整体程 序。 3月9日—现在:完成总结汇报PPT,进行进程跟踪测 试分析。开始进行设计报告和提优论文的撰写。