利用信号量PV管程等解决生产者消费者问题操作系统课程设计论文.docx
- 文档编号:30045468
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:16
- 大小:315.84KB
利用信号量PV管程等解决生产者消费者问题操作系统课程设计论文.docx
《利用信号量PV管程等解决生产者消费者问题操作系统课程设计论文.docx》由会员分享,可在线阅读,更多相关《利用信号量PV管程等解决生产者消费者问题操作系统课程设计论文.docx(16页珍藏版)》请在冰豆网上搜索。
利用信号量PV管程等解决生产者消费者问题操作系统课程设计论文
操作系统原理课程设计
提优论文
题目:
利用管程解决“生产者—消费者”问题
姓名:
学院:
信息科技学院
专业:
网络工程
班级:
网工81班
学号:
指导教师:
2011年3月20日
利用管程解决“生产者—消费者”问题
摘要:
现代操作系统引入并发程序设计技术之后,程序的执行不再是顺序的,封闭的。
在多个进程并发运行的过程中,进程之间可能产生相互制约的关系,即竞争和协作。
为了协调各进程有序正确的进行,就需要各进程间能相互通信。
如果各进程之间不加以来控制,就会产生错误,如与时间有关的错误等。
这就需要考虑进程之间的同步和互斥等问题。
操作系统中经典的“生产者—消费者”问题正反映了进程并发执行的这种关系。
本课程设计所完成的就是对“生产者—消费者”问题的模拟,本系统根据操作系统中并发进程、临界区、同步和互斥等基本概念及理论进行设计,采用Java语言实现,用管程来对进程进行模拟同步和互斥的控制。
本系统可按照用户设定的生产者消费者数目及缓冲区大小来进行模拟演示。
这对深入理解操作系统中进程的同步和互斥问题,探求对进程控制方法的学习上有重大意义。
关键字:
管程;进程同步;进程互斥;临界资源
1.研究目的及意义
本课程设计通过模拟计算机操作系统中经典的“生产者—消费者问题”,巩固在操作系统原理课上所学的知识,加深对操作系统中进程同步和互斥、临界区管理,管程等问题的认识和理解。
前期主要利用P、V信号量来控制各进程间的同步于互斥关系,确保各进程有序正确的进行。
然而,我们也知道,使用信号量和P、V操作在实现进程同步时,对共享资源的管理分散于各个进程中,进程能够直接对共享变量进行处理,不利于系统对系统资源的管理,容易造成程序设计错误。
因此,在后期我们改用管程来实现,目的是想把资源集中起来统一管理,即把相关的共享变量及其操作集中在一起统一的控制和管理,使各并发进程间的相互作用更为清晰。
当然,我们本次课程设计也为我们了解软件设计的流程、方法以及思想,提高分析设计以及编程的能力提供了基础。
2.理论基础及分析
2.1问题的引入
在操作系统引入并发程序设计技术之后,程序的执行不再是顺序和封闭的,程序外部的顺序特性消失,程序与计算不再一一对应。
于是人们引入进程来描述这种变化。
而一组进程在执行的时间上是重叠的,即进程并发执行。
在多个进程并发运行的过程中,进程之间可能是无关的,也可能是交互的。
交互进程之间可能产生的关系,包括竞争和协作。
竞争和协作就会出现对统一资源进行操作,进而引入临界区的概念——并发进程中与共享变量有关的程序段称为临界区,共享变量所代表的资源成为临界资源。
如不对临界区进行管理就会产生一些与时间有关的错误。
在操作系统有多种方法可以实现对临界区、临界资源的管理。
其中最基本的方法是设置相应的信号量和P、V操作。
2.2信号量和P、V操作
为了能让多个进程通过特殊变量展开交互,一个进程在某一关键点上被迫停止执行直至收到对应的特殊变量,通过这一措施,来达到复杂进程间的交互,这种特殊变量就是信号量。
为了能够用信号量传送信号,进程可用P、V两个特殊操作来发送和接收信号,如果协作进程的相应信号仍未送到,则进程被挂起直至信号达到为止。
P、V操作的实现,是本次课程设计的基础,也是一个重点。
本次设计能够成功,有一定的偶然性。
即充分的借助于JAVA虚拟机提供的两个与线程有关的最重要的两个函数,即wait()和notify()。
我们都知道,实现P、V操作的重点是如何将进程阻塞在相应的阻塞队列,以及如何唤醒相应的阻塞进程,而不会出现错误。
要实现这一点,有一定的难度。
前期,我们做过尝试,但最终以失败而告终。
最后,我们找到了JAVA虚拟机提供两个函数来实现我们的目的。
函数如下:
wait()执行该方法的线程释放对象的锁,Java虚拟机把该线程放到该对象的等待池中。
notify()执行该方法的线程唤醒在该对象等待池中等待的一个线程。
因为JAVA是面向对象的一门编程语言,一切属性与方法都与对象绑定,而这一点正是我们要解决的难点:
如何将进程阻塞在相应的阻塞队列,以及如何唤醒相应的阻塞进程。
可以说,我们是把这个难题交给了JAVA虚拟机来处理。
但此种方法把资源交给各进程进行管理,容易出现进程有意或无意的破坏,所以我们才用管程来控制。
2.3管程的基本概念
代表共享资源的数据结构,以及由对该共享数据结构实施操作的一组过程所组成的资源管理程序,共同构成了一个操作系统的资源管理模块,我们称之为管程。
管程的四个组成部分:
1.管程内部的共享变量;
2.管程内部的条件变量;
3.管程内部并行执行的进程;
4.对局部于管程内部的共享数据设置初始值的语句。
2.4用管程实现进程和互斥:
(1)用管程实现互斥:
当几个进程调用某个管程的时候,在一个时刻仅允许一个进程进入管程。
管程中仅允许一个进程处于活跃状态,但不表示管程中只有一个进程,可能存在因资源不足而阻塞的进程等。
当一个进程调用管程中的过程时,首先检查管程中是否有进程处于活跃态,如果有,则阻塞调用进程,直到管程内部的进程离开管程或其他操作。
管程的互斥操作是由管程内部的互斥信号量实现的,其初值为1。
(2)用管程实现同步:
在管程中要设置一对同步操作原语,Wait()和Signal()操作,注意这里操作作用于条件变量,不具有累加功能,如果管程中的进程发出了一个信号量,而在对应的条件变量上没有阻塞等待的进程,则该信号量没有作用,会被丢失。
为了区别阻塞等待进程和不同阻塞对应,设置了不同条件变量。
当一个进程申请资源未能满足时,将调用Wait()阻塞自己,并进入相应的阻塞队列。
当某进程释放出一个临界资源以后,将用Signal()唤醒等待在该临界区资源上的一个阻塞进程。
3.系统设计
3.1核心技术及技术路线
a.模拟生产者消费者之间的同步和互斥关系
•
•b.模拟操作系统中进程的并发与共享环境
•关键技术:
•c.模拟控制各线程对临界资源有序的访问
•
•d.可视化
技术路线:
(如下图示)
核心技术路线图:
3.2功能设计
简注:
本系统模拟了多生产者多消费者及多缓冲区的情况,并且可由使用者自行设置。
设置完毕进入主界面后,单击开始按钮即可开始,用户可以通过滑动杆来根据具体要求随时改变生产者及消费者的相对速度,并可以看到输出的进程跟踪信息。
模拟完成或途中,用户可以单击分析按钮查看统计信息。
确定结束可以单击退出以退出系统。
3.3数据结构设计
注:
以下各函数中的字符串形式参数,以及调用函数的实际字符串参数,如s,ss,s1等,均是设计后期用于跟踪和分析进程,以及跟踪和分析进程调用管程的整个过程而引入的。
主要数据结构
(1):
信号量类(模拟操作系统中的P,V操作):
publicclassSemaphore{//信号量(即PV操作的类)
privateintValue;//信号量值
publicSemaphore(intsemValue){
this.Value=semValue;
}//构造函数
publicsynchronizedvoidp(Strings){//P操作(即申请资源)
Value--;
if(Value<0){//没有可用资源
try{
frame.a1.append(""+s+"进入阻塞队列\n");//此处的s是后期为完善程序,对进程调用管程的各个过程进行跟踪而引入的,其值为进程的名字。
frame.a1.append是将内容写入分析界面。
this.wait();//因资源不足而阻塞自己
}catch(InterruptedExceptione){}
}
}
publicsynchronizedvoidv(Stringss){//V操作
Value++;
if(Value<=0){
frame.a1.append("唤醒一个等待资源的线程\n");//将内容写入分析界面
this.notify();//释放一个等待资源的线程
}
}
}
主要数据结构
(2):
管程类:
publicclassInterfaceModule{
privateSemaphoremutex;//进程调用管程之前所使用的互斥信号量
privateSemaphorenext;//发出signal操作的线程挂起自己的信号量
intnext_count;//在next上等待的线程数
Mainframe;
publicInterfaceModule(Mainframe){
this.frame=frame;
mutex=newSemaphore(1,frame);//初始化互斥信号量
next=newSemaphore(0,frame);
next_count=0;
}//构造函数
PS:
以下四个函数是本次设计中的四个核心函数:
publicvoidenter(Strings){
mutex.p(s+"因无法进入管程而");//互斥的进入管程
frame.a1.append(""+s+"已经进入管程\n");
}
publicvoidleave(Strings1){
frame.a1.append(s1+"当前正在执行管程的leave操作\n");
if(next_count>0)//判断有否发出signal操作的线程
{
next.v(s1+"释放一个因发出signal操作而阻塞自己的线程\n");//若有就释放一个
}
else
{
mutex.v(s1+"离开管程\n"+"开放管程");//否则开放管程
}
}
publicvoidWait(Semaphorex_sem,Countx_count,Strings1){
x_count.Cvalue++;//等待资源的线程数加1,初始值为0
System.out.print("Wait\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
}
publicvoidSignal(Semaphorex_sem,Countx_count,Strings2){
frame.a1.append(s2+"执行Signal操作若当前有等待资源的线程则唤醒该线程并阻塞自己。
否则唤醒信号丢失\n");
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--;将不会执行,等待被其他管程内部事件的唤醒。
next_count--;//发出signal操作的线程数减1
}
}
}
3.4核心算法
(用管程解决生产者—消费者的伪代码):
typeproducer_consumer=moitor
itemB[k];//缓冲区个数
intin,out;//存取指针
intcount;//缓冲区中产品个数
semaphorenoffull,notempty;//条件变量
intnotfull_count,notempty_count;
defineappend,take;
useenter,leave,wait,signal;
voidappend(item&x){
enter(IM);
if(count==k)
wait(notfull,notfull_count,IM);//缓冲区已满
B[in]=x;
in=(in+1)%k;
count++;//增加一个产品
signal(notempty,notempty_count,IM);//唤醒等待的消费者
leave(IM);
}
voidtake(item&x){
enter(IM);
if(count==0)
wait(notempty,notempty_count,IM);//缓冲区已满
x=B[out];
out=(out+1)%k;
count--;//增加一个产品
signal(notfull,notfull_count,IM);//唤醒等待的消费者
leave(IM);
}
cobegin
processproducer_i(){
itemx;
produce(x);
producer_consumer.append(x);
}
processconsumer_j(){
itemx;
producer_consumer.take(x);
consume(x);
coend
核心算法示意流程:
4.运行环境及调试分析
本系统采用Java实现,可运行于装有JDK的WindowsXp及以上的操作系统上,可用eclipse平台操作源程序。
以下为系统运行截图:
(1)开始界面:
可设置生产者数目,消费者数目以及缓冲区大小。
本次运行设置生产者数目为:
6,消费者数目为:
5,缓冲区大小为50
点击上图中确定按钮进入主界面
点击开始进行模拟:
如上图所示:
生产者和消费者的速度都是可调的,可依据具体需要而进行调节,系统的模拟现状会体现在相应的进度条上,界面中间的输出文字是追踪进程状态的提示。
此外使用者可以随时暂停和继续模拟操作,当需要分析时可以点击分析按钮:
进入分析界面
在分析界面中用户可以得到基本的统计信息和模拟结果。
分析完毕可以点击确定按钮,进入上一个界面,即主界面,可以继续模拟或退出系统。
5.总结
5.1实践心得体会
通过本次实践,我们小组体会到了团队的力量是无穷的。
同时,我们也了解到,在我们遇到一个较大的较难的任务时,如果将其分解,组员各尽其责,抓其重点,各各突破,最后重组为一个整体,完成这个任务是很容易的。
这种思想,是我们因该学习的。
不论是在以后的学习中,或是工作中,我们都因该具有这种团队协作能力,我们每个人都要能找准位置,为这个团队尽最大的努力。
只有这样,我们团队才能获得成功,我们个人才能成功。
由于时间紧促以及个人能力的不足,模拟系统在功能上尚存在一些问题,在很多方面都有改进的空间。
但总体上是实现应有的功能。
对于巩固在操作系统原理课上所学的知识,加深对操作系统中进程同步和互斥、临界区管理等问题认识和理解,有着很好的效果,同时也初步体会了软件设计流程。
5.2创新点
(1)本课程设计的所有数据结构均按照理论课本设计,与理论结合紧密
(2)在运行过程中消费者速度和生产者速度是可调的
参考文献
[1]孙钟秀.操作系统教程[M].第4版.高等教育出版社:
2008.4
[2]汤子瀛等计算机操作系统[M].修订版.西安:
西安电子科技大学出版社,2001.8.
[3]BillEvjen(美)等著李铭译黄静校c#高级编程(第六版).北京:
清华大学出版社,2008.10.
[4]孙卫琴,java面向对象编程[M].北京:
电子工业出版社,2006.7.
[5]张尧学,史美林编著.《计算机操作系统教程(第2版)》[M].北京:
清华大学出版社,2000.
[6]黄祥喜计算机操作系统实验教程[M].广州:
中山大学出版社,1994.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 信号量 PV 管程 解决 生产者 消费者 问题 操作系统 课程设计 论文