操作系统试验报告三大问题之生产者与消费者问题
计算机操作系统实验报告 题题目目 三三大大经经典典问问题题之之生生产产者者与与消消费费者者问问题题 一、一、课课程设计的性质与任务程设计的性质与任务 1、加深对并发协作进程同步与互斥概念的理解。通过编写 程序实现 进程 同步和互斥 ,使学 生掌握有 关进程 (线程) 同步与 互斥的原 理,以 及解决进程 (线程 )同步和 互斥的 算法,从 而进一 步巩固进 程(线 程)同步和 互斥等 有关的内 容。 2、掌握进 程和线程 的概念,进程( 线程)的 控制原 语或系统 调用的 使用。 3、了解 Windows2000/XP中多 线程的 并发执行 机制, 线程间的 同步 和互斥。学习使用 Windows2000/XP中基本的 同步对象 ,掌握相应的 API 函数。 4、培养学生能够独立进行知识综合,独立开发较大程序的能力。 5、培养提高学生软件开发能力和软件的调试技术。 6、培养学生开发大型程序的方法和相互合作的精神。 7、培养学生的创新意识。 8、培养学生的算法设计和算法分析能力。 9、培养学生对问题进行文字论述和文字表达的能力。 二二、课程设计的内容及其要求、课程设计的内容及其要求 在 Windows?XP 、Windows?2000等操作 系统下,使 用的 VC、VB、 Java 或 C 等编程语 言,采用 进程(线程)同步和互 斥的技术 编写程 序实现生产 者消费 者问题或 哲学家 进餐问题 或读者 -写者问题 或自 己设计一个 简单进 程(线程 )同步 和互斥的 实际问 题。 要要求求::(1)经 调试 后程序能 够正常 运行。 (2)采用多 进程或 多线程方 式运行 ,体现了 进程( 线程) 同步互斥的 关系。 (3)程序界 面美观 。 三、实验原理三、实验原理 本实验要求 利用 PV 操作实现 解决生产 者——消 费者问 题中的 同步问题。 此问题 描述的是 一群生 产者进程 在生产 产品并将 这些产 品提供给消 费者进 程去消费 ,在两 者之间设 置了一 个具有 n 个缓冲 区的缓冲池 ,生产 者进程将 它所生 产的产品 放入一 个缓冲区 ,消费 者进程可从 缓冲区 中取走产 品去消 费,但它 们之间 必须保持 同步, 即不允许消 费者进 程到一个 空缓冲 区去取产 品,也 不允许生 产者进 程向一个已 装满且 尚未取出 的缓冲 区中投放 产品, 并且生产 者消费 者互斥使用 缓冲区 。 四、实验原理图四、实验原理图 五、算法实现五、算法实现 (1) 有一个生产者线程ProduceThread, 有1 个消费者进程CustomerThread; 缓冲区为 shareList。 (2)使用线程同步:用 synchonizedsynchonized 关键字(加锁)使得一个时间内只能 有一个线程得到执行, 另一个线程必须等待当前线程执行完这个代码块以后 才能执行该代码块;;wait()wait()让线程进入等待状态;notifynotify()()函数唤醒一个 处于等待状态的线程。 (3)程序运行流程图如下: (如不在外部中断,程序将一直循环运行) 开始 生产者 仓 库 是 否 消费者 否 生 产 者 生 消 费 者 等是 消 费 者 消 生 产 者 等 唤 醒 消 费 六、源代码六、源代码 packagepackage 操作系统; /* *产品类 */ publicclasspublicclass Goods { intint id; String name; publicpublic String toString(){ returnreturn id+“ “+name; } 唤 醒 生 产 } packagepackage 操作系统; importimport /* * 消费者线程:有产品时可以取出,无产品时等待 */ publicclasspublicclassCustomerThreadextendsextends Thread{ privateprivateListshareList; CustomerThread(ListshareList){ thisthis.shareList=shareList; } publicvoidpublicvoid run(){ System.out.println(“消费线程已启动.“+shareList.size()); whilewhile(truetrue){ trytry{ synchronizedsynchronized(shareList){ whilewhile(shareList.size()==0){ //如果没有产品,消费线程则等待 shareList.wait(); } whilewhile(shareList.size()0){ System.out.println(“0){ shareList.wait(); } whilewhile(shareList.size()==0){ Goods gs = newnewGoods(); count++; gs.id=count; gs.name=“产品“+count; System.out.println(“-生产线程放入对象: “+gs.toString()); shareList.add(gs); //通知消费线程,队列中有对象了 shareList.notify(); } } }catchcatch(Exception ef){ ef.printStackTrace(); } } } //用来标记放入对象的每一个独立ID号 privatestaticintprivatestaticintcount=0; //与消费者线程或以共同存取的对象列表 privateprivateListshareList; } package 操作系统; public class Manage { //主函数 public static void main(String[] args){ //生产\消费线程交换对象的队列 //启动生产线程 newProduceThread(shareList).start(); //启动消费线程 newCustomerThread(shareList).start(); } } 七、运行结果七、运行结果 八、实验心得八、实验心得 在此次实验中我们模拟 PV?操作同步机构,来解决消费者与生产者这两 个进程之间的同步协调问题??。实验中值得注意的是解决进程同步需要做哪 些工作,如何利用信号量机制来?解决进程同步问题等等。通过本次实验, 我对操作系统的 p、v 有了进一步认识,深入了解了p、v 操作的实质和其重 要性,加深了我对操作系统中多线程机制的理解和认识,更让我认识到知识 的掌握,仅靠学习理论知识是远远不够的,要与实际动手操作相结合才能更 好地理解和分析问题。此外,我也发现自己在编程上仍存在较大的问题,本 次实验让我对 java 语言的线程编写水平有了提高。我日后会不断加深各方 面知识的学习,弥补自己的不足。实验给了我们实践的机会,给了我们理论 结合实际的机?会,从实验中可以学到很多东西,不仅仅是书本上的东西这 么简单,更是培养了我们动手能力和自学能