操作系统实习报告.docx

精品文档 知识共享 操作系统课程实验报告 学生姓名: 乔宏永 班 学 号: 111112 指导教师: 袁国斌 中国地质大学信息工程学院 2012年 11 月 20日 实习题目:基于Windows进程互斥分析和模拟 【需求规格说明】 基于Microsoft Visual Studio环境的多线程编程验证互斥的原理,理解多线程编程中关键元素的定义与使用,通过使用Semaphore,mutex等控制元素,实现对生产者消费者模型的真实模拟,函数的功能与实现自己定义。 【算法设计】 设计思想: 本人设计了两个程序,一个是基于控制台的,一个是MFC的.不过设计思想都一样 我的程序:实现生产者与消费者之间的互斥,我设计了3个生产者和1个消者。 既然要实现消费者和生产者之间的互斥,那么必不可少的要建立一个互斥对象 hMutex,来实现生产者生产产品时,消费者就不能从缓存区中去取产品。但是如果只有一个互斥信号量的话会出现一个弊端,如:当生产者生产的产品大于缓存区容量时,它还会继续试图生产产品并放到里面。所以我们还需要一对同步信号量EmptySemaphore,FullSemaphore。其中EmptySemaphore来控制缓存区是否空,如若为空则消费者不能从缓存区中取产品;FullSemaphore来控制缓存区是否为满,如若为满则消费者就不再继续生产产品。这样就很好的提高了CPU的利用率。 然后再主线程中创建3个生产者线程,1个消费者线程。并实现生产者线程和消费者线程的功能。 设计表示: 创建四个线程,3个生产者线程,1个消费者线程,接着进行多线程的工作,if(getchar())则程序退出。并且程序运行后可以在屏幕上显示出此时此刻运行的线程、产品在缓存区的位置,生产者或消费者生产或消费的产品号。 设计流程图(如下): Start Start 创建四个线程:其中 创建四个线程:其中3个生产者线程 1个消费者线程 消费者活动生产者3活动 消费者活动 生产者3活动 生产者2活动 生产者1活动 if(getchar()) if(getchar()) Y 退出 退出 Exit 详细设计表示: 生产者与消费者之间的关系图(如下): 受到同步信号量 受到同步信号量EmptySemaphore和FullSemaphore的控制,若空则可以进行产品的生产,若满则阻止 P P、C线程访问缓存区受互斥信号量hMutex的控制 Product(生产者) Product(生产者) 缓存区 大小:10 Consume Consume(消费者) 受到同步信号量 受到同步信号量EmptySemaphore和FullSemaphore的控制,若空则可以进行产品的消费,若满则阻止 【调试报告】 程序运行结果(一角) Win32控制台应运程序运行截图: MFC运行结果截图: 在调试的过程中可以说是遇到了很多的问题,其中纠结最久的就是MFC中显示出生产者、缓存区、消费者的内容,因为我的线程实现是在对话框的类外面写的所以要调用创建对话框的临时对象,但是怎么传都没办法把它的地址传出来。最后我想了一种办法,就是将对话框中ListBox控件绑定的变量的地址传出来,最后实现了内容的输出。这次操作系统实习加深对进程概念的理解,明确进程和程序的区别,加深了对多线程互斥的理解 【用户手册】 对于Win32控制台的应运程序直接按Ctrl+F5就可以模拟多线程的互斥,以及生产者和消费者问题。最后按回车键Enter来结束线程。 对于MFC程序:实现了创建线程、挂起线程、结束线程的功能。 操作如下: 输出消费者所取产品在缓存区的位置以及产品的号码 输出消费者所取产品在缓存区的位置以及产品的号码 输出缓存区对应位置的状态,0 输出缓存区对应位置的状态,0代表该位置有产品,1代表没有产品 点击便可使程序处于休眠状态即挂起。然后再点击【创建线程】按钮,可继续执行 输出生产者所生产的产品号码,以及存放在缓存区的位置 输出生产者所生产的产品号码,以及存放在缓存区的位置 点击便可创建生产者消费者线程 点击便可创建生产者消费者线程 点击后结束线程,并退出程序 点击后结束线程,并退出程序 【附录】 具体代码实现: Win32控制台应运程序: // 操作系统实习cpp : 定义控制台应用程序的入口点。 #include stdafx.h #includeWindows.h #includeiostream using namespace std; #define SIZE_CATCH 10 //缓存区的长度 int ProductID(0);//生产的产品号 int ConsumeID(0);//消费者取走的产品号 int in(0),out(0);//控制缓存区 bool

文档评论(0)

1亿VIP精品文档

相关文档