操作系统进程管理演示系统开发生产者消费者毕业设计.docx
- 文档编号:27464655
- 上传时间:2023-07-01
- 格式:DOCX
- 页数:75
- 大小:190.13KB
操作系统进程管理演示系统开发生产者消费者毕业设计.docx
《操作系统进程管理演示系统开发生产者消费者毕业设计.docx》由会员分享,可在线阅读,更多相关《操作系统进程管理演示系统开发生产者消费者毕业设计.docx(75页珍藏版)》请在冰豆网上搜索。
操作系统进程管理演示系统开发生产者消费者毕业设计
本科生毕业设计(论文)
(2008届)
工程技术系
题目:
操作系统进程管理演示系统开发(生产者-消费者)
学生姓名:
学号:
专业名称:
班级:
指导教师姓名:
系(部):
信息工程学院
职称:
副教授
2008年5月16日
操作系统进程管理演示系统的研究与实现
摘要:
操作系统是计算机专业最重要的基础课程之一,其中同步问题是最难的部分。
本文通过分析操作系统进程同步与互斥的问题,然后利用P,V操作实现进程同步与互斥,并利用该算法设计了生产者-消费者模拟演示系统。
通过该演示系统展现进程的管理(生产者-消费者)可以用于操作系统的教学中。
关键词:
生产者-消费者问题;进程;同步;互斥
ResearchandImplementationofProcessManagementSystemDemonstration
Abstract:
Computeroperatingsystemisoneofthemostimportantbasiccourses,andsynchronizationisoneofthemostdifficultpart.Thispaperwillanalyzetheprocessoftheoperatingsystemsimultaneouslywiththeproblemofmutualexclusion,andthenusingP,Vsynchronizationachievingtheoperationabouttheprocessofmutuallyexclusive,andusingthealgorithmdesignoftheproducers-consumersmockdemonstrationsystem.Throughthedemonstrationsystemabouttheprocessofmanagement(producers-consumers)canbeusedfortheteachingoftheoperatingsystem.
Keywords:
producers;consumers;theprocessofsynchronization,;mutex
1引言
1.1选题的意义
操作系统(简称OS-operatingsystem)是高等教育计算机应用专业教学计划中一门重要的专业基础课程。
众所周知,计算机是各种信息系统的核心,CPU被喻为计算机系统的心脏,OS被喻为计算机系统的大脑,是用户与计算机系统打交道的环境界面,心脏和大脑的紧密配合,才使计算机系统成为电子时代、信息社会无所不在的基础设施[1]。
OS是在计算机原理与数据结构的基础上的一门提高性课程,是了解和掌握计算机应用系统的基础。
其任务是了解操作系统的基本概念,理解计算机系统的资源(软件资源和硬件资源)如何组织,OS如何有效地管理这些系统资源,用户如何通过OS与计算机系统打交道。
通过学习OS可以进一步理解在计算机系统上运行的其他各类OS并懂得在OS支持下建立自己的应用系统,因此OS是计算机应用的基础[2]。
进程同步包括进程的互斥和进程的同步两个方面,是操作系统管理共享资源的一种手段.也是操作系统学习中的难点。
操作系统教学中有最经典的四个同步、互斥问题为:
生产者——消费者问题、哲学家进餐问题、理发师在空闲中的睡眠问题、读者——作者问题,深入地分析和理解这些问题,对全面掌握同步、互斥问题大有益处,对学校操作系统这门课也有很重要的意义。
1.1.1开发系统的背景
有关操作系统的教材大多注重理论,而绝大多数学习者一生都不可能参于操作系统的研究工作,他们需要的是对理论的理解和对实用系统的灵活应用。
进程同步与互斥的实现是操作系统中的重点内容,也是学习的难点部分。
生产者-消费者问题是经典同步问题之一,不但在操作系统中很重要,而且在分布式应用开发、实时数据库管理系统、CIMS网络工程中都会遇到。
但是以往人们只能从原理上加以理解,没有直观的认识,因而无法实际使用它。
在现代操作系统UNIX、Windows多进程环境下,我们将利用C语言实现多个生产者-消费者可视化同步运行。
1.1.2开发系统的目的
操作系统是计算机学科中的一门重要课程。
对于学习者来说,进程的同步与互斥问题是个令人头痛的问题,尤其是进程同步与互斥算法的实现,更让人往往不知如何下手。
本文通过具体实例,给出了利用、操作解决进程同步与互斥问题的简单方法。
在操作系统教学过程中,因为部分教科书中对生产者和消费者问题的解释不够全面,学生在理解应用过程中经常出现一些问题。
所以本文对生产者和消费者问题算法进行描述,利用操作系统进程管理演示系统(生产者-消费者)进行模拟演示。
1.1.3开发系统的意义
采用信号量机制与PV操作来协调进程的同步,一直是操作系统教学中的一个难点问题,而且由它引出的一系列问题,如:
生产者与消费者、读者与写者、哲学家进餐、理发师等问题都是很典型的进程同步与互斥问题。
这类题型变化多、实例多,又与实际生活中的问题有着紧密联系[3]。
“进程调度”涉及到操作系统的内核操作,原理性较强,也较为抽象,如只是依靠书本的文字和图形,学生理解起来会很吃力。
在操作系统课教学中,就引入了可视化设计帮助学生理解。
操作系统进程管理演示系统(生产者-消费者)可以可视化的向学生展示进程调度,便于教学工作,提高学生的学习效率。
1.2P,V操作的简介
1.2.1P,V操作的介绍
在操作系统中P,V操作是一种原语操作,是不可分割的操作,它要么执行完毕,要么就不执行,也就是说P,V操作一旦执行就不允许被中断,直到执行完成为止。
P,V操作主要通过对信号量的操作来实现对资源的控制,从而控制进程的执行。
信号量是和特定资源相对应的数据结构,由整型数值和指针两部分所组成,其中整型数值表示资源情况,只能由P,V操作来改变,它有三种值:
S>0表示当前可用资源的数量;
S<0其绝对值表示当前等待该类资源的进程数量;
=0表示当前没有可用资源也没进程等待该类资源。
P操作相当于申请资源,进程在使用资源之前,应先调用操作申请所须资源,若资源申请被满足,则进程可以继续执行,否则进程将调用阻塞原语阻塞自己。
P(S)的具体执行过程如下:
①S=S-1;②若S≥0,则进程继续执行;③若S<0,则进程被阻塞,并且该进程的PCB被插到信号量S所对应PCB的等待队列的末尾。
V操作相当于释放资源,进程在使用所申请的资源后,应调用V操作释放所占用的资源。
当释放资源时,进程应考察是否有进程正在等待该类资源,若有,则释放资源的进程有义务调用唤醒原语唤醒等待进程。
V(S)的执行过程如下:
①S=S+1;②若S>0,则进程继续执行;③若S≤0,则调用唤醒原语唤醒等待该资源的进程,原进程继续执行。
1.2.2进程同步的实现
进程同步是指为了共同完成某项任务,具有伙伴关系的进程在执行时间次序上必须遵循确定的规律。
多个进程为了共同完成任务,须要按照一定的次序去执行,各个进程在执行时在时间上具有明显的先后次序,即进程必须按照一定的顺序去执行。
这和进程互斥明显不同。
实现进程同步的关键在于当一个进程执行以后,确定下一个将要执行的进程,并用V操作使该进程可以执行。
在实现时,我们可以在各进程中完成特定功能的程序段两端加上P操作和V操作,它们分别使用不同的信号量,用以在各进程间传递信息。
通常,能够最先执行的进程中,P操作中所使用的信号量的初值大于,而其它进程中,第一个P操作所对应的信号量的初值为零。
这样,在执行时,第一个进程先执行,执行完V操作后,使另一个进程可以执行,依次传递下去,就可以实现各个进程按照一定的顺序执行了。
1.2.3进程互斥的实现
进程互斥是进程间由于竞争资源而产生的相互制约关系。
对于多个使用同一资源的进程,它们对于资源的竞争导致它们在执行时的异步性特征。
竞争到资源的进程可以立即投入运行,而没有竞争到资源的进程只能阻塞自己以等待资源。
进程中用以访问这种被竞争的独占资源(临界资源)的程序段叫做临界区。
要使多个进程不会同时访问临界资源,只需要让它们在执行时不会同时执行临界区内的代码就可以了。
因此我们可以在各进程的临界区的两端分别加入对于同一个初值为的1信号量的P,V操作,就可以实现当一个进程进人临界区后,其它进程不能够再进入临界区,直到先前进人临界区的进程退出临界区后,通过V操作唤醒其它某个等待进程后,才会有进程再次访问临界资源,从而实现多个进程对于临界资源的互斥访问。
1.3生产者-消费者问题的描述
1.3.1问题的描述
设有若干个生产者进程P1,P2,P3,…Pl;若干个消费者进程C1,C2,C3,…Cm,它们通过一个由n个缓冲区组成的有界缓冲池联系起来。
每个缓冲区存放一个“产品”,生产者进程不断地生产产品,并把它们放入缓冲池内,消费者进程不断地从缓冲池内取产品并消费之。
这里既要求同步,也需要恰当地互斥。
同步存在于p、c两类进程之间:
当缓冲池已放满了产品(供过于求),生产者进程必须等待;当缓冲池已空(供不应求),消费者应等待。
互斥存在于所有进程之间,各自需要独占地使用缓冲区。
1.3.2模型分析
1.单缓冲区的单生产者-单消费者问题模型限制条件:
整个系统仅有唯一的一个缓冲区,活动进程仅有一个生产者Producer和一个消费者Consumer。
进程关系分析:
同步关系:
只有在Producer向缓冲区放入物品后,Consumer才能够从缓冲区中取出物品消费;因此存在Consumer对于Producer的同步依赖。
(2)只有在Consumer从缓冲区取出物品后,Producer才能够继续向缓冲区中放入新生产的物品;因此存在Producer对于Consumer的同步依赖。
互斥关系:
Producer放入物品的同时,Consumer是不能从缓冲区中取出物品的;反之亦然。
因此存在Producer和Consumer之间的互斥关系。
2.单缓冲区的多生产者-多消费者问题模型限制条件:
整个系统仅有唯一的一个缓冲区,活动进程有n个生产者Producer和m个消费者Consumer。
进程关系分析
同步关系:
(1)对于任意的i(1≤i≤n),j(1≤j≤m),只有在ProducerI向缓冲区放入物品后,ConsumerJ才能够从缓冲区中取出物品消费;因此存在ConsumerJ对于ProducerI的同步依赖。
(2)对于任意的i(1≤i≤n),j(1≤j≤m),只有在ConsumerJ从缓冲区取出物品后,ProducerI才能够继续向缓冲区中放入新生产的物品;因此存在ProducerI对于ConsumerJ的同步依赖。
互斥关系:
(1)对于任意的i(1≤i≤n),j(1≤j≤m),ProducerI放入物品的同时,ConsumerJ是不能从缓冲区中取出物品的;反之亦然。
因此存在ProducerI和ConsumerJ之间的互斥关系。
(2)对于任意的i(1≤i≤n),j(1≤j≤n),i≠j,ProducerI放入物品的同时,ProducerJ是不能放入物品的。
因此存在ProducerI和ProducerJ之间的互斥关系。
(3)对于任意的i(1≤i≤m),j(1≤j≤m),i≠j,ConsumerI从缓冲区中取出物品的同时,ConsumerJ是不能从缓冲区中取出物品的。
因此存在ConsumerI和ConsumerJ之间的互斥关系。
3.多缓冲区的单生产者-单消费者问题模型限制条件:
整个系统有K个缓冲区,活动进程仅有一个生产者Producer和一个消费者Consumer。
进程关系分析
同步关系:
(1)只有在Producer向缓冲区放入物品后,Consumer才能够从缓冲区中取出物品消费;因此存在Consumer对于Producer的同步依赖。
(2)只有在Consumer从缓冲区取出物品后,Producer才能够继续向缓冲区中放入新生产的物品;因此存在Producer对于Consumer的同步依赖。
互斥关系:
(1)对于任意的i(1≤i≤K),j(1≤j≤K),i≠j,Producer向空闲缓冲区Buffer[Ki]放入物品的同时,Consumer可以从满缓冲区Buffer[Kj]中取出物品;反之亦然。
因此Producer和Consumer之间不存在针对缓冲区的互斥关系。
(2)尽管Producer和Consumer之间不存在针对缓冲区的互斥关系,但由于Producer和Consumer都需要在操作缓冲区的同时对缓冲区队列进行维护,缓冲区队列也就成为两者间新的临界资源,因此Producer和Consumer之间出现了针对缓冲区队列的互斥关系。
4.多缓冲区的多生产者-多消费者问题模型限制条件:
整个系统有K个缓冲区,活动进程有n个生产者Producer和m个消费者Consumer。
进程关系分析
同步关系:
(1)对于任意的i(1≤i≤n),j(1≤j≤m),只有在ProducerI向缓冲区放入物品后,ConsumerJ才能够从缓冲区中取出物品消费;因此存在ConsumerJ对于ProducerI的同步依赖。
(2)对于任意的i(1≤i≤n),j(1≤j≤m),只有在ConsumerJ从缓冲区取出物品后,ProducerI才能够继续向缓冲区中放入新生产的物品;因此存在ProducerI对于ConsumerJ的同步依赖。
互斥关系:
(1)对于任意的i(1≤i≤n),j(1≤j≤m),s(1≤s≤K),t(1≤t≤K),s≠t,ProducerI向空闲缓冲区Buffer[Ks]放入物品的同时,ConsumerJ可以从满缓冲区Buffer[Kt]中取出物品;反之亦然。
因此ProducerI和ConsumerJ之间不存在针对缓冲区的互斥关系。
(2)对于任意的i(1≤i≤n),j(1≤j≤n),i≠j,
s(1≤s≤K),t(1≤t≤K),s≠t,ProducerI向空闲缓冲区Buffer[Ks]放入物品的同时,ProducerJ是可以向另一空闲缓冲区Buffer[Kt]放入物品的。
因此ProducerI和ProducerJ之间不存在针对缓冲区的互斥关系。
(3)对于任意的i(1≤i≤m),j(1≤j≤m),i≠j,s(1≤s≤K),t(1≤t≤K),s≠t,ConsumerI从空闲缓冲区Buffer[Ks]中取出物品的同时,ConsumerJ是可以从另一空闲缓冲区Buffer[Kt]中取出物品的。
因此ConsumerI和ConsumerJ之间不存在针对缓冲区的互斥关系。
(4)对于任意的i(1≤i≤n),j(1≤j≤n),i≠j,s(1≤s≤m),t(1≤t
≤m),s≠t,尽管ProducerI和ProducerJ之间、ConsumerS和ConsumerT之间、ProducerI和ConsumerS之间不存在针对缓冲区的互斥关系,但由于ProducerI、ProducerJ、ConsumerS和ConsumerT都需要在操作缓冲区的同时对缓冲区队列进行维护,缓冲区队列成为所有进程间的新的临界资源,因此ProducerI和ProducerJ之间、ConsumerS和ConsumerT之间、ProducerI和ConsumerS之间出现了针对缓冲区队列的互斥关系。
以上这四种情形是逐个包含关系,所以我们只要设计出能完成第四种条件下的生产者-消费者模拟系统。
2系统需求分析
2.1任务概述
2.1.1目标
学生通过该演示系统能形象的看到进程的调度,以便能更加透彻的理解操作系统中消费者-生产者的同步互斥问题。
2.1.2运行环境
操作系统:
WINDOWS98/2000/XP。
2.1.3编程工具
编程工具:
microsoftvisualc++。
VisualC++是一个功能强大的可视化软件开发工具。
自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。
VisualC++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrateddevelopmentenvironment,IDE)。
VisualC++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导ClassWizard等开发工具。
这些组件通过一个名为DeveloperStudio的组件集成为和谐的开发环境。
2.2演示系统的分析
2.2.1功能需求分析
1.操作系统进程管理演示系统是采用动画和交互的方式对生产者-消费者问题进行演示、教学。
2.学生可以输入生产者,消费者的数量来进行不同情形的的演示。
2.2.2系统功能模块划分
系统已经设定一个大小固定的缓冲池(缓冲池大小11),缓冲池可以实时的显示生产者生产情况和消费者的消费情况,同时用户可以设定生产者的数目来进行生产(生产者数目1-10);设定消费者的数目来进行消费(消费者数目1-10),由此系统可以模拟上面所描述的四种生产者-消费者模型,同时用户可以实时的停止生产者及消费者的动作,做到分步展示的效果,有效率的起到教学的作用。
2.2.3系统流程分析
1.算法的设计
P,V原语是操作系统中定义的,通过对信号量控制从而实现进程间同步的最基本操作。
采用P、V原语解决生产者-消费者问题的算法描述[4]。
采用P、V原语解决生产者/消费者问题的算法如下:
(1)信号量和互斥量的设置:
设代表缓冲池中空白缓冲区和满缓冲区的信号量分别为Empty和Full,Empty和Full的初值分别为n(缓冲池中缓冲区数)和0。
设两个互斥量MuxProducer和MuxCustomer,它们的初值都为1。
(2)生产者算法:
采集生成数据;P(Empty)申请一个空白缓冲;P(MuxPro2ducer)申请对空白缓冲资源独占使用;找出一空白缓冲区,把数据拷贝到缓冲区;V(MuxPro2ducer)释放对空白缓冲资源独占使用;V(Full)产生一个满缓冲区。
消费者算法:
做好接收准备;P(Full)申请一个满缓冲;P(MuxCustomer)申请对满缓冲资源独占使用。
找出一满缓冲区;把满缓冲区中数据拷贝到用户数据区。
V(MuxCustomer)释放对满缓冲资源独占使用;V(Empty)产生一个空白缓冲区进行数据处理。
2.算法流程图
图2.1P操作流程图
图2.2V操作流程图
3.在WINDOWS系统中的具体实现方法
在WINDOWS系统中,实现内存共享的办法可以采用共享变量[5]和共享内存文件[6]等方法。
为了通用性,采用了以上两种方法的结合,并把生产者和消费者中的加入数据到缓冲区和从缓冲区中取出数据的过程封装到一个DLL中[7],这样,可以大大方便应用程序的编制,也使进行应用程序设计的人员不必关心该问题中具体实现过程。
用户程序中只需要调用该DLL的函数就可以实现所需功能,而且由于这些函数是在DLL中,它们在内存中只有一个副本,这对当生产者和消费者群体数目较大时对内存空间的节省也是很可观的。
3系统实现
3.1程序结构
程序分为一个主函数、分别用于模拟消费和生产者的两个函数以及三个辅助性的函数。
主函数用于初始化缓冲区和各个同步对象,并完成线程信息的读入和记录,最后根据该组线程记录启动模拟线程,并等待所有线程的运行结束后退出整个程序。
消费者和生产者函数运行于相应线程中完成对缓冲区的读写动作,根据此处生产消费模型的特点,生产者和消费者线程之间通过同步对象的使用实现了生产和消费动作的同步与互斥,是本系统的核心所在。
另外三个辅助函数被生产者和消费者函数调用,是上述生产和消费函数中对缓冲区访问功能的一些包装。
3.1.1生产者模拟函数代码
intCProducerThread:
:
Run()
{
CPCDlg*pDlg;
pDlg=(CPCDlg*)this->m_Parent;
inttemp=0;
intt=0;
while(pDlg->m_continue){
DWORDtemp=WaitForMultipleObjects(SIZE_OF_BUFFER,pDlg->m_hEmptySemaphore,FALSE,INFINITE);
pDlg->m_PArray[temp]=1;
pDlg->m_PStr[temp]=this->m_name;
pDlg->InvalidateRect(CRect(17+temp*40,17,20+(temp+1)*40,200));
srand((unsigned)time(NULL));
t=rand()%5;
t+=1;
Sleep(t*750+500);
pDlg->m_Array[temp]=1;
pDlg->m_PArray[temp]=0;
pDlg->m_PStr[temp]="";
pDlg->InvalidateRect(CRect(17+temp*40,17,20+(temp+1)*40,200));
srand((unsigned)time(NULL));
t=rand()%10;
t+=10;
ReleaseSemaphore(pDlg->m_hFullSemaphore[temp],1,NULL);
Sleep(t*100);
}
this->ExitInstance();
returnCWinThread:
:
Run();
}
3.1.2消费者模拟函数代码
intCConsumerThread:
:
Run()
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
CPCDlg*pDlg;
pDlg=(CPCDlg*)this->m_Parent;
inttemp=0;
intt=0;
CStringstr;
while(pDlg->m_continue){
DWORDtemp=WaitForMultipleObjects(SIZE_OF_BUFFER,pDlg->m_hFullSemaphore,FALSE,INFINITE);
pDlg->m_CArray[temp]=1;
pDlg->m_CStr[temp]=this->m_name;
pDlg->InvalidateRect(CRect(17+temp*40,17,20+(temp+1)*40,200));
srand((unsi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 进程 管理 演示 系统 开发 生产者 消费者 毕业设计