进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx

上传人:b****2 文档编号:2845698 上传时间:2023-05-04 格式:DOCX 页数:15 大小:145.75KB
下载 相关 举报
进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx_第1页
第1页 / 共15页
进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx_第2页
第2页 / 共15页
进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx_第3页
第3页 / 共15页
进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx_第4页
第4页 / 共15页
进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx_第5页
第5页 / 共15页
进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx_第6页
第6页 / 共15页
进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx_第7页
第7页 / 共15页
进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx_第8页
第8页 / 共15页
进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx_第9页
第9页 / 共15页
进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx_第10页
第10页 / 共15页
进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx_第11页
第11页 / 共15页
进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx_第12页
第12页 / 共15页
进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx_第13页
第13页 / 共15页
进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx_第14页
第14页 / 共15页
进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx

《进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx》由会员分享,可在线阅读,更多相关《进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx(15页珍藏版)》请在冰点文库上搜索。

进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序.docx

进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序

 

操作系统课程设计

 

 

 

1.课程设计目的

1.内容围绕操作系统原理中最重要的基本概念和基本原理展开

2.巩固对原理知识的学习效果

3.加深对基本概念的理解

4.学习如何将基本原理和实际设计、应用有机结合

5.锻炼本专业的基本能力

2.设计要求

1:

进程间通信、并发(同步/互斥)、文件读写

2:

内存管理、Dll、Windows消息机制、IO(尚未最终定型)

3.问题具体描述

1.完成N个生产者和M个消费者之间的并发控制,N、M不低于5,数据发送和接收缓冲区大小不小于10个。

2.某个生产者进程生产的消息供K个消费者进程消费。

K《=M。

某些消费进程消费多个生产者生产的消息。

生产者和消费者之间的对应关系可以在程序开始有一个文件中读入,也可以动态调整。

3.每个生产进程生产M个消息后结束运行。

如果一个消费者进程没有对应的生产者进程在运行后,也结束运行。

4.设计分析

课程设计的主要目的是了解并且掌握进程之间的同步互斥,和进程之间的通信问题。

结合课本上的生产者与消费者问题可以从这方面来实现一个多进程的小系统,并且解决多个进程之间的通信,并发等问题,以此来达到课程设计的目的。

理发师问题是将顾客看做生产者,将理发师作为消费者。

设置一定数量的椅子的数目来作为缓存区的大小。

顾客来到的时候坐在椅子上,将自己作为“产品”,理发师理发的时候从椅子上叫走顾客,相当于消费“产品”,从而达到了课程设计要求的前一个要求。

顾客作为生产者,每到来一个就使计数器count增加1,以便让理发师理发(相当于消费)至最后一个顾客(相当于产品)。

并且,第1个到来的顾客应负责唤醒理发师;如果不是第1个到达的顾客,则在有空椅子的情况下坐下等待,否则离开理发店(该消息可由计数器count获得)。

主要有以下一些函数来实现整个问题的实现过程:

(1)用随机函数random()来产生进入理发店的顾客。

(2)定义理发师的理发函数cuthair()用来实现理发操作。

(3)定义顾客被理发的函数gethaircut()用来实现顾客被理发的操作。

(4)用顾客线程customer实现对顾客行为的控制。

(5)用理发师线程barber实现对理发师行为的控制。

(6)定义主函数main实现对两个线程的控制和执行操作。

5.设计分工

成员:

李宁侯绍立

分工:

理发师进程、信号量的设置、理发师函数:

xxx

顾客进程、顾客函数、主函数:

xx

6.数据结构说明

本程序用到了数据结构中的队列,理发的顾客由随机函数产生,顾客遵从先到先理发的原则,但队列的长度限制为输入的理发店中的椅子的个数,当理发店的椅子没有空位的时候,到来的顾客主动退出加入队列。

理发师对队列中的顾客进行先到先服务的原则理发。

7.系统结构说明

(一)头文件声明

#include"windows.h"

#include"iostream.h"

#include"math.h"

(二)定义各种变量

intlongwaiting(0);

intchairs;

charopen_door;

charclose_door;

intcount(0);

intfinish(0);

(三)信号量的定义

HANDLEMutex=:

:

CreateMutex(NULL,FALSE,"Mutex");

HANDLEbarbers=:

:

CreateSemaphore(NULL,1,1,"barbers");

HANDLEcustomers=:

:

CreateSemaphore(NULL,0,3,"customers");

8.系统调用说明

(1)CreateThread():

创建线程

(2)CreateMutex():

找出当前系统是否已经存在指定进程的实例。

如果没有则创建一个互斥体,用来同步。

如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。

CreateMutex()函数可用来创建一个有名或无名的互斥量对象

(3)CreateSemaphore():

CreateSemaphore()是系统提供的API,包含在Windows.h中,应用在同步的处理中。

作用是创建一个新的信号机,执行成功,返回信号机对象的句柄;零表示出错。

一旦不再需要,一定记住用CloseHandle关闭信号机的句柄。

它的所有句柄都关闭以后,对象自己也会删除。

一旦值大于零,信号机就会触发(发出信号)。

Semaphore是一个同步问题机制,不论是Event或Mutex,其他Process在执WaitForSingleObject时,就看当时的物件是Signal或UnSignal而决定是否等待,而Semaphore也相同,但是它要变成Signal/UnSignal的状态,却有些不同,它是提供一个计数值,它允许在这个计数值之内,任何执行到WaitForSingleObject的Thread都不会停下来,而且每执行WaitForSingleObject一次,计数值就减一,当计数值变成0时,该Semaphore才会处於UnSignal的状态,而某个ThreadReleaseSemaphore时,便会将计数值增加,以便其他的Thread或本身可得Signal的讯号,而使WaitForSingleObject停止等待。

(4)ReleaseSemaphore():

ReleaseSemaphore()函数的作用是增加信号机的计数。

如果成功,就调用信号机上的一个等待函数来减少它的计数。

(5)WaitForSingleObject():

函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。

参数dwMilliseconds有两个具有特殊意义的值:

0和INFINITE。

若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。

(6)ResumeThread():

线程恢复函数,使用该函数能激活线程的运行,使CPU分配资源让线程恢复运行。

(7)ReleaseMutex():

释放由线程拥有的一个互斥体

(8)Sleep():

睡眠等待

9.分工设计说明

需要用到的信号量:

HANDLEMutex=:

:

CreateMutex(NULL,FALSE,"Mutex");

实现顾客与理发师对公用缓存区的互斥操作

HANDLEbarbers=:

:

CreateSemaphore(NULL,1,1,"barbers");

HANDLEcustomers=:

:

CreateSemaphore(NULL,0,3,"customers");

:

:

WaitForSingleObject(customers,INFINITE);等待顾客进程的V(customer)操作

:

:

WaitForSingleObject(Mutex,INFINITE);申请操作顾客与理发师公用的缓存区

:

:

ReleaseSemaphore(barbers,1,NULL);释放信号量barbers

:

:

ReleaseMutex(Mutex);释放信号量Mutex,允许顾客操作缓存区

10.算法流程图

11.分工代码

#include"windows.h"

#include"iostream.h"

#include"math.h"

intlongwaiting(0);//等待理发的顾客人数

intchairs;//店中椅子的总数目

charopen_door;//开门

charclose_door;//关门

intcount(0);//顾客的序号

intfinish(0);//已经理完发的顾客人数

DWORDa;

HANDLEMutex=:

:

CreateMutex(NULL,FALSE,"Mutex");//用来实现进程的互斥

HANDLEbarbers=:

:

CreateSemaphore(NULL,1,1,"barbers");//定义信号量来进行线程间的同步

HANDLEcustomers=:

:

CreateSemaphore(NULL,0,3,"customers");//定义信号量来进行线程间的同步

intrandom()

//定义随机函数来产生顾客,并使两个顾客间的时间少于15秒

{

return(rand()*15000)/RAND_MAX;

}

voidcuthair()

//理发师的理发函数,用时15秒

{

:

:

Sleep(15000);

cout<<"理发结束!

"<

}

DWORDWINAPIbarber(LPVOIDpParm1)

//理发师线程

{

while(true)

{

:

:

WaitForSingleObject(customers,INFINITE);//p(customers),等待顾客

:

:

WaitForSingleObject(Mutex,INFINITE);//等待互斥量

waiting--;//等待的人数减1

:

:

ReleaseSemaphore(barbers,1,NULL);//释放信号量

:

:

ResumeThread(barbers);//唤醒顾客进程

:

:

ReleaseMutex(Mutex);//v(mutex);

cuthair();

finish++;

}

return0;

}

12.整体代码

#include"windows.h"

#include"iostream.h"

#include"math.h"

intlongwaiting(0);//等待理发的顾客人数

intchairs;//店中椅子的总数目

charopen_door;//开门

charclose_door;//关门

intcount(0);//顾客的序号

intfinish(0);//已经理完发的顾客人数

DWORDa;

HANDLEMutex=:

:

CreateMutex(NULL,FALSE,"Mutex");//用来实现进程的互斥

HANDLEbarbers=:

:

CreateSemaphore(NULL,1,1,"barbers");//定义信号量来进行线程间的同步

HANDLEcustomers=:

:

CreateSemaphore(NULL,0,3,"customers");//定义信号量来进行线程间的同步

intrandom()

//定义随机函数来产生顾客,并使两个顾客间的时间少于15秒

{

return(rand()*15000)/RAND_MAX;

}

voidcuthair()

//理发师的理发函数,用时15秒

{

:

:

Sleep(15000);

cout<<"理发结束!

"<

}

voidgethaircut()

//顾客被理发的函数

{

:

:

Sleep(15001);//顾客被理发的函数,为了和理发师之间有所区别,比理发师理发时间长1毫秒

cout<<"第"<

}

DWORDWINAPIcustomer(LPVOIDpParm2)

//顾客线程

{

:

:

WaitForSingleObject(Mutex,INFINITE);//P(mutex)来进行互斥操作

count++;//来的是第几个顾客

cout<<"顾客敲门!

第"<

if(waiting

{

if(waiting!

=0)

{

cout<<"现在有"<

}

else

cout<<"无人在等待理发"<

waiting++;

cout<<"剩余"<

cout<<"有空位,顾客已坐下"<

:

:

ReleaseSemaphore(customers,1,NULL);//V(customer)

:

:

ResumeThread(customers);//唤醒理发师进程

:

:

ReleaseMutex(Mutex);//释放互斥量,以便其他线程使用

:

:

WaitForSingleObject(barbers,INFINITE);//等待理发

gethaircut();

}

else

{

cout<<"没有空椅子,第"<

:

:

ReleaseMutex(Mutex);

}

return0;

}

DWORDWINAPIbarber(LPVOIDpParm1)

//理发师线程

{

while(true)

{

:

:

WaitForSingleObject(customers,INFINITE);//p(customers),等待顾客

:

:

WaitForSingleObject(Mutex,INFINITE);//等待互斥量

waiting--;//等待的人数减1

:

:

ReleaseSemaphore(barbers,1,NULL);//释放信号量

:

:

ResumeThread(barbers);//唤醒顾客进程

:

:

ReleaseMutex(Mutex);//v(mutex);

cuthair();

finish++;

}

return0;

}

intmain(intargc,char*argv[])

//实现线程的操作

{

cout<<"输入理发店中的椅子个数:

";

cin>>chairs;

cout<<"店中有"<

cout<<"是否开始接待顾客?

Y/N"<

cin>>open_door;

while(open_door!

='y')

{

cout<

"<

cout<<"是否开始接待顾客?

Y/N"<

cin>>open_door;

}

HANDLEhThread1;

HANDLEhThread2;

hThread2=:

:

CreateThread(NULL,0,barber,NULL,0,NULL);//产生一个理发师进程

while(close_door!

='y')

{

:

:

Sleep(random());//函数实现顾客随机到来

hThread1=:

:

CreateThread(NULL,0,customer,NULL,a,NULL);

cout<

"<

if(finish>=8&&waiting==0)

//如果完成数超过8并且没有人等待

{

cout<<"已经为"<

"<

cin>>close_door;

returnclose_door;

}

}

if(close_door=='y')

{

cout<<"暂停营业!

欢迎下次光临!

"<

return0;

}

return0;

}

13.程序运行

开始

输入椅子数目

选择是否接待顾客

接待顾客

理发完毕

14.总结

通过这个课程设计,对于课本上的关于进程之间的同步、互斥有了更深层的认识,而且有了具体上直观上的理解。

虽然对于第二个课程设计要求没有达到,但我也学到了许多。

进程作为系统的基本的操作单位,其之间的互斥、同步是非常重要的。

生产者与消费者这一个问题中,生产者与消费者公用一个缓存区,这就涉及到了两个进程对缓存区的互斥操作,否者将会产生许多不切实际的问题,这也就失去的系统操作的实际意义。

而通过一个互斥信号量Mutex便很好的解决了这一个问题,两个进程在操作缓存区之前必须先申请使用,如果信号量表示已有进程正在对缓存区进行操作则必须等待其完成方可。

在做这个设计的时候也遇到了许多问题,例如信号量的设置。

由于这个问题中不仅涉及到理发师与顾客之间的互斥同步问题,还设计到各个顾客进程之间的互斥同步问题,所以起初信号量设置不足而导致问题出错。

总的来讲,此次课程设计对我们操作系统知识的巩固起了重要作用,让我们受到了很多启发,懂得了怎样更好的去学习操作系统课程。

操作系统不在是一个模糊的概念存在,许多实际的例子,问题都能涉及到操作系统方面的知识。

这也看出了操作系统对于整个计算机学科的重要性,他不单单作为一个学科存在,而是渗透到各个学科中,作为各个学科的基础甚至提升。

虽然本次的设计不够完善,但我觉得自己获得的东西远远超过这个设计的内容。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2