操作系统实验报告实验一

上传人:第** 文档编号:31012453 上传时间:2018-02-03 格式:DOC 页数:23 大小:225KB
返回 下载 相关 举报
操作系统实验报告实验一_第1页
第1页 / 共23页
操作系统实验报告实验一_第2页
第2页 / 共23页
操作系统实验报告实验一_第3页
第3页 / 共23页
操作系统实验报告实验一_第4页
第4页 / 共23页
操作系统实验报告实验一_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《操作系统实验报告实验一》由会员分享,可在线阅读,更多相关《操作系统实验报告实验一(23页珍藏版)》请在金锄头文库上搜索。

1、计算机操作系统实验报告一、 实验一 “生产者-消费者”问题二、 实验目的:通过对“生产者-消费者”问题编程实现,了解线程创建、同步信号量、互斥信号量、临界区的创建和使用。了解线程互斥和同步机制。了解 PV 原语和信号量在线程互斥和同步机制中的运用。三、实验内容有界缓冲区内设有 5 个存储单位,放入/取出的数据项设定为 1 5 这 5 个整形数。要求每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前生产者/ 消费者标识符四、分析设计实验陈述:1、基础知识:本实验用到几个 API 函数:CreatThread, CreatMutex, CreatSemaphore, Wa

2、itForSingleObject, ReleaseSemaphore, ReleaseMutex, InitializeCriticalSection, EnterCriticalSection, LeaveCriticalSection这些函数的作用:CreatThread: 创建一个线程,该线程在调用进程的地址空间中执 CreatMutex : 产生一个命名的或者匿名的互斥量对象。WaitForSingleObject(对应 p 操作)锁上互斥锁,ReleaseMutex(对应 v 操作)打开互斥锁。CreateSemaphore:创建一个命名的或者匿名的信号对象。信号量可以看作是在互斥

3、量上的一个扩展。WaitForSingleObject:使程序处于等待状态,直到信号量(或互斥量)hHandle 出现或者超过规定的等待最长时间,信号量出现指信号量大于或等于 1,互斥量出现指打开互斥锁。在返回之前将信号量减 1 或者锁上互斥锁。ReleaseSemaphore:将所指信号量加上指定大小的一个量,执行成功,则返回非 0 值。ReleaseMutex:用来打开互斥量,即将互斥量加 1。成功调用则返回 0。InitializeCriticalSection:该函数初始化临界区对象。 EnterCriticalSection:该函数用于等待指定临界区对象的所有权。当调用线程被赋予所有

4、权时,该函数返回。LeaveCriticalSection:该函数释放指定的临界区对象的所有权。五、测试数据设计及测试结果分析已知测试用例文件输入的文件时:5thread 1 P 5.000000thread 2 P 4.000000thread 3 P 2.000000thread 4 C 6.000000 5 6thread 5 P 7.000000thread 6 P 1.000000thread 7 C 3.000000 1 3 2 生产者 6 发送生产请求信号.生产者 6 开始在缓冲区 0 生产产品.生产者 6 完成生产过程 :缓冲区【 0 】: 6生成者 3 发送生产请求信号.生产

5、者 3 开始在缓冲区 1 生产产品.生产者 3 完成生产过程 :缓冲区【 1 】: 3消费者 7 请求消费 1 产品消费者 7 请求消费 1 产品生产者 2 发送生成者请求信号.生产者 2 开始在缓冲区 2 生产产品生产者 2 完成生产过程 :缓冲区【 2 】 : 2生产者 1 发送生产请求信号.生产者 1 开始在缓冲区 3 生产产品.生产者 1 完成生产过程 :缓冲区【 3 】 : 1消费者 7 开始消费 1 产品消费者 7 成功消费 1:缓冲区【3】 : -1消费者 7 请求消费 3 产品消费者 7 开始消费 3 产品消费者 7 成功消费 3:缓冲区【1】: -1消费者 7 请求消费 2

6、产品消费者 7 开始消费 2 产品消费者 7 成功消费 2:缓冲区【2】: -1消费者 4 请求消费 5 产品 生产者 5 发送生产请求信号.生产者 5 开始在缓冲区 1 生产产品生产者 5 完成生产过程缓冲区【1】: 5消费者 4 请求消费 5 产品消费者 4 请求消费 5 产品缓冲区【1】:-1消费者 4 请求消费 6 产品消费者 4 开始消费 6 产品消费者 4 成功消费 6:缓冲区【0】 :-1六、流程图实验程序的结构图(流程图) ;创建“生产者”线程缓冲区输入数据是否阻塞YN创建“消费者”线程七、程序运行结果“生产者”等待,“消费者”取出缓冲区数据缓冲区是否为空Y N “消费者”阻塞

7、“生产者”生产产品后被唤醒八、实验体会通过这次实验了解到生产者-消费者问题是一个经典的进程同步问题,以及在其中使用信号量机制,生产者与消费者问题要求我们设计在同一个进程地址空间内执行的两个线程。 生产者线程生产物品,然后将物品放置在一个空缓冲区中提供消费者线程消费,而消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区,当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。这次生产者和消费者问题的实验,不但加深了我对操作系统中多线程机制的理解和认识,更让我认识到知识的

8、掌握,仅靠学习理论知识是远远不够的,要与实际动手操作相结合才能更好的理解和分析问题。九、源程序文件#include#include#include#include#include/定义一些常量;/本程序允许的最大临界区数;#define MAX_BUFFER_NUM 10/秒到毫秒的乘法因子;#define INTE_PER_SEC 1000/本程序允许的生产和消费线程的总数;#define MAX_THREAD_NUM 64/定义一个结构,记录在测试文件中指定的每一个线程的参数struct ThreadInfoint serial; /线程序列号char entity; /是 P 还是 Cd

9、ouble delay; /线程延迟int thread_requestMAX_THREAD_NUM; /线程请求队列int n_request; /请求个数;/全局变量的定义/临界区对象的声明,用于管理缓冲区的互斥访问;CRITICAL_SECTION PC_CriticalMAX_BUFFER_NUM;int Buffer_CriticalMAX_BUFFER_NUM; /缓冲区声明,用于存放产品;HANDLE h_ThreadMAX_THREAD_NUM; /用于存储每个线程句柄的数组;ThreadInfo Thread_InfoMAX_THREAD_NUM; /线程信息数组;HANDL

10、E empty_semaphore; /一个信号量;HANDLE h_mutex; /一个互斥量;DWORD n_Thread = 0; /实际的线程的数目;DWORD n_Buffer_or_Critical; /实际的缓冲区或者临界区的数目;HANDLE h_SemaphoreMAX_THREAD_NUM; /生产者允许消费者开始消费的信号量;/生产消费及辅助函数的声明void Produce(void *p);void Consume(void *p);bool IfInOtherRequest(int);int FindProducePositon();int FindBufferPo

11、sition(int);int main(void)/声明所需变量;DWORD wait_for_all;ifstream inFile;/初始化缓冲区;for(int i=0;i n_Buffer_or_Critical;inFile.get();printf(输入文件是:n);/回显获得的缓冲区的数目信息;printf(%d n,(int) n_Buffer_or_Critical);/提取每个线程的信息到相应数据结构中;while(inFile)inFile Thread_Infon_Thread.serial;inFile Thread_Infon_Thread.entity;inFi

12、le Thread_Infon_Thread.delay;char c;inFile.get(c);while(c!=n& !inFile.eof()inFile Thread_Infon_Thread.thread_requestThread_Infon_Thread.n_request+;inFile.get(c);n_Thread+; /回显获得的线程信息,便于确认正确性;for(j=0;jserial;m_delay = (DWORD)(ThreadInfo*)(p)-delay *INTE_PER_SEC);Sleep(m_delay);/开始请求生产printf(生产者 %2d 发

13、送生产请求信号.n,m_serial);/确认有空缓冲区可供生产,同时将空位置数 empty 减1;用于生产者和消费者的同步;wait_for_semaphore = WaitForSingleObject(empty_semaphore,-1);/互斥访问下一个可用于生产的空临界区,实现写写互斥;wait_for_mutex = WaitForSingleObject(h_mutex,-1);int ProducePos = FindProducePosition();ReleaseMutex(h_mutex);/生产者在获得自己的空位置并做上标记后,以下的写操作在生产者之间可以并发;/核心

14、生产步骤中,程序将生产者的 ID 作为产品编号放入,方便消费者识别;printf(生产者 %2d 开始在缓冲区 %2d 生产产品.n,m_serial,ProducePos);Buffer_CriticalProducePos = m_serial;printf(生产者 %2d 完成生产过程 :n ,m_serial);printf( 缓冲区 %2d :%3d n ,ProducePos,Buffer_CriticalProducePos);/使生产者写的缓冲区可以被多个消费者使用,实现读写同步;ReleaseSemaphore(h_Semaphorem_serial,n_Thread,NUL

15、L);/消费者进程void Consume(void * p)/局部变量声明;DWORD wait_for_semaphore,m_delay;int m_serial,m_requestNum; /消费者的序列号和请求的数目;int m_thread_requestMAX_THREAD_NUM;/本消费线程的请求队列;/提取本线程的信息到本地;m_serial = (ThreadInfo*)(p)-serial;m_delay = (DWORD)(ThreadInfo*)(p)-delay *INTE_PER_SEC);m_requestNum = (ThreadInfo *)(p)-n_request;for (int i = 0;ithread_requesti;Sleep(m_delay);/循环进行所需产品的消费for(i =0;ithread_requesti =-1;if(!IfInOtherRequest(m_thread_request

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号