操作系统实验报告实验一.doc
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告实验一.doc
计算机操作系统实验报告一、实验一生产者-消费者问题二、实验目的:通过对生产者-消费者问题编程实现,了解线程创建、同步信号量、互斥信号量、临界区的创建和使用。
了解线程互斥和同步机制。
操作系统实验报告了解PV原语和信号量在线程互斥和同步机制中的运用。
三、实验内容有界缓冲区内设有5个存储单位,放入/取出的数据项设定为1~5这5个整形数。
要求每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前生产者/消费者标识符四、分析设计实验陈述:1、基础知识:本实验用到几个API函数:CreatThread, CreatMutex, CreatSemaphore, WaitForSingleObject, ReleaseSemaphore, ReleaseMutex, InitializeCriticalSection, EnterCriticalSection, LeaveCriticalSection这些函数的作用:??????CreatThread: 创建一个线程,该线程在调用进程的地址空间中执?????CreatMutex : 产生一个命名的或者匿名的互斥量对象。
WaitForSingleObject(对应p操作)锁上互斥锁,ReleaseMutex(对应v操作)打开互斥锁。
???CreateSemaphore:创建一个命名的或者匿名的信号对象。
操作系统实验报告信号量可以看作是在互斥量上的一个扩展。
??WaitForSingleObject:使程序处于等待状态,直到信号量(或互
斥量)hHandle出现或者超过规定的等待最长时间,信号量出现指信号量大于或等于1,互斥量出现指打开互斥锁。
在返回之前将信号量减1或者锁上互斥锁。
?? ReleaseSemaphore:将所指信号量加上指定大小的一个量,执行成功,则返回非0值。
? ?ReleaseMutex:用来打开互斥量,即将互斥量加1。
成功调用则返回0。
??InitializeCriticalSection:该函数初始化临界区对象。
??EnterCriticalSection:该函数用于等待指定临界区对象的所有权。
当调用线程被赋予所有权时,该函数返回。
????????LeaveCriticalSection:该函数释放指定的临界区对象的所有权。
已知测试用例文件thread 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 发送生产请求信号.生产者 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产品消费者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六、流程图实验程序的结构图(流程图);七、程序运行结果八、实验体会通过这次实验了解到生产者-消费者问题是一个经典的进程同步问题,信号量机制要求设计在同一个进程地址空间内执行的两个线程。
生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费消费者线程从缓冲区中获得物品,然后释放缓冲区。
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
#include#include#include#include#include//定义一些常量;//本程序允许的最大临界区数;#define MAX_BUFFER_NUM 10//秒到毫秒的乘法因子;#define INTE_PER_SEC 1000//本程序允许的生产和消费线程的总
数;#define MAX_THREAD_NUM 64//定义一个结构,记录在测试文件中指定的每一个线程的参数struct ThreadInfo{int serial; //线程序列号char entity; //是P还是Cdouble delay; //线程延迟int thread_request[MAX_THREAD_NUM]; //线程请求队列int n_request; //请求个数};//全局变量的定义//临界区对象的声明,用于管理缓冲区的互斥访问;CRITICAL_SECTION PC_Critical[MAX_BUFFER_NUM];int Buffer_Critical[MAX_BUFFER_NUM]; //缓冲区声明,用于存放产品;HANDLE h_Thread[MAX_THREAD_NUM]; //用于存储每个线程句柄的数组;ThreadInfo Thread_Info[MAX_THREAD_NUM]; //线程信息数组;HANDLE empty_semaphore; //一个信号量;HANDLE h_mutex; //一个互斥量;DWORD n_Thread = 0; //实际的线程的数目;DWORD n_Buffer_or_Critical; //实际的缓冲区或者临界区的数目;HANDLE h_Semaphore[MAX_THREAD_NUM]; //生产者允许消费者开始消费的信号量;//生产消费及辅助函数的声明void Produce(void *p);void Consume(void *p);bool IfInOtherRequest(int);int FindProducePositon();int FindBufferPosition(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_Info[n_Thread].serial;inFile >>