操作系统课程设计
题目:进程通信与进程同步机制实践
所在学院:计算机学院 所在班级:软件1001 学生姓名:张建彬 学生学号:3100608024 指导教师:薛安荣
2013年 1 月
一、题目
某银行提供10个服务窗口(7个对私服务窗口,3个对公服务窗口)和100个供顾客等待的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位顾客使用,有对公和对私两类号,每位顾客只能选取其中一个。当营业员空闲时,通过叫号选取一位顾客,并为其服务。请用P、V操作写出进程的同步算法。
二、目的
1、 掌握基本的同步与互斥算法 。
2、学习使用 Windows 2000/XP 中基本的同步对象,掌握相关 API 的使用方法。
3、了解 Windows 2000/XP 中多线程的并发执行机制,实现进程的同步与互斥 。
三、要求
1、当有顾客取号的时候,不允许其他顾客取号。 2、当服务窗口满的情况下,其他人必须等待。 3、当等待者没有的情况下,服务窗口必须等待。 4、打印:A、 初始状态
B、 中间变化的状态信息
C、以及最终状态信息。
四、原理及算法
顾客来了先取号,取号之后等待叫号,通知叫号之后去服务,营业员服务之后,继续叫号。定义五个同步信号量 座位信号量,通知等待营业员对私信号量,通知等待营业员对公信号量,通知对私叫号信号量,通知对公叫号信号量。在设置一个互斥信号量用于取号。再设计一个全局量来统计来的号码。
五、主要数据结构和流程
1、主要数据结构
定义一个全局变量统计顾客的号码,定义四个线程句柄数组,定义一个座位信号量来通知可分配的座位资源,通知等待营业员对私信号量通知可分配的等待对私资源,通知等待营业员对公信号量等待对公资源,通知对私叫号信号量通知可分配的等待通知对私服务资源,通知对公叫号信号量通知等待对公服务资源。在设置一个互斥信号量用于取号。
2、流程 主程序 P(&cs1 ) 服务 V(&s1 ) 创建服务员窗口线程(对私和对公服务) P(&cs2) 服务 V(&s2) 创建信号量,和互斥信号量 P(&seat) P(&mutex) 取号 V(&mutex) V(&cs1) 等待叫号 P(&s1) 服务 V(seat) 离开 来了顾客产生随机数,对私对公随机,确定是对公对私服务 P(&seat) P(&mutex) 取号 V(&mutex) V(&cs2) 等待叫号 P(&s2) 服务 V(seat) 离开
等待所有线程完成,程序结束
六、源程序清单
#include\#include \#include
#define CUSTOMER_COME_ADAY 200//一天来的顾客量
#define CUSTOMER_COMING_TIME 1000//相邻顾客最大间隔时间 int number = 0;//取号号码
HANDLE seat,s1,s2,cs1,cs2;//seat 桌位量cs1,cs2等待叫号量s1,s2通知顾客量 HANDLE mutex;//互斥量
HANDLE c1[CUSTOMER],c2[CUSTOMER],ss1[SERVER1],ss2[SERVER2];//顾客,营业员线程 DWORD WINAPI server1(PVOID s1pv) //营业员(对私)线程代码 { }
DWORD WINAPI server2(PVOID s2pv) //营业员(对公)线程代码 { }
DWORD WINAPI consumer1(PVOID c1pv)//顾客对私线程代码 {
WaitForSingleObject(seat,INFINITE);//p(&seat) while(true) { } return 0;
WaitForSingleObject(cs2,INFINITE);//p(&cs2) Sleep(SERVE_TIME);
cout<<\对公窗口叫号!\< ReleaseSemaphore(s2,1,NULL);//v(&s2) while(true) { } return 0; WaitForSingleObject(cs1,INFINITE);//p(&cs1) Sleep(SERVE_TIME); cout<<\对私窗口叫号!\< ReleaseSemaphore(s1,1,NULL);//v(&s1)