北邮操作系统进程同步实验报告及源代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
进程管理实验报告
1.实验目的:
(1)理解进程/线程同步的方法,学会运用进程/线程同步的方法解决实际问题;(2)了解windows系统或unix/linux系统下中信号量的使用方法。
2.实验内容
编写一个有关生产者和消费者的程序:每个生产者每次生产一个产品存入仓库,每个消费者每次从仓库中取出一个产品进行消费,仓库大小有限,每次只能有一个生产者或消费者访问仓库。要求:采用信号量机制。
3、环境说明
本实验是在win7环境下使用dev编译器实现的,采用Win API的信号量机制。
4、程序设计说明
该程序根据教材中的消费者生产者问题编写的,使用了教材中提供的框架思
路以及库函数,使用CreateThread建立新的线程,使用CreateMutex创建一
个互斥信号量,使用CreateSemaphore创建信号量,使用ReleaseMutex释放
线程的互斥信号量,使用ReleaseSemaphore对指定的信号量增加指定的值,
使用WaitForSingleObject等待空位,使用CloseHandle在操作结束后关闭线程
和信号量。
在这个程序里我设计了三个函数:
Int main()是主函数,其中包含了缓冲区大小的设置,生产者消费者发出请求等内容以及线程创建等内容
DWORD WINAPI producer(LPVOID lpPara)是生产者等待缓冲区的使用权并对缓冲区进行操作
DWORD WINAPI consumer(LPVOID lpPara)是消费者等待缓冲区的使用权并对缓冲区进行操作
该程序模拟生产者消费者问题,首先要设置缓冲区的大小,输入请求资源的各个进程的信息以及请求时间,并且按照请求时间对各进程进行排序,创建线程,然后按序依次对缓冲区进行操作,详细设计见源代码。
5、程序运行结果截图:
只有生产者请求,没有消费者请求,请求满足
只有消费者请求,没有生产者请求,消费者的请求不成功:
生产者请求大于消费者请求并且消费者请求在生产者放入产品之后:
消费者请求多于生产者请求,只能满足部分消费者请求,不能满足全部:
6、源代码:
#include
#include
#include
#include
#include
#include
#define MAX_BUF 1000
#define MAX_REQ 20 HANDLE mutex;
HANDLE full;
HANDLE empty;
HANDLE thread[MAX_REQ]; DWORD pro_id[MAX_REQ]; DWORD con_id[MAX_REQ]; struct request{
int type;//记录生产者消费者的类型
int seq; //记录请求次序
}req[MAX_REQ];
int buf_size;
int req_size;
int no;
int buffer[MAX_BUF];
int in;
int out;
int result;
bool cmp(request a,request b)
{ return a.seq DWORD WINAPI producer(LPVOID lpPara) { WaitForSingleObject(full,INFINITE); WaitForSingleObject(mutex,INFINITE); printf("生产者%d将第%d号产品放入缓冲区……\n",(int)lpPara,no); buffer[in]=no++; in=(in+1)%buf_size; printf("成功放入缓冲区!\n\n",(int)lpPara); ReleaseMutex(mutex); ReleaseSemaphore(empty,1,NULL); return 0; } DWORD WINAPI consumer(LPVOID lpPara) { WaitForSingleObject(empty,INFINITE); WaitForSingleObject(mutex,INFINITE); printf("消费者%d将第%d号产品从缓冲区取出……\n",(int)lpPara,buffer[out]); buffer[out]=0; printf("成功从缓冲区取出!\n\n",(int)lpPara); ReleaseMutex(mutex); out=(out+1)%buf_size; ReleaseSemaphore(full,1,NULL); return 0; } int main() { int i; int p=0; no = 1; in=out=0; memset(buffer, 0, sizeof(buffer)); printf("请设置缓冲区大小:"); scanf("%d",&buf_size); printf("请输入请求使用资源进程的个数:"); scanf("%d",&req_size); for(i=0;i printf("请选择是消费者进程(0)还是生产者进程(1):"); scanf("%d",&req[i].type); printf("请输入该进程的请求时间:"); scanf("%d",&req[i].seq); } sort(req,req+req_size,cmp); mutex=CreateMutex(NULL,FALSE,NULL); full=CreateSemaphore(NULL,buf_size,buf_size,NULL); empty=CreateSemaphore(NULL,0,buf_size,NULL); for(i=0;i { if(req[i].type==0){ thread[i]=CreateThread(NULL, 0, consumer, (LPVOID)i, 0, &con_id[i]); if(thread[i]==NULL) return -1; printf("\n消费者请求从缓冲区中取产品,请求时间为%d\n",req[i].seq); } if(req[i].type==1){ thread[i]=CreateThread(NULL,0,producer,(LPVOID)i,0,&pro_id[i]); if(thread[i]==NULL) return -1; printf("\n生产者请求往缓冲区中放产品,请求时间为%d\n",req[i].seq); } }