北邮操作系统进程同步实验报告及源代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 WINA PI P roducer(L PVOID IpP a是生产者等待缓冲区的使用权并对缓冲区进行操作

DWORD WINA PI co nsumer(L PVOIDI pP ara)是消费者等待缓冲区的使用权并对缓冲区进行操作

该程序模拟生产者消费者问题,首先要设置缓冲区的大小,输入请求资源的各个进程的信息以及请求时间,并且按照请求时间对各进程进行排序,创建线程, 然后按序依次对缓冲区进行操作,详细设计见源代码。

5、程序运行结果截图:

只有生产者请求,没有消费者请求,请求满足

11 I ' F :AOS procure n^exe

第梆皺豔区…… 箒蠶鬆聽中区中放产品,请求时闾为弼 牛亡#1』無号产品放入缓神区…… 成功政入fe 冲区*

只有消费者请求,没有生产者请求,消费者的请求不成功:

甫费者请束从缓神区中取产品'请求时间为4 消费者请求从缓沖区中取产品「请求时间为:

J L

S

-? < 程 进

者程

进 者 产3

—Hi

( n u u

I f

e

n

資进;请 区囂 賢

A -

择人择入 圭

冃圭同圭冃主

冃圭垦月 r

n ^ ■ 聲

S I F:\OS pro cuter,exe

1=1

S2

■ ■

1

«

2背

程諾誥

3

进佃时

5

时 -源

程求程求

盘进星请 ^fflu

Effisi $ss

置人择人 设输

青土垦垦垦垦尽

I F:\OS pro cuter,ex e

、士

l^~

,只能满足部分消费者请求,不能满足全部:

I F:\O& pro cute nexe

6、源代码:

#in clude

#in clude

#in clude

#in clude

#in clude

#in clude vwin dows.h> using n ames pace std; #define MAX_BUF 1000 #define MAX_REQ 20

HANDLE mutex;

HANDLE full;

HANDLE emp ty;

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) { retu rn a.seq

DWORD WINA PI p roducer(L PVOID IpPara)

{

WaitForSi ngleObject(full,INFINITE);

WaitForSi ngleObject(mutex,INFINITE);

printf("生产者%d将第%d号产品放入缓冲区……\n",(int)lpPara,no); buffer[i n]=no++;

in=(i n+1)%buf_size;

printf("成功放入缓冲区!\n\n",(int)lpPara);

ReleaseMutex(mutex);

ReleaseSema phore(e mp ty,1,NULL);

return 0;

}

DWORD WINA PI co nsumer(L PVOID IpPara) {

WaitForSi ngleObject(e mp ty,INFINITE);

WaitForSi ngleObject(mutex,INFINITE);

printf("消费者%d将第%d号产品从缓冲区取出…• \n",(i nt)l pP ara,buffer[out]);

buffer[out]=0;

printf("成功从缓冲区取出!\n\n",(int)lpPara);

ReleaseMutex(mutex);

out=(out+1)%buf_size;

ReleaseSema phore(full,1,NULL);

return 0;

} int main()

{

int i;

int p=0;

no = 1;

in=out=0;

memset(buffer, 0, sizeof(buffer));

printf("请设置缓冲区大小:");

sca nf("%d",&buf_size);

printf("请输入请求使用资源进程的个数:");

sca nf("%d",&req_size);

相关文档
最新文档