版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统进程同步的教学实践李志民1 赵一丁2 底恒3(中原工学院计算机学院,河南 郑州 450007)摘要:针对操作系统课程中,存在进程同步内容抽象、难以理解的教学实际,本文在分析进程相互制约关系的基础上,归纳出利用信号量机制实现进程同步、互斥的一般性解题思路,以“生产者-消费者问题”为例阐述了具体的解题步骤,在教学过程中结合基于java多线程的可编程操作代码,通过真实的运行结果把抽象知识变为易理解的知识,取得在理论教学方面提高学生学习兴趣、在实践教学方面提高学生实际动手能力的效果。关键词:进程;同步;互斥;信号量;多线程中图分类号:G642 文献标识码:A操作系统课程的进程同步问题是该课程的
2、核心知识点,也是学习难点。解决同步和互斥问题最常用的方法就是信号量机制,通过在程序算法中使用P、V 操作达到同步和互斥的目的1,信号量与P、V 操作是低级的同步机构,用它们很难表示复杂的并发性问题,在并发程序中的出现P、V 操作,使得程序正确性证明更加困难2。在教学过程中,发现很多学生对上课所讲的例子大部分都清楚它的算法,可是当遇到一个新的同步与互斥问题,很多学生觉得还是无从下手,感到困惑。下面以“生产者-消费者问题”为案例,从进程的相互制约关系入手,归纳出进程同步、互斥的解题思路和解题步骤,利用java代码实现多线程同步,把抽象的知识变为具体可理解知识,提高教学效果。1 进程同步、互斥的一般
3、性解题思路对于进程的同步与互斥问题,学会问题解决的分析过程,理清解决此类问题的解题思路,是很重要的。操作系统课程中利用信号量机制实现进程的互斥和同步,以记录型信号量为例,利用信号量的P、V操作解决进程同步问题的解题步骤,归纳如下:1.1 确定进程数和进程间的制约关系首先,分析待解决的实际问题,提炼出实际问题进程的数量;然后,根据各进程的活动描述,判断进程间的相互制约关系:(1)如果共享某种临界资源,进程间属于间接相互制约关系,称进程互斥;(2)如果进程间的合作带有前趋、后继关系,进程间属于直接相互制约关系,称进程同步;(3)同时存在互斥和同步两种制约关系。根据这三种制约关系,分别按1.2、1.
4、3、1.4进行处理。1.2 进程互斥的解题步骤(1)找出临界资源、临界区;(2)为每个临界资源设一个互斥信号量,如mutex,初始值为n;(n是临界资源的个数)(3)在临界区前加入wait(mutex)原语,作为进入区; 在临界区后加入signal(mutex)原语,作为退出区;注意:wait(mutex)和signal(mutex)成对出现在同一个进程中。1.3 进程同步的解题步骤(1)确定进程之间的前趋关系,画出前趋线;(2)为每条前趋线设一个同步信号量,如empty; (3)在前趋线的箭头前插入wait(empty)原语,作为进入区;箭尾后插入signal(empty)原语,作为退出区;
5、(4)同步信号量empty的初始值为n或0;(n为正整数,是申请资源的初始单位数)同步信号量的初值则要根据进程的初始状态确定,具体设置相应的值。一般情况下:不能率先执行的wait()原语,其信号量初值为0,否则为n; 注意:wait(empty)和signal(empty)成对出现在不同进程中。1.4进程互斥、同步同时存在时的解题步骤(1)如果进程间存在互斥和同步两种制约关系,分别按照2.2和2.3的解题步骤执行;(2)在同一个进程的进入区中可能会出现两个wait()原语,一定要先写同步信号量,后写互斥信号量;否则,可能出现死锁现象;(3)在同一个进程的退出区中可能会出现两个signal()原
6、语,书写顺序没有严格要求;规范的写法是:先写互斥信号量,后写同步信号量;注意:(1)一定要检查两个wait()原语的顺序,不能颠倒;(2)wait()和signal()必须成对出现,否则会出现死锁现象3,影响系统性能。1.5 用类Pacal 语言描述进程同步或互斥算法根据上面几个步骤分析的结果,就可以类Pacal 语言或其它语言实现同步与互斥的算法。初学者开始时可以按上述步骤解决同步和互斥问题,以上讲述的只是一般的求解规则,有一定的可操作性,但在实际应用中还是要针对具体情况,多做多想,领悟出其中的原理和窍门。2 基于信号量机制的“生产者-消费者问题”的同步算法以“多生产者-多消费者-多缓冲”问
7、题为例,给出进程同步与互斥的解题步骤。2.1 确定进程数和进程间的制约关系通过分析就会发现,该问题中生产者、消费者各是一类进程。并发执行过程如图1所示:生产者的执行过程: 消费者的执行过程:生产一个产品; 从缓冲区取产品;将产品放入缓冲区; 缓冲区计数减1;缓冲区计数加1; 消费; 表示进程之间的前趋关系 图1 生产者-消费者的制约关系两类进程既共享缓冲区计数这一临界资源,又具有“先放再取、取后再放”的两条前趋关系,进程间同时存在互斥和同步两种制约关系。2.2 解题步骤 进程同步的解题步骤(1)找出临界资源:共享缓冲区的计数;(2)为临界资源设一个互斥信号量,如mutex,初始值为1;(3)在
8、临界区前加入wait(mutex)原语、signal(mutex)原语;2.2.2 进程同步的解题步骤(1)确定进程之间“先放再取、取后再放”的两条前趋关系,画出前趋线;(2)为每条前趋线设一个同步信号量,分别是empty、full; (3)在前趋线的箭头前分别插入wait(empty)、wait(full),箭尾后插入signal(empty)、signal(full);(4)同步信号量empty的初始值为n(缓冲区的大小),full的初始值为0;2.2.3 用类Pacal 语言描述进程同步或互斥算法生产者进程: 消费者进程:生产一个产品; wait(full);wait(empty); w
9、ait(mutex);wait(mutex); 从缓冲区取产品;将产品放入缓冲区; 缓冲区计数减1;缓冲区计数加1; signal(mutex);signal(mutex); signal(empty)signal(full); 消费;注意:(1)wait(mutex)和signal(mutex)成对出现在同一个进程中。(2)wait(mutex)和signal(mutex)成对出现在不同进程中。(3)一定要检查两个wait()原语的顺序,不能颠倒;否则会出现死锁现象,影响系统性能。3 基于java多线程的“生产者-消费者问题”的同步实现操作系统的课程实验旨在加深学生对理论的理解。对于进程同步
10、问题,线程是轻型进程, Java为同步线程提供了两个方法:object类的wait()方法和notify()方法。当线程请求资源而未能满足时,调用wait()方法使线程等待,并将它排在等待队列上; 当线程对资源访问完后,通过notify()方法唤醒等待队列上的线程4。下面是实现生产者-消费者同步的完整的java可运行代码:public class Store private final int MAX; private int count; public Store(int n) MAX=n; count=0; public synchronized void addData() throws
11、 Exception while(count=MAX)this.wait(); count+; System.out.println(Thread.currentThread().getName()+ add a data:+count); this.notifyAll();public synchronized void removeData() throws Exception while(count=0)this.wait(); System.out.println(Thread.currentThread().getName()+ remove a data:+count); coun
12、t-; this.notifyAll(); class Producer extends Thread private Store s; public Producer(Store s)this.s=s; public void run() while(true) try s.addData();Thread.sleep(100); catch (Exception e) class Consumer extends Threadprivate Store s; public Consumer(Store s) this.s=s; public void run() while(true) t
13、ry s.removeData();Thread.sleep(100); catch (Exception e) public class TestPC public static void main(String args) Store s=new Store(100);Producer p1=new Producer(s);Producer p2=new Producer(s);Producer p3=new Producer(s);Producer p4=new Producer(s); p1.setName(P01);p2.setName(p02);p3.setName(P03); p
14、4.setName(p04);p1.start();p2.start();p3.start(); p4.start();Consumer c1=new Consumer(s);Consumer c2=new Consumer(s);Consumer c3=new Consumer(s);Consumer c4=new Consumer(s);c1.setName(c01); c2.setName(c02);c3.setName(c03);c4.setName(c04);c1.start();c2.start();c3.start();c4.start();编写测试类,同时调用多个生产者线程和消
15、费者线程,由于多线程并发执行,每次的执行结果可能不尽相同,下面分别是4个生产者线程和4个消费者线程两次并发执行的结果,如图2所示: 图2 P-C同步的两次运行结果通过多次执行结果的比较,可以直观地理解进程并发的实质,通过案例教学,可以清楚地观察进程互斥和同步的并发执行过程。4 总结如何让实验教学配合好理论教学,让枯燥无味的原理变成趣味十足的一门课程成为了教学改革的主要目标3。在讲解进程的同步与互斥这一比较复杂、抽象的内容时,需要先对问题进行分解,由浅入深,给出进程同步问题的一般性的解题步骤;结合java多线程案例,通过实际的运行结果,把抽象的知识变为具体可理解知识;可以在理论教学中调动了学生的
16、积极性,在实践教学中提高学生的实践能力,培养学生分析问题、解决问题的综合能力,对于提高计算机的教学质量、全面提高学生的素质有着重要的意义。参考文献:1 汤小丹,梁红兵,等. 计算机操作系统(修订版)M. 西安:西安电子科技大学出版社,2003.2 陈向群,杨芙清. 操作系统教程M.北京:北京大学出版社,2006.3 李瑛达,谢双杰.“操作系统”实例化教学的改革探讨J.计算机教育,2009(7)27-30.4 郑莉,王行言,马素霞.Java语言程序设计M. 北京:清华大学出版社,2008.Teaching Practice of Operating System Process Synchron
17、ization LI Zhi-min1,ZHENG Qiu-sheng2,DU Jun-li3 (Zhongyuan University of Technology, Henan, Zhengzhou, 450007)Abstract: The content of the abstract process of synchronization in is difficult to understand in the Operating System teaching practice. The article start with analyzing the relationship be
18、tween the process of mutual restraint and summarize general problem-solving ideas of using semaphores mechanism to achieve synchronization and mutual exclusion.It Specifics general problem-solving ideas as the Producer - Consumer problem example. In the teaching process, Actual operating results can be obser
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论