用信号量解决理发店问题

合集下载

pv

pv

[解答 若PR0CESS A先执行了三个循环后,N值变为 解答]若 先执行了三个循环后, 值变为 解答 先执行了三个循环后 3+5+5+5=18;这时 = ;这时PROCESS A和PROCESS B并发执行 和 并发执行 了一个循环,这时可能出现的情况有以下几种 这时可能出现的情况有以下几种: 了一个循环 这时可能出现的情况有以下几种: (1)print(N);N:=0;N:= :=N+5; ; : := ; (2)print(N);N:= :=N+5; N:=0; ; := ; ; (3)N:=N十5;print(N); N:=0; 十 ; ; 当出现情况(1)时 出现的打印值为18;当出现情况 当出现情况(2)时 当出现情况 时,出现的打印值为 当出现情况 时, 出现的打印值为18;当出现情况 当出现情况(3)时 出现的打印值为23。 出现的打印值为 当出现情况 时,出现的打印值为 。 为了使它们并发执行时不出现与时间有关的错误, 为了使它们并发执行时不出现与时间有关的错误,我们采 用了PV操作进行管理 操作进行管理, 用了 操作进行管理,其管理 的程序如下: 的程序如下:
p[i]=4,7,3,2,1,5,6; [] , , , , , , ; 巡回置换算法的执行结果 Begin local x, k; k 1; while k<=7 do x k; repeat print(x); x p[x]; until x=k; k k+1; od End
142765 276514 3 427651 514276 6 51427 7 65142
begin s: semaphore; N:integer; N:=3; S:=1; cobegin PROCESS A begin L1: P(S); N:=N+5; V(S); goto L1 end;

理发师问题的相关课设

理发师问题的相关课设

一、设计内容与设计要求1.课程设计目的全面熟悉、掌握计算机系统与系统软件基本知识,增强对不同的问题运用和灵活选择合适的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,增强面向对象程序设计概念,熟悉C++语言编程,养成提供文档资料的习惯和规范编程的思想,为后继课程的实验以及课程设计打下较扎实的基础。

进一步提高上机动手能力,培养使用计算机解决实际问题的能力,为后继课程(数据结构、数据库和JA V A\C#语言编程等课程)的实验以及课程设计,特别是自学、毕业论文的完成打下扎实的基础。

2.课题题目理发店有三个理发师,有三张沙发。

顾客来了理发师正忙可以坐在沙发上。

理发师理完发可以从沙发上叫醒顾客理发。

3.设计要求:主要模块:1、理发师进程模块具有功能:1、有顾客理发师理发2、没有顾客等待3、一个理发师只能理一个顾客4、友好提示5、最多同时理3个顾客5、退出本系统2、顾客模块具有功能:1、友好提示2、理发师忙顾客等待3、理发师闲则顾客理发4、等待的顾客不能超过三个5、退出本系统要求:1)设计正确,方案合理。

2)界面友好,使用方便。

3)程序精炼,结构清晰。

4)设计报告5000字以上,含程序设计说明、系统的功能框图、流程图、源程序清单等。

5)实际操作过程中遇到的问题及解决方法:设计总结及心得体会.6)上机演示。

二、进度安排第18周星期一下午14:00-18:00星期二下午14:00-18:00星期四下午14:00-18:00目录前言 (1)1.系统需求分析 (2)1.1 问题描述 (2)1.2 问题分析 (2)1.3 运行环境分析 (3)2.概要设计 (3)2.1简要介绍 (3)2.2概要设计流程图 (3)3.详细设计 (4)3.1详细设计流程图 (4)3.2采用C++语言定义相关的数据类型。

(5)3.3写出各模块的类C码算法。

(5)4.系统调试 (7)5.程序运行截图结果 (8)5.1 进入程序运行界面 (8)5.2 理发师是否开门营业界面 (9)5.3 理发师开门服务界面 (10)5.4 理发师休息界面 (11)5.5 退出界面 (12)6.心得体会 (12)7.附录 (13)7.1 源代码 (13)7.2 参考文献 (17)8.评分表 (18)前言打瞌睡的理发师问题是一种同步问题的抽象描述。

信号量答案

信号量答案

第一部分2、该方法对可抢占调度完全没问题。

事实上,它就是为这种情况设计的。

当调度为不可抢占的,该方法将会失败。

假设turn初值为0,而进程1首先运行。

它将一直循环,永不释放CPU。

3、对于内核线程,线程可以在信号量上阻塞,而内核可以运行该进程中的其它线程。

因而,使用信号量没有问题。

而对于用户级线程,当某个线程在信号量上阻塞时,内核将认为整个进程都被阻塞,而且不再执行它。

因此,进程失败。

4、某商店有两种食品A和B,最大数量各为m个。

该商店将A、B两种食品搭配出售,每次各取一个。

为避免食品变质,遵循先到食品先出售的原则。

有两个食品公司分别不断地供应A、B两种食品(每次一个)。

为保证正常销售,当某种食品的数量比另一种的数量超过k(k小于m)个时,暂停对数量大的食品进货。

试用P、V操作解决上述问题中的同步和互斥关系。

4、参考答案#define Max m /*最大数量*/typedef int semaphore;/*初始化*/semaphore A_full = 0; /*商店中A食品数目假设初始值为0*/semaphore B_full = 0; /*商店中B食品数目假设初始值为0*/semaphore A_empty = Max; /* A可缓冲数目*/semaphore B_empty = Max; /* B 可缓冲数目*/semaphore A_minus_B = k; /* 商店中A超过B的数目初始值为k-(A_full – B_full)*/ semaphore B_minus_A = k;/* 商店中B超过 A 的数目初始值为k- (B_full – A_full) */ Queue Q_A,Q_B; /*先进先出的队列模拟商店中两食品资源*/semaphore QA_mutex = 1; /*队列A互斥量*/semaphore QB_mutex = 1; /*队列B互斥量*//* 商店搭配出售 A B进程*/void Shop_A_B () /*商店出售A B进程两食品搭配出售*/{A a;B b;while(1){P(A_full);P(B_ful);P(QA_mutex);a = Q_A.remove_item(); /*从商店中取出A*/V(QA_mutext);P(QB_mutex)b = Q_B.remove_item();/*从商店中取出B*/V(QB_mutex);V(A_empty);V(B_empty);sell(a,b); /*卖出a,b*/}}/*总结:相当于生产者消费者问题中的消费者,首先执行将A,B中的空槽减一,然后开始临界区操作,此处分别有两种商品,因此分别有QA-mutex和QB_mutex两个互斥量。

操作系统原理课件-第十一讲睡眠理发师问题

操作系统原理课件-第十一讲睡眠理发师问题
死锁问题:原因,条件,解决方法;银行家算法
线程:引入原因,与进程比较
处理机调度:分为几个层次(作业调度、中级调度、进程调度); 评价调度算法的指标;调度算法各自的特点;采用不同的算法 计算进城的周转时间、调度顺序等;实时调度概念、常见算法
V(seat);
Get_haircut(); }
Process barber {
While(1)
{
P(customers); //接收顾客信号
V(barbers);//向顾客发信号
Cut_hair();
}
}
睡眠理发师问题 方法3
#define CHIRS=5
Var customers,barbers,mutex: Semaphore:=0,0,1
{
P(customers); //接收顾客信号
Cut_hair();
V(seat);
}
}
睡眠理发师问题 方法2
Var customers,barbers,seat: Semaphore:=0,0,5
Process customer
{
P(seat) ;
V(customers); //向理发师发信号
P(barbers); //接收理发师信号
P(customers );//接收顾客信号
Get_haircut();
P(mutex);}Fra bibliotekwaiting=waiting-1;
else
V(barbers);//向顾客发信号
{
V(mutex);
V(mutex);
Cut hair();
}
}
}
}
练习
吸烟者问题(1971,Patil):在一个房间内有三位吸烟者、一位材 料供应者。其中: a) 吸烟者: 需要拥有三种材料“烟草(Tobacco)、卷烟纸 (Cigarette-paper)、火柴(Match)”才能吸烟: 第一位吸烟者有丰富的烟草; 第二位吸烟者有丰富的卷烟纸; 第三位吸烟者有丰富的火柴; ; 当吸烟者拿到所需要的材料后,唤醒供应者进行下一次投放; b) 材料供应者:不吸烟,且有丰富的Tobacco、Cigarette-paper、 Match三种材料; 每次随机地将三种材料中的两种投放到桌子上; 允许拥有另一种材料的吸烟者吸烟。 【要求】编写算法用信号量和P、V操作实现它们之间的同步关系。

第四版-计算机操作系统--期末考试复习题

第四版-计算机操作系统--期末考试复习题

一、选择题1。

与计算机硬件关系最密切的软件是()。

A.编译程序B.数据库管理系统C。

游戏程序 D。

OS2. 现代OS具有并发性和共享性,是()的引入导致的。

A.单道程序B. 磁盘 C。

对象 D.多道程序3. 操作系统的主要功能有( ).A.进程管理、存储器管理、设备管理、处理机管理B.虚拟存储管理、处理机管理、进程调度、文件系统C.处理机管理、存储器管理、设备管理、文件系统D.进程管理、中断管理、设备管理、文件系统4。

要求在规定的时间内对外界的请求必须给予及时响应的OS是()。

A.多用户分时系统 B。

实时系统C.批处理系统时间 D。

网络操作系统5。

操作系统是对( )进行管理的软件。

A。

硬件 B.软件C。

计算机资源 D.应用程序6。

()对多用户分时系统最重要。

A。

实时性 B.交互性C。

共享性 D.运行效率7.( )对多道批处理系统最重要。

A。

实时性 B.交互性C。

共享性 D.运行效率8。

( )对实时系统最重要.A.及时性B.交互性C.共享性 D。

运行效率9。

( )操作系统允许在一台主机上同时连接多台终端,多个用户可以通过各自的终端同时交互地使用计算机。

A.网络B.分布式C.分时D.实时10. 如果分时操作系统的时间片一定,那么(),则响应时间越长.A.用户数越少B.用户数越多C。

内存越小 D。

内存越大11。

下面6个系统中,必须是实时操作系统的有()个。

·航空订票系统·过程控制系统·机器口语翻译系统·计算机辅助系统·办公自动化系统·计算机激光照排系统A.1B.2C.3 D。

412。

下面对OS不正确的描述是()。

A。

OS是系统资源管理程序 B。

OS是为用户提供服务的程序C。

OS是其它软件的支撑软件 D.OS是系统态程序的集合13 当前运行的进程(),将引发系统进行进程调度.A。

执行了一条转移指令B。

要求增加主存空间,经系统调用银行家算法进行测算认为是安全的C.执行了一条I/O指令D.执行程序期间发生了I/O完成中断14 分时系统中的当前运行进程连续获得了两个时间片,原因可能是().A.该进程的优先级最高B.就绪队列为空C.该进程最早进入就绪队列D.该进程是一个短进程15 进程调度又称为低级调度,其主要功能是( ).A.选择一个作业调入内存B。

实例:同步问题

实例:同步问题

同步问题2:理发师问题
var waiting : integer:=0; /*等候理发的顾客数*/ CHAIRS:integer:=n; /*为顾客准备的椅子数*/ VAR customers, barbers,mutex : semaphore:=0,0,1; Procedure barber; begin while(TRUE); /*理完一人,还有顾客吗?*/ P(cutomers); /*若无顾客,理发师睡眠*/ P(mutex); /*进程互斥*/ waiting := waiting – 1; /*等候顾客数少一个*/ V(barbers); /*理发师去为一个顾客理发*/ V(mutex); /*开放临界区*/ cut-hair( ); /*正在理发*/ end;
同步问题2:理发师问题



互斥信号量:mutex ,初始值为1; 信号量customers用来记录等候理发的顾客 数,并用作阻塞理发师进程,初值为0; barbers用来记录正在等候顾客的理发师数, 并用作阻塞顾客进程,初值为0; 这里barbers只有两种取值, 0或1; 临界变量:waiting由理发师进程和顾客进程 共同访问,用来记录在椅子上等着的顾客数;
同步问题3



Void mather() { Wait(empty); wait(mutex); put an orange on the disk; signal(mutex); signal(orange); }
同步问题3



Void son() { Wait(apple); Wait(mutex); Get an apple from disk; Signal(mutex); Signal(empty); }

深入浅出信号量机制

深入浅出信号量机制作者:马玉玲来源:《电脑知识与技术》2009年第36期摘要:《操作系统》是高校计算机专业的一门非常重要的专业课程,理论性较强,尤其信号量机制一直是大家公认的学习操作系统的难点之一。

学生不好懂,也不愿意学。

该文从生活中常见的比较有意思的互斥同步的实例出发,介绍了使用信号量机制解决互斥和同步关系的方法。

简单易懂,趣味性较强,寓教于乐,轻轻松松掌握抽象难懂的理论知识。

关键字:进程;互斥;同步;信号量;P操作;V操作中图法分类号:TP301.6 文献标识码:A文章编号:1009-3044(2009)36-10480-02Several Ways of Learning Semaphore MechanismMA Yu-ling(School of Computer Science, Shandong Yingcai University, Jinan 250100, China)Abstract: "Operating system" is very important professional courses to the students of studying computer science in university. It is very theoretical. Especially, semaphore mechanism has been recognized to be one of the difficulties in learning "Operating system". It is difficult to understand, and some students are unwilling to learn. In this paper, some examples of mutual exclusion synchronization are introduced. They come from the common life and interesting. These examples are simple and easy to understand. By these examples, it turning easy for students to master abstract and difficult theory in "Operating system".Key words: process; mutex; synchronization; semaphore; P(S); V(S)系统中各进程间存在着互斥和同步关系,如果处理不当,会导致系统性能下降甚至系统紊乱。

同步与互斥实例

(1)进程A专门拣黑子,进程B专门拣白子;
(2)每个进程每次只拣一个子,当一个进程在 拣子时不允许另一进程去拣子;
(3)当一个进程拣了一个子(黑或白)以后, 必让另一个进程拣一个子(黑或白) 。
请用P、V操作管理两个并发进程,使其能正 确实现上述功能。
Var S1, S2: semaphore:=1,0;
理发师问题理发师问题l理发店里有一位理发师一把理发椅和n把供等候理发的顾客坐的椅子l如果没有顾客理发师便在理发椅上睡觉l一个顾客到来时它必须叫醒理发师l如果理发师
进程同步与互斥实例
同步实例
1.经典的生产者─消费者问题
生产者
消费者
1.经典的生产者─消费者问题
var B : integer;
empty:semaphore; /* 可以使用的空缓冲区数 */
process 小和尚: begin repeat P(empty); P(count); P(mutex1); 从井中取水; V(mutex1); P(mutex2); 送水入水缸; V(mutex2); V(count); V(full); until false;
end
Var mutex1, mutex2, empty, full, count: semaphore;
④在每个进程中用于实现互斥的PV操作必须成对出现;用于实现 同步的PV操作也必须成对出现,但可以分别出现在不同的进程中; 在某个进程中如果同时存在互斥与同步的P操作,则其顺序不能颠 倒,必须先执行对同步信号量的P操作,再执行对互斥信号量的P 操作,但V操作的顺序没有严格要求。
同步与互斥的解题步骤
full:semaphore;
/* 缓冲区内可以使用的产品数 */
empty := 1;

操作系统课后习题答案

5.1为什么对调度程序而言,区分CPU约束程序和I/O约束程序很重要?答:在运行I/O操作前,I/0限制的程序只运行很少数量的计算机操作。

而CPU约束程序一般来说不会使用很多的CPU。

另一方面,CPU约束程序会利用整个时间片,且不做任何阻碍I/O操作的工作。

因此,通过给I/O约束程序优先权和允许在CPU 约束程序之前运行,可以很好的利用计算机资源。

5.3考虑用于预测下一个CPU区间长度的指数平均公式。

将下面的值赋给算法中的参数的含义是什么?A.a=0 且t0=100 msB.a=0.99 且t0=10 ms答:当a=0且t0=100 ms时,公式总是会预测下一次的CPU区间为100毫秒。

当a=0.99且t0=10毫秒时,进程将给予更高的重量以便能和过去相比。

因此,调度算法几乎是无记忆的,且简单预测未来区间的长度为下一次的CPU执行的时间片。

5.4考虑下面一组进程,进程占用的CPU区间长度以毫秒来计算:进程区间时间优先级P110 3P2 1 1P3 2 3P4 1 4P5 5 2假设在0时刻进程以P1、P2、P3、P4、P5的顺序到达。

a.画出4 个Gantt 图分别演示用FCFS、SJF、非抢占优先级(数字小代表优先级高)和RR(时间片=1)算法调度时进程的执行过程。

b.每个进程在每种调度算法下的周转时间是多少?c.每个进程在每种调度算法下的等待时间是多少?d.哪一种调度算法的平均等待时间最小?答a.FCFS:SJF:非抢占优先级:RR:b.周转时间:c.等待时间:d.从上表中可以看出SJF的等待时间最小。

5.5下面哪种调度算法能导致饥饿?a.先到先服务b.最短作业优先c.轮转法d.优先级答:最短作业优先和优先级调度算法能导致饥饿。

因为对于优先级较低的作业来说,最短作业优先和优先级调度算法会使其无穷等待CPU,长期得不到调用,这就导致了饥饿问题,也叫无穷阻塞。

5.9考虑下面的动态改变优先级的抢占式优先级调度算法。

理发师问题代码

#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <semaphore.h>#define MAX 6 //最大椅子的数量sem_t barber;sem_t customer;sem_t mutex; //互斥信号量int count = 0; //计数:等待理发的顾客数int chairs = MAX;void *Barber(void *arg){while(count>-1){printf("理发师等待顾客...\n");sem_wait(&customer); //等待顾客printf("理发师:正在理发中...\n");sem_wait(&mutex); //理发结束count--;chairs++;printf("理发师理完了,此时正在等待的顾客数为:%d\n",count);sem_post(&barber);sem_post(&mutex);printf("欢迎下次光临!\n");}}void *Customer(void *arg){sem_wait(&mutex);printf("请顾客%d坐\n",(int *)(arg+1));if(chairs > 0){ //如果当前有空余座位count++; //顾客数量+1chairs--; //占用一个座位printf("正在等待的顾客为%d,请理发师加油!\n",count);sem_post(&customer); //等待理发,唤醒理发师sem_post(&mutex); //允许其他顾客进门sem_wait(&barber); //当理发师空闲时开始理发}else { //没有空余座位,准备离开sem_post(&mutex); //离开时释放mutex,允许其他进程访问printf("没有座位了,不好意思!\n");}sleep(1);}int main(int argc,char *argv[]){sem_init(&barber,0,1);sem_init(&customer,0,0);sem_init(&mutex,0,1);pthread_t p,c;int flag = 1;flag = pthread_create(&p,NULL,Barber,NULL);if(flag == 0){printf("这个理发店有一个理发师!\n");flag = 1;}pthread_t d[9];int i = 0;for(;i<8;i++){flag = pthread_create(&d[i],NULL,Customer,i);}return 0;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录 一、课程设计的目的与要求………………………………………………………………….3 1、课程设计目的………………………………………………………………………….3 2、课程设计要求………………………………………………………………………….3 二、设计内容………………………………………………………………………………………3 三、开发环境………………………………………………………………………………………3 四、分析设计………………………………………………………………………………………4 1、设计原理…………………………………………………………………………………4 1.1、进程同步………………………………………………………………………………5 1.2、信号量………………………………………………………………………………….6 2、涉及的数据结构………………………………………………………………………..8 3、流程图……………………………………………………………………………………..9 五、运行示例及结果分析………………………………………………………………………11 1、运行示例……………………………………………………………………………………11 2、运行结果分析:…………………………………………………………………………12 六、个人体会………………………………………………………………………………………13 七、附录(源程序)………………………………………………………………………………15 八、 参考文献………………………………………………………………………………………20 一、课程设计的目的与要求 1、课程设计目的 本课程设计的主要目的是通过生产者和消费者问题(理发店问题)的设计和调试,使学生掌握进程同步的工作原理,利用信号量的原理和机制去解决同步问题,并培养学生分析和解决实际问题的能力。 2、课程设计要求

(1)、在Windows系统环境下,用Windows API编程实现操作系统经典同步问题。 (2)、理解和运用信号量、PV原语、进程间的同步互斥关系等基本知识。 (3)、在实习过程中,加强对于进程同步概念的理解,对于实验进行分析。 (4)、掌握在Windows环境下多线程(进程)程序设计的一些基本方法。

二、设计内容 理发店理有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子。如果没有顾客,理发师便在理发椅上睡觉。一个顾客到来时,它必须叫醒理发师。如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开。

三、开发环境 操作系统功能的模拟实现可以在计算机系统的终端上进行,也可以在一台微型计算机上进行。本次课程设计的主要过程是用语言来模拟操作系统的主要功能。所以,规定试验环境如下: 系统:Windows 2000/Windows XP 语言:C/C++ 开发工具:Turbo C / Visual C++ 6.0 四、分析设计 1、设计原理 题目中要求描述理发师和顾客的行为;程序采用用随机数产生顾客进程,也就是顾客按照随机数自动到来,这样更加接近现实生活; 当理发师看报时顾客进来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师看报,因此理发师和顾客之间是同步的关系,由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有n个,即理发师和椅子是临界资源,所以顾客之间是互斥的关系。 程序中引入3个信号量和一个控制变量: (1)控制变量waiting用来记录等候理发的顾客数,初值均为0; (2)信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0; (3)信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为1; (4)信号量Mutex用于互斥,初值为NULL. int long waiting(0); /*正在等待的顾客的数目 */ int chairs; /*为顾客准备的椅子数*/ customers, barbers,mutex : semaphore; customers := 0; barbers := 1; waiting := 0; mutex := NULL; cobegin barber() begin while(TRUE);//理完一人,还有顾客吗? P(cutomers);//若无顾客,理发师睡眠 P(mutex);//进程互斥 waiting:=waiting–1;//等候顾客数少一个 V(barbers);//理发师去为一个顾客理发 V(mutex);//开放临界区 cut-hair();//正在理发 end customer() begin P(mutex);//进程互斥 if(waiting) begin waiting:=waiting+1;//等候顾客数加1 V(customers);//必要的话唤醒理发师 V(mutex);//开放临界区 P(barbers);//无理发师,顾客坐着养神 get-haircut();//一个顾客坐下等理/ end else V(mutex);//人满了,走吧! end coend

1.1、 进程同步 进程同步可以理解为(包括进程同步和进程互斥两个方面):一般来说同步反映了进程之间的协作性质,往往指有几个进程共同完成一个任务时在时间次序上的某种限制,进程相互之间各自的存在及作用,通过交换信息完成通信。如接力比赛中一组队员使用接力棒等。 进程互斥体现了进程之间对资源的竞争关系,这时进程相互之间不一定清楚其它进程情况,往往指多个任务多个进程间的通讯制约,因而使用更广泛。如打篮球时双方挣抢篮板球等。 进程是操作系统的核心,进程引进的目的就是为了程序能并发执行,提高资源利用率和系统的吞吐量。这里并发不等于并行。并发指:在一定时间内物理机器上有两个或两个以上的程序同处于开始运行但尚未结束的状态,并且次序不是事先确定的。在单处理机系统中同时存在多个并发程序,从宏观上看这些程序是同时在执行的。从微观上讲任何时刻只有一个程序在执行,这些程序在CPU上轮流执行。 并行指严格的同时执行,在多处理机系统中才可能。并发进程间的关系可以是无关的,也可以是有交往的。并发进程间无关是指它们是各自独立的,即如果一个进程的执行不影响其他进程的执行,且与其他进程的进展情况无关,不需要特别的控制;并发进程间有交往是指一个进程的执行可能影响其他进程的执行结果,即一个进程的执行依赖其他进程的进展情况。有交往的并发进程一定共享某些资源。 进程之间互相竞争某一个资源,这种关系就称为进程的互斥,也就是说对于某个系统资源,如果一个进程正在使用,其他的进程就必须等待其用完,不能同时使用。例如,A,B两个进程共享一台打印机,如果系统已经将打印机分配给了A进程,当B进程需要打印时因得不到打印机而阻塞,只有A进程将打印机释放后,系统才将B进程唤醒,B进程才有可能获得打印机。 并发进程使用共享资源时,除了竞争之外有协作,要利用互通消息的办法来控制执行速度,使相互协作的进程正确工作。 进程之间的相互合作来完成某一任务,把这种关系称为进程的同步。例如(生产者和消费者)A,B两个进程通过一个缓冲区合作完成一项任务,A进程将数据送入缓冲区后通知B进程缓冲区中有数据,B进程从缓冲区中取走数据再通知A进程缓冲区现为空。当缓冲区空时,B进程因得不到数据而阻塞,只有当A进程将数据送入缓冲区的时才将B进程唤醒。反之,当缓冲区满时,A进程不能继续送数据而阻塞,只有当B进程取走数据时才唤醒A进程。 1.2、信号量 信号量的定义: 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。 Semaphore分为单值和多值两种,前者只能被一个线程获得,后者可以被若干个线程获得。 以一个停车场的运作为例。简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆直接进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入外面的一辆进去,如果又离开两辆,则又可以放入两辆,如此往复。 在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用。 抽象的来讲,信号量的特性如下:信号量是一个非负整数(车位数),所有通过它的线程/进程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为零时,所有试图通过它的线程都将处于等待状态。在信号量上我们定义两种操作: Wait(等待) 和 Release(释放)。当一个线程调用Wait操作时,它要么得到资源然后将信号量减一,要么一直等下去(指放入阻塞队列),直到信号量大于等于一时。Release(释放)实际上是在信号量上执行加操作,对应于车辆离开停车场,该操作之所以叫做“释放”是因为释放了由信号量守护的资源。 信号量,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端。确认这些信号量VI引用的是初始创建的信号量。 信号量的分类: 整型信号量(integer semaphore):信号量是整数 记录型信号量(record semaphore):每个信号量s除一个整数值s.valu(计数)外,还有一个进程等待队列s.L,其中是阻塞在该信号量的各个进程的标识 二进制信号量(binary semaphore):只允许信号量取0或1值,每个信号量至少须记录两个信息:信号量的值和等待该信号量的进程队列。它的类型定义如下:(用类PASCAL语言表述) semaphore = record value: integer; queue: ^PCB; end; 其中PCB是进程控制块,是操作系统为每个进程建立的数据结构。 s.value>=0时,s.queue为空; s.value<0时,s.value的绝对值为s.queue中等待进程的个数; 1965年,荷兰学者提出了利用信号量机制解决进程同步问题,信号量正式成为有效的进程同步工具,现在信号量机制被广泛的用于单处理机和多处理机系统以及计算机网络中。

相关文档
最新文档