操作系统课程设计(江苏大学2012最新版)

更新时间:2024-06-22 13:02:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

操作系统课程设计

题目:进程通信与进程同步机制实践

所在学院:计算机学院 所在班级:软件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 using namespace std; #define SERVER1 7//私有服务 #define SERVER2 3//公有服务 #define CUSTOMER 100//桌位量 #define SERVE_TIME 1000//服务时间

#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)

}

WaitForSingleObject(mutex,INFINITE);//p(&mutex) number++; int temp=number;

cout<<\顾客\<

cout<<\顾客\<

ReleaseSemaphore(seat,1,NULL);//v(&seat)

cout<<\顾客\<

WaitForSingleObject(s1,INFINITE);//p(&s1)

DWORD WINAPI consumer2(PVOID c2pv)//顾客对公线程代码 { }

int main(void)//主程序 {//创建信号量和线程

cout<<\顾客您好,欢迎来到我行,很高兴为您服务!\<

for(n=0;n

WaitForSingleObject(seat,INFINITE);//p(&seat) WaitForSingleObject(mutex,INFINITE);//p(&mutex) number++; int temp=number;

cout<<\顾客\<

cout<<\顾客\<

ReleaseSemaphore(seat,1,NULL);//v(&seat)

cout<<\顾客\<

WaitForSingleObject(s2,INFINITE);//p(&s2)

}

ss1[n]=CreateThread(NULL,0,server1,NULL,0,NULL); ss2[n]=CreateThread(NULL,0,server2,NULL,0,NULL);

for(n=0;n

srand( (unsigned)time( NULL ) ); n=0;n1=0;

for(;number

Sleep(20000);

cout<<\银行结束服务,祝您愉快!\<

int m=rand()%CUSTOMER_COMING_TIME; Sleep(m); int i=rand()%2; if(i==0) { } else { }

c2[n1]=CreateThread(NULL,0,consumer2,NULL,0,NULL); n1++;

c1[n]=CreateThread(NULL,0,consumer1,NULL,0,NULL); n++;

七、实验结果及程序分析

1、实验结果:

(中间部分省略)

2、结果分析:

当顾客来了,首先查看是否有桌位,有桌位就去取号,取完号之后等

待服务,当营业员叫号以后开始被服务,服务完了之后离开。当所有线程执行完了之后程序结束。由于线程之间的同步执行,导致输出有点重叠。

八、课设总结

课程设计是一项复杂的工作,在程序设计的过程中,许多我们认为应该是正确的代码,往往不能运行我们想要的结果。这就需要我们的耐心与细心,去纠正任何一个可能的细小错误。此次操作系统课程设计,在指导教师的精心教导下,我们学会了如何采用系统调用中的信号量、P、V操作,编程解决银行窗口服务的功能。在编程的过程中,首先我们要对程序的设计要求有一个比较明确的认识,然后系统分析与系统设计,最后是代码设计与调试。计算机是一台聪明又笨拙的机器,只有我们的代码完全正确时,它才能准确地运行。

总的来说,通过这次课程设计,我将所学到的知识运用到了实践中,虽然在设计过程中遇到很大的困难,但是在老师和同学的

帮助下我克服了很多困难,并且最终获得了成功。从程序设计的过程中,我熟悉了 VC6.0 的运行环境,也熟悉了 Windows2000 的操作系统,学到了很多的知识,这些都令我受益匪浅。因此,在以后的

学习中,我可以学会自己编写一些类似的简单程序,将学到的东西加以实际的运用。

本文来源:https://www.bwwdw.com/article/fvd3.html

Top