有界缓冲区
操作系统作业题及答案
《操作系统》课程作业(2013年春)姓名:学号:专业:年级:学校:日期:作业一:作业管理1、有三道程序A、B、C在一个系统中运行,该系统有输入、输出设备各1台。
三道程序A、B、C构成如下:A:输入32秒,计算8秒,输出5秒B:输入21秒,计算14秒,输出35秒C:输入12秒,计算32秒,输出15秒问:(1)三道程序顺序执行的总时间是多少?(2)充分发挥各设备的效能,并行执行上述三道程序,最短需多少时间(不计系统开销)?并给出相应的示意图。
2、假设一个单CPU系统,以单道方式处理一个作业流,作业流中有2道作业,共占用CPU计算时间、输入卡片数和打印输出行数如下:其中,卡片输入机速度为1000张/分钟,打印机输出速度为1000行/分钟,试计算:(1)不采用spooling技术,计算这两道作业的总运行时间(从第1道作业输入开始到最后一个作业输出完毕)。
(2)如采用spooling技术,计算这2道作业的总运行时间(不计读/写盘时间),并给出相应的示意图。
作业二:进程管理1、 请写出两程序S1和S2可并发执行的Bernstein 条件。
2、 有以下5条语句,请画出这5条语句的前趋图。
S1:y=x+1 R(x) W(y) S2:c=f-w R(f,w) W(c) S3:d=r-y R(r,y) W(d) S4:x=a+b R(a,b) W(x) S5:r=c+y R(c,y) W(r)3、 设在教材第62页3.6.4节中所描述的生产者消费者问题中,其缓冲部分为m 个长度相等的有界缓冲区组成,且每次传输数据长度等于有界缓冲区长度以及生产者和消费者可对缓冲区同时操作。
重新描述发送过程deposit(data)和接收过程remove(data)。
P P P iP ....12ik4、 设有k 个进程共享一临界区,对于下述情况,请说明信号量的初值、含义,并用P ,V操作写出有关互斥算法。
(1) 一次只允许一个进程进入临界区;(2) 一次允许m (m<k )个进程进入临界区。
第三章进程管理 - PowerPoint 演示文稿
浙江教育学院 信息学院
3.6.3用P,V原语操作实现同步
解:由题意可知,进程PA调用的过程deposit(data)和进 程PB调用的过程remove(data)必须同步执行,因为过 程deposit(data)的执行结果是过程remove(data)的执 行条件,而当缓冲队列全部装满数据时,remove(data) 的执行结果又是deposit(data)的执行条件,满足同步 定义。从而,我们按以下三步描述过程deposit(data) 和remove(data): 1)设Bufempty为进程PA的私用信号量,Buffull为进 程PB的私用信号量; 2)令Bufempty的初始值为n(n为缓冲队列的缓冲区个 数),Buffull的初始值为0, 3)描述:
浙江教育学院 信息学院
信号量和P,V原语
P原语
申请资源的进程如果s<0,进 程自我阻塞,因此进程放弃 了CPU。 图3.12P原语操作功能
浙江教育学院 信息学院
信号量和P,V原语
V原语
释放资源的进程A,如果 有进程B在等待资源,A要 唤醒B进程后再返回原进 程程序执行,如果原进程 程序执行完毕,则把CPU 交给进程调度程序。
浙江教育学院 信息学院
3.7进程通信
进程通信(IPC, Inter-Process Communication)
在进程间传送数据。 操作系统可以被看作是各种进程组成的,例如用户 进程、计算进程、打印进程等。这些进程都具有各 自独立的功能,且大多数被外部需要而启动执行。 一般来说,进程间的通信根据通信的内容可以划分 为两种:
3.6同步的概念
并发进程同时访问公有数据和公有变量引出了 互斥的概念.现在研究进程的合作关系.
操作系统之生产者消费者问题(c++实现)
{
std::cout<<"* - - - - - - - - - - - - - - - - - - - - - - - *"<<std::endl;
std::cout<<"|课程设计课题:生产者-消费者问题的模拟实现|"<<std::endl;
std::cout<<"|指导老师:李先锋|"<<std::endl;
bool g_continue = 1;//控制程序运行:1表示继续运行?0表示停止运行
HANDLE g_hMutex;//线程间的互斥信号量
HANDLE g_hFullSemaphore;//资源信号量:缓冲区满
HANDLE g_hEmptySemaphore;//资源信号量:缓冲区空
DWORD WINAPI Producer(LPVOID);//生产者线程
std::cout<<"|学生:丁可|"<<std::endl;
std::cout<<"|班级: B计123班|"<<std::endl;
std::cout<<"* - - - - - - - - - - - - - - - - - - - - - - - *"<<std::endl;
std::cout<<" ==》按回车开始该程序"<<std::endl;
getchar();
}
/*----------------------------程序提示信息结束------------------------------*/
(完整word版)生产者-消费者问题
课程设计报告课程名:操作系统专业学生姓名班级学号指导教师完成日期博雅学院“操作系统”课程设计报告-—生产者—消费者问题的模拟实现1.课程设计的目的本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
2.设计内容2.1 概述用多进程同步方法解决生产者-消费者问题,C或C++语言实现。
通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。
说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数.设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者县城的标识符。
(2)生产者和消费者各有两个以上。
(3)多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码。
2.2 设计原理多进程是一种非常简洁的多任务操作方式。
在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种烦琐的多任务工作方式。
生产者-消费者方案是多进程应用程序开发中最常用的构造之一。
因此困难也在于此。
因为在一个应用程序中可以多次重复生产者—消费者行为,其代码也可以如此。
设计中创建了Consumer 类,该类通过在一些多进程应用程序中促进代码重用以及简化代码调试和维护来解决这个问题。
多进程应用程序通常利用生产者—消费者编程方案,其中由生产者进程创建重复性作业,将其传递给作业队列,然后由消费者进程处理作业.多进程是一种使应用程序能同时处理多个操作的编程技术。
通常有两种不同类型的多进程操作使用多个进程:适时事件,当作业必须在特定的时间或在特定的间隔内调度执行时;后台处理,当后台事件必须与当前执行流并行处理或执行时;适时事件的示例包括程序提醒、超时事件以及诸如轮询和刷新之类的重复性操作。
操作系统计算题
计算题:一、 生产消费者问题为解决生产者消费者问题,应该设两个同步信号量,一个说明空缓冲区的数目,用S1 表示,初值为有界缓冲区的大小N,另一个说明已用缓冲区的数目,用S2表示,初值 为0。
由于在此问题中有M 个生产者与N 个消费者,它们在执行生产活动与消费活动中要对有界缓冲区进行操作。
由于有界缓冲区就是一个临界资源,必须互斥使用,所以,另外还需要设置一个互斥信号量mutex,其初值为1。
二、 地址转换 例1:若在一分页存储管理系统中,某作业的页表如下所示。
已知页面大小为1024字节,试将逻辑地址1011,2148,3000,4000,5012转化为相应的物理地址。
页号 块号0 21 32 13 6解:本题中,为了描述方便,设页号为P,页内位移为W,逻辑地址为A,页面大小为L,则:p=int(A/L)w=A mod L对于逻辑地址1011p=int(1011/1024)=0w=1011 mod 1024=1011查页表第0页在第二块,所以物理地址为3059。
对于逻辑地址2148p=int(2148/1024)=2w=2148 mod 1024=100查页表第2页在第1块,所以物理地址为1124。
对于逻辑地址3000p=int(3000/1024)=2w=3000 mod 1024=928查页表第2页在第1块, 所以物理地址为1796。
对于逻辑地址4000p=int(4000/1024)=3w=4000mod 1024=928查页表第3页在第6块, 所以物理地址为7072。
对于逻辑地址5012p=int(5012/1024)=4w=5012mod1024=916因页号超过页表长度,该逻辑地址非法。
例2:在一分页存储管理系统中,逻辑地址长度为16位,页面大小为4096字节,现有一逻辑地址为2F6AH,且第0, 1, 2页依次存放在物理块5, 10 ,11中,问相应的物理地址为多少?解:由题目所给给条件可知,本页式系统的逻辑地址结构为:逻辑地址2F6AH的二进制表示如下:由此可知逻辑地址2F6AH的页号为2,该页存放在第11号物理块中,用十六进制表示志号为B,所以物理地址为BF6AH、三、求文件最大长度例:设文件索引节点中有7个地址项,其中4个地址项为直接地址索引,2个地址项就是一级间接地址索引,1个地址项就是二级间接地址索引,每个地址项大小为4字节,若磁盘索引块与盘块大小均为256字节,则可表示的单个文件的最大长度就是多少?解答:本题的文件结构属混合索引分配方式。
苹果-桔子问题的实现
摘要本设计实际是生产者—消费者的变形,通过有界缓冲区把生产者和消费者联系起。
假定生产者和消费者的优先级是相同的,只要缓冲区未满,生产者就可以往缓冲区内放入产品。
苹果与橘子的问题是典型的进程同步问题。
本问题利用C语言实现相应的P、V 原语。
主要过程可用生产消费者来模拟,这里,生产者(父亲和母亲)放入缓冲区(盘子)的产品有两类(苹果和桔子),消费者(女儿和儿子)也有两类,每类消费者只消费其中固定的一类产品。
生产者和消费者共享缓冲区,缓冲区中有空时,生产者可放入产品(不许放重),待缓冲区中有产品时,消费者可取出产品(不许取重),否则等待。
关键字:进程同步;P、V操作;信号量目录1.概述 (1)1.1问题描述 (1)1.2需求分析 (1)1.3设计目的 (1)1.4设计要求 (2)2.概要设计 (3)2.1数据结构 (3)2.2模块声明 (4)3.详细设计 (6)3.1界面设计 (6)3.2算法设计 (6)3.3设计流程图 (9)3.3.1爸爸放苹果进程操作流程图 (9)3.3.2妈妈放桔子进程操作流程图 (11)3.3.3儿子取桔子操作流程图 (12)3.3.4女儿取苹果操作流程图 (12)4.结果分析 (14)5.设计总结 (18)参考文献 (19)致谢 (19)附录 (20)1.概述1.1问题描述桌上有一个空盘子,只允许放一个水果。
爸爸专向盘中放苹果,妈妈专向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。
规定当盘空时,一次只能放一个水果。
这个问题实际上是两个生产者和两个消费者被连接到仅能放一个产品的缓冲器上。
生产者各自生产不同的产品,但就其本质而言,他们是同一类生产者。
而消费者则各自去需要的产品消费,但消费的方式不同。
解决此类问题利用记录型信号量机制和P、V操作来实现进程同步。
进程同步是指一个进程的执行依赖于另一个进程的信号或消息,当一个进程没有得到来自与另一个进程的信号或消息时则等待,直到信号或消息到达才被唤醒。
4、进程练习
1. 如图所示,GET,COPY,PUT三个进程共用两个缓
冲区S,T(其大小为每次存放一个记录)。GET进程 负责不断地把输入记录送入缓冲区S中,COPY进程负 责从缓冲区S中取出记录复制到缓冲区T中,而PUT进 程负责把记录从缓冲区T中取出打印。试用P,V操作 实现这三个进程之间的同步。
F
GET
mother( ) {p(mutex); 放入橘子; v(mutex); v(s2);
Son( )
{p(s2); 拿一个橘子; } daugher( ) {p(s1); 拿一个苹果;
mother();
son();
}
}
dauther();
}
}
练习八
在一个盒子里,混装了数量相等的黑白 围棋子.现在用自动分拣系统把黑白棋子 分开,设分拣系统有两个进程P1和P2,其中 P1拣白子;P2拣黑子.规定每个进程每次拣 一子;当一个进程在拣时,不允许另一个进 程去拣;当一个进程拣了一子时,必须让另 一个进程去拣.试写出进程P1和P2能并发 正确执行的算法.
练习五答案
A C
t
Bபைடு நூலகம்
t/2
C为AB的中点
AC为临界资源 假设各列车为各进程,则列车在AC段的行驶 可看作是进程的程序段的执行,所以,列车在 AC段的行驶为临界区。
生产者—消费者问题
一种同步问题的抽象描述
一群
P1 ….
C1
生产者 …
……
….
… Cn
一群
消费者
Pn
有界缓冲区临界资源
信号灯功能: (1)跟踪资源的生产和消费的计数器
练习二答案
(1) int S=1; -(n-1) ~ 1 (2) int S=m; -(n-m) ~ m
生产者消费者问题实验报告
生产者消费者问题实验报告生产者消费者问题实验报告一、引言生产者消费者问题是计算机科学中一个经典的并发问题,主要涉及到多个线程之间的协作和资源的共享。
在本实验中,我们通过编写一个简单的程序来模拟生产者和消费者之间的交互过程,以深入理解该问题的本质和解决方案。
二、问题描述在生产者消费者问题中,有两类线程:生产者和消费者。
生产者线程负责生产一定数量的产品,而消费者线程则负责消费这些产品。
两类线程需要共享一个有限的缓冲区,生产者将产品放入缓冲区,而消费者从缓冲区中取出产品。
然而,缓冲区的容量是有限的,当缓冲区已满时,生产者需要等待,直到有空间可用。
同样地,当缓冲区为空时,消费者需要等待,直到有产品可用。
三、实验设计为了解决生产者消费者问题,我们采用了经典的解决方案——使用互斥锁和条件变量。
互斥锁用于保护共享资源的访问,保证同一时间只有一个线程可以访问共享资源。
而条件变量用于线程之间的通信,当某个条件不满足时,线程可以通过条件变量进入等待状态,直到条件满足时再被唤醒。
在我们的程序中,我们使用了一个有界缓冲区来模拟生产者消费者之间的交互。
缓冲区的大小可以通过参数进行设置。
我们创建了两个线程分别代表生产者和消费者,它们通过互斥锁和条件变量来实现同步。
生产者线程在缓冲区未满时将产品放入缓冲区,并通知消费者线程有产品可用;消费者线程在缓冲区非空时从缓冲区取出产品,并通知生产者线程有空间可用。
通过这种方式,我们保证了生产者和消费者之间的协作和资源的共享。
四、实验结果经过多次运行实验,我们观察到了以下现象:当生产者线程的生产速度大于消费者线程的消费速度时,缓冲区会被生产者填满,消费者需要等待;当消费者线程的消费速度大于生产者线程的生产速度时,缓冲区会被消费者清空,生产者需要等待。
只有当生产者和消费者的速度相等时,才能实现平衡的生产和消费。
此外,我们还发现在某些情况下,生产者和消费者线程可能出现死锁或饥饿现象。
死锁是指两个或多个线程相互等待对方释放资源,导致程序无法继续执行的情况。
操作系统第五章的中英文对照
第五章08软一裴晓禹并发性:互斥和同步Concurrency: Mutual Exclusion and Synchronization1并发性的概述:1:操作系统设计中的核心问题是关于进程和线程的管理:The central themes of operating system design are all concerned with themanagement of processes and threads:1:多道程序设计技术。
Multiprogramming2:多处理技术。
Multiprocessing3:分布式处理技术。
Distributed processing2:操作系统的基础是并发性。
Fundamental to operating system design is concurrency3:支持并发进程的基本需求是加强互斥的能力。
The Basic requirement for support of concurrency is the ability to enforce mutual exclusion2:并发出现在以下三种不同的上下文中:1:多个应用程序2:结构化应用程序3:操作系统结构3:并发性原理1:交替。
2:重叠。
3:多道程序设计系统的一个基本特性:进程的相对执行速度不可预测。
4:并发性带来的困难1:全局资源的共享充满了危险。
2:粗奥做系统很难对分配资源进行最优化的管理。
3:定位程序设计错误时非常困难的。
5:一个简单的例子:另一个简单的例子:6:竞争条件:1:定义:竞争条件发生在当多个进程或者线程在读写数据时,其最终的结果依赖于多个进程指令的执行顺序。
2:紊乱状况的解决方案:控制资源共享的通道。
7:进程的交互:进程之间相互之间知道对方是否存在的程度的三种情况: 1:进程之间相互不知道对方。
2:进程简介知道对方。
3:进程直接知道对方。
竞争合作合作8:进程中资源的争用——互斥1:临界区:critical sections部分程序进入共享区域1:一次只允许有一个程序在临界区中。
生产者消费者问题
⽣产者消费者问题⽣产者消费者问题背景在并发编程中,⽣产者消费者问题(producer/consumer)是⼀个经典的⽼⽣常谈的问题,有时也称为有界缓冲区问题。
问题的基本背景假设是:我们有⼀个固定⼤⼩的缓冲区,这个缓冲区分别有两种⼯作性质不同的线程去操作。
其中⼀种线程负责向缓冲区中写⼊数据,我们称之为⽣产者线程。
另⼀种线程则负责从缓冲区中拿取数据,并称之为消费者线程。
同时两种线程的写⼊和拿取⼯作要遵循⼀定的规则:1. 缓冲区未写满时,⽣产者线程可以向缓冲区中写⼊数据。
但是消费者线程不能从缓冲区中读取数据。
2. 缓冲区写满时,⽣产者线程不能向缓冲区中写⼊数据,消费者线程可以冲缓冲区中读取数据。
3. 不管是那种性质的线程,在操作缓冲区时,均不可出现并发安全问题。
分析可以得知,解决⽣产者消费者问题,其实就是要解决线程同步问题与共享资源互斥访问问题。
互斥问题的解决可以借助锁来实现,⽽线程同步则需借助信号量或其他⼯具来实现。
Java实现class FixedSizeBuffer{private static final int DEFAULT_BUFFER_SIZE = 1024;private final ReentrantLock lock = new ReentrantLock(); // 共享资源访问锁private final Condition isFull = lock.newCondition(); // buffer是否已满private final Condition isEmpty = lock.newCondition(); // buffer是否还空着private final int size; // buffer的⼤⼩private final byte[] buffer; // bufferprivate int cursor; // 写⼊游标public FixedSizeBuffer(){this(DEFAULT_BUFFER_SIZE);}public FixedSizeBuffer(int size){if (size <= 0) throw new IllegalArgumentException();this.size = size;this.buffer = new byte[size];cursor = -1;}/*** 向buffer中写⼊⼀个字节的数据* @param content 数据内容* @throws InterruptedException 中断异常*/public void putByte(byte content) throws InterruptedException{/*由于要对共享资源buffer进⾏访问,所以要加锁。
生产者消费者问题
insert_item(item); // 将新数据放入缓冲区
up(&mutex); // 离开临界区
if (count == N -1) // 缓冲区有空槽
{ // 唤醒生产者
consumer_item(item); // 处理数据项
}
}
该解决方案使用了三个信号量:一个为 full,用来记录充满的缓冲槽的数目,一个为 empty,记录空的缓冲槽总数,一个为 mutex,用来确保生产者和消费者不会同时访问缓冲区。mutex 的初始值为 1,供两个或者多个进程使用的信号量,保证同一个时刻只有一个进程可以进入临界区,称为二元信号量(binary semaphore)。如果每一个进程在进入临界区前都执行一个 down(...),在刚刚退出临界区时执行一个 up(...),就能够实现互斥。
生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区。其中一个是生产者,用于将消息放入缓冲区;另外一个是消费者,用于从缓冲区中取出消息。问题出现在当缓冲区已经满了,而此时生产者还想向其中放入一个新的数据项的情形,其解决方法是让生产者此时进行休眠,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它。同样地,当缓冲区已经空了,而消费者还想去取消息,此时也可以让消费者进行休眠,等待生产者放入一个或者多个数据时再唤醒它。
// 缓冲区大小
#define N 100
int count = 0; // 跟踪缓冲区的记录数
/* 生产者进程 */
void procedure(void)
操作系统实验报告经典生产者—消费者问题范文大全[修改版]
第一篇:操作系统实验报告经典生产者—消费者问题实验二经典的生产者—消费者问题一、目的实现对经典的生产者—消费者问题的模拟,以便更好的理解经典进程同步问题。
二、实验内容及要求编制生产者—消费者算法,模拟一个生产者、一个消费者,共享一个缓冲池的情形。
1、实现对经典的生产者—消费者问题的模拟,以便更好的理解此经典进程同步问题。
生产者-消费者问题是典型的PV 操作问题,假设系统中有一个比较大的缓冲池,生产者的任务是只要缓冲池未满就可以将生产出的产品放入其中,而消费者的任务是只要缓冲池未空就可以从缓冲池中拿走产品。
缓冲池被占用时,任何进程都不能访问。
2、每一个生产者都要把自己生产的产品放入缓冲池,每个消费者从缓冲池中取走产品消费。
在这种情况下,生产者消费者进程同步,因为只有通过互通消息才知道是否能存入产品或者取走产品。
他们之间也存在互斥,即生产者消费者必须互斥访问缓冲池,即不能有两个以上的进程同时进行。
三、生产者和消费者原理分析在同一个进程地址空间内执行两个线程。
生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。
消费者线程从缓冲区中获得物品,然后释放缓冲区。
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放一个空缓冲区。
当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻挡,直到新的物品被生产出来。
四、生产者与消费者功能描述:生产者功能描述:在同一个进程地址空间内执行两个线程。
生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。
消费者功能描述:消费者线程从缓冲区获得物品,然后释放缓冲区,当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
五、实验环境操作系统环境:Windows 系统。
编程语言:C#。
操作系统题目(整理版)
问答题1、试比较作业和进程的区别。
答:一个进程是一个程序对某个数据集的执行过程,是分配资源的基本单位。
作业是用于需要计算机完成某项任务,而要求计算机所做工作的集合。
一个作业的完成要经过作业提交,作业收容、作业执行和作业完成4个阶段。
而进程是已提交完毕的程序所执行过程的描述,足资源分配的基本单位。
其主要区别关系如下:(1)作业是用户向计算机提交任务的任务实体。
在用户向计算机提交作业之后,系统将存储在外存中的作业等待队列中等待执行。
而进程则是完成用户任务的执行实体,是向系统申请分配资源的基本单位。
任一进程,只要它被创建,总有相应的部分存在于内存中。
(2)一个作业可由多个进程组成。
且必须至少由一个进程组成,但反过来不成立。
(3)作业的概念主要用在批处理系统中。
像Unix这样的分时系统中,则没有作业概念。
而进程的概念则用在几乎所有的多道程序系统中2.试比较进程和程序的区别。
答:(1)进程是一个动态概念,而程序是一个静态概念,程序是指令的有序集合,无执行含义,进程则强调执行的过程。
(2)进程具有并行特征(独立性,异步性),程序则没有。
(3)不同的进程可以包含同一个程序,同一程序在执行中也可以产生多个进程。
3.什么是线程?试述线程与进程的区别。
答;线程是在进程内用于调度和占有处理机的基本单位,它由线程控制表、存储线程上下文的用户栈以及核心栈组成。
线程可分为用户级线程、核心级线程以及用户/核心混合型线程等类型。
其中用户级线程在用户态下执行,CPU调度算法和各线程优先级都由用户设置,与操作系统内核无关。
核心级线程的调度算法及线程优先级的控制权在操作系统内核。
混合型线程的控制权则在用户和操作系统内核二者。
线程与进程的主要区别有:(1)进程是资源管理的基本单位,它拥有自己的地址空间和各种资源,例如内存空间、外部设备等;线程只是处理机调度的基本单位,它只和其他线程一起共享进程资源,但自己没有任何资源。
(2)以进程为单位进行处理机切换和调度时,由于涉及到资源转移以及现场保护等问题,将导致处理机切换时间变长,资源利用率降低。
进程管理四经典进程同步问题
1. AND型信号量集
AND型信号量集用于同时需要多种资源且每种占用一个时的信 号量操作; • 问题:一段处理代码需要同时获取两个或多个临界资源―― 可能死锁:各进程分别获得部分临界资源,然后等待其余的 临界资源,"各不相让" • 解决方法:在一个wait原语中,将一段代码同时需要的多个 临界资源,要么全部分配给它,要么一个都不分配。称为 Swait(Simultaneous Wait)。 • 在Swait时,各个信号量的次序并不重要,虽然会影响进程归 入哪个阻塞队列。由于是对资源全部分配或不分配,所以总 有进程获得全部资源并在推进之后释放资源,因此不会死锁。
怎样判断有没有读者在读?
增加一个公共变量Readcount,表示当前有 几个读者进程在读。
新来一个读者进程,Readcount加1; 撤销一个读者进程,Readcount减1; 第一个读者:阻塞所有写者进程;允许其他读者进程执行。 最后一个读者:唤醒可能的写者进程。 Readcount成为临界资源,必须互斥访问: 增加互斥信号量Rmutex
需要注意: 原先处于阻塞状态的进程,被唤醒后,从何处开始执行? 与 记录型信号量机制有何不同?
15
生产者-消费者问题 - AND型信号量机制
• 若不愿意考虑wait操作的先后顺序,也可用AND型信号 量来实现。 • 生产者进程中: – 用Swait(empty,mutex)代替wait(empty)和wait(mutex), – 用Ssignal(mutex,full)代替signal(mutex)和signal(full) • 消费者进程中 – 用Swait(full,mutex)代替wait(full)和wait(mutex), – 用Ssignal(mutex,empty)代替signal(mutex)和 signal(empty)
操作系统课程设计题目
(除特别注明外,每组最多3人,先自由组合,并选定1个题目,再由老师作适当调整)课题一、银行家算法设计目的:死锁会引起计算机工作僵死,因此操作系统中必须防止。
本设计的目的在于使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。
设计要求:设计有n个进程共享m个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。
系统能显示各个进程申请和释放资源,以及系统动态分配资源的过程,便于用户观察和分析,要求使用图形用户界面。
银行家算法的思路:1.进程一开始向系统提出最大需求量.2.进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量.3.若正常,则判断该进程所需剩余量(包括本次申请)是否超出系统所掌握的剩余资源量,若不超出,则分配,否则等待.4.银行家算法的数据结构.1)系统剩余资源量V[n],其中V[n]表示第I类资源剩余量.2)已分配资源量A[m][n],其中A[j][i]表示系统j程已得到的第i资源的数量.3)剩余需求量.C[m][n],其中C[j][i]对第i资源尚需的数目.5.银行家算法流程:当某时刻,某进程时,提出新的资源申请,系统作以下操作:1)判定E[n]是否大于C[j][n],若大于,表示出错.2)判定E[n]是否大于系统剩余量V[n],若大于,则该进程等待.3)若以上两步没有问题,尝试分配,即各变量作调整.4)按照安全性推测算法,判断,分配过后,系统是否安全,若安全,则实际分配,否则,撤消分配,让进程等待.6."安全性检测"算法对进程逐个扫描,先判断flag,看进程是否完成,如果完成则继续扫描,如果没有再判断当前系统是否满足进程所需要的分配额,如果满足则分配并当进程完成后回收资源,如果没有则扫描下一个进程。
扫描所有进程,如果所有的进程都能完成就表明是安全分配序列,如果没有,则分配不成功,不存在着安全序列。
计算机操作系统复习题目(2)
第二章进程管理(三)进程同步5、经典同步问题1、生产者—消费者问题生产者消费者问题是一种同步问题的抽象描述。
计算机系统中的每个进程都可以消费(使用)或生产(释放)某类资源。
这些资源可以是硬件资源,也可以是软件资源。
当某一进程使用某一资源时,可以看作是消费,称该进程为消费者。
而当某一进程释放某一资源时,它就相当于生产者。
问题1:设某计算进程CP和打印进程IOP共用一个单缓冲区,CP进程负责不断地计算数据并送入缓冲区T中,IOP进程负责不断地从缓冲区T中取出数据去打印。
通过分析可知,CP、IOP必须遵守以下同步规则:(1)当CP进程把计算结果送入缓冲区时,IOP进程才能从缓冲区中取出结果去打印;(2)当IOP进程把缓冲区中的数据取出打印后,CP进程才能把下一个计算结果送入缓冲区.(3)为此设有两个信号量Sa=0,Sb=1,Sa表示缓冲区中有无数据,Sb表示缓冲区中有无空位置。
两个进程的同步可以描述如下:问题2:一组生产者通过具有N个缓冲区的共享缓冲池向一组消费者提供数据。
问题分析”:为解决生产者消费者问题,应该设两个同步信号量,一个说明空缓冲区的数目,用empty表示,初值为有界缓冲区的大小N,另一个说明已用缓冲区的数目,用full表示,初值为0。
由于在此问题中有M个生产者和N个消费者,它们在执行生产活动和消费活动中要对有界缓冲区进行操作。
由于有界缓冲区是一个临界资源,必须互斥使用,所以,另外还需要设置一个互斥信号量mutex,其初值为1。
问题的解:注意:在每个程序中用于实现互斥的P(mutex)和V(mutex)必须成对的出现对资源信号量empty和full的P和V操作,同样需要成对地出现,但它们分别处于不同的程序中。
在每个程序中的多个P操作顺序不能颠倒。
先同步后互斥。
生产者进程缓冲池消费者进程1┇┇i┇┇2、哲学家就餐问题有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子。
计算机操作系统
初值:s1=n;s2=0
生产者消费者问题
生产者-消费者(Producer-Consumer)问题是著 名的进程同步问题。它描述一组生产者向一组消 费者提供消息,它们共享一个有界缓冲池,生产 者向其中投放消息,消费者从中取得消息。
利用记录型信号量解决生产者利用记录型信号量解决生产者-消费者问题
由于有界缓冲区是临界资源,因此,各生产者进 程和消费者进程之间必须互斥执行。 有以上分析我们设公用信号量mutex保证生产者 进程和消费者进程之间的互斥,设信号量empty表示 有界缓冲区中的空单元数,初值为n;信号量full表 示有界缓冲区中的非空单元数,初值为0.信号量mut ex表示有界缓冲区中的个数,初值为1.从而有:
Swait(emp ty,mutex)
Swait(full, mutex)
Ssignal(mu tex,full)
Ssignal(mute x, empty)
producer: i=0; While(true){ 生产产品; Swait(empty,mutex); 往Buffer[i]放产品; Ssignal(mutex,full); i=(i+1)%n; }
图书馆阅览室问题 问题描述:假定阅览室最多可同时容纳100个人 阅读,读者进入时,必须在阅览室门口的一个登 记表上登记,内容包括姓名、座号等,离开时要 撤掉登记内容。用P、V操作描述读者进程的同步 算法。
课后练习 2 吃水果问题
问题描述:桌上有一只盘子,每次只能放一个 水果,爸爸专向盘中放苹果,妈妈专向盘中放 桔子,儿子专等吃盘里的桔子,女儿专等吃盘 里的苹果。只要盘子空,则爸爸或妈妈可向盘 中放水果,仅当盘中有自己需要的水果时,儿 子或女儿可从中取出,请给出四人之间的同步 关系,并用P、V操作实现四人正确活动的程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
竞争条件 竞争条件:若干进程并发地访问并且操纵共享数据 竞争条件: 的情况。 的情况。 共享数据的值取决于哪个进程最后完成 防止竞争条件, 防止竞争条件,并发进程必须被同步
10
7.2 临界区问题 所有n 个进程竞争使用一些共享的数据。 所有 个进程竞争使用一些共享的数据。 每个进程有一个代码段, 称为临界区, 每个进程有一个代码段 称为临界区 在那儿共享数 据被访问。 据被访问。 问题- 保证当一个进程正在临界区执行时, 问题 保证当一个进程正在临界区执行时,没有另 外的进程进入临界区执行
13
临界区(critical section):进程中访问临界资源 临界区 : 的一段代码。 的一段代码。 进入区(entry section):在进入临界区之前, 进入区 :在进入临界区之前, 检查可否进入临界区的一段代码。 检查可否进入临界区的一段代码。如果可以进 入临界区,通常设置相应"正在访问临界区 正在访问临界区" 入临界区,通常设置相应 正在访问临界区 标志 退出区(exit section):用于将 正在访问临界区 退出区 :用于将"正在访问临界区 "标志清除。 标志清除。 标志清除 剩余区(remainder section):代码中的其余部 剩余区 : 分。
16
7.2.4 软件方法解决临界区问题 7.2.4.1两进程解法
算法1: 算法
两个进程 P0和 P1 共享变量: 共享变量 – int turn; initially turn = 0 – turn = i Pi能进入其临界区 进程Pi的结构 进程 do { while (turn != i) ; 临界区 turn = j; 剩余区 } while (1); 满足互斥, 满足互斥,但未满足空闲让进 缺点:强制轮流进入临界区 没有考虑进程的实际需要。容易造成资源利用 进入临界区, 缺点:强制轮流进入临界区,没有考虑进程的实际需要。容易造成资源利用 不充分: 出让临界区之后, 使用临界区之前 使用临界区之前, 不可能再次使用临界 不充分:在Pi出让临界区之后,Pj使用临界区之前,Pi不可能再次使用临界 出让临界区之后 区;
7.1 背景
CPU的执行过程: CPU的执行过程: 执行过程rel() 执行过程rel()
top top top
完成top 完成top ←top+1
a b e f
a b e f 堆栈的存和取数过程
a b e f
进程切换, 执行get 执行get () 最后,get过程 最后,get过程 取数据失败
1
5
有界缓冲区 语句 counter++; counter--; 必须原子执行 原子执行必须是连续的, 原子执行必须是连续的,在执行过程中不允许 被中断
6
有界缓冲区 可按如下方式以机器语言实现: 语句 “count++” 可按如下方式以机器语言实现 register1 = counter register1 = register1 + 1 counter = register1 可按如下方式以机器语言实现: 语句 “count--” 可按如下方式以机器语言实现 register2 = counter register2 = register2 – 1 counter = register2
20
算法3 结合算法1和算法 , 结合算法 和算法2,是正确的算法 和算法 turn=j;描述可进入的进程(同时修改标志时) 描述可进入的进程( 描述可进入的进程 同时修改标志时) 在进入区先修改后检查,并检查并发修改的先 在进入区先修改后检查, 后: – 检查对方 检查对方flag,如果不在临界区则自己进入- ,如果不在临界区则自己进入- -空闲则入 – 否则再检查 否则再检查turn:保存的是较晚的一次赋值, :保存的是较晚的一次赋值, 则较晚的进程等待,较早的进程进入-- --先 则较晚的进程等待,较早的进程进入--先 到先入, 到先入,后到等待
算法3 综合算法1和 的共享变量 综合算法 和2的共享变量 Process Pi do { flag [i] = true; turn = j; while (flag [j] and turn == j) ; critical section flag [i] = false; remainder section } while (1); 满足了三个要求, 满足了三个要求,解决了两进程临界区问题
2
有界缓冲区 Shared data #define BUFFER_SIZE 10 typedef struct { ... } item; item buffer[BUFFER_SIZE]; int in = 0; int out = 0; int counter = 0;
3
有界缓冲区
生产者进程 item nextProduced; while (1) { while (counter == BUFFER_SIZE) ; /* do nothing */ buffer[in] = nextProduced; in = (in + 1) % BUFFER_SIZE; counter++; } 4
7
有界缓冲区 如果生产者和消费者并发地更新缓冲区,汇编 如果生产者和消费者并发地更新缓冲区 汇编 语言语句可以得到的交替存取 交替取决于生产者和消费者进程如何调度
8
有界缓冲区 一种交叉的方式如下: 一种交叉的方式如下 producer: register1 = counter (register1 = 5) producer: register1 = register1 + 1 (register1 = 6) consumer: register2 = counter (register2 = 5) consumer: register2 = register2 – 1 (register2 = 4) producer: counter = register1 (counter = 6) consumer: counter = register2 (counter = 4) Counter的值可能是 或者6,而正确的值应当是5 的值可能是4或者 ,而正确的值应当是 的值可能是 或者
12
7.2.2 临界区 多个进程共享临界资源时必须互斥使用 临界区: 临界区:访问临界资源的那段代码 General structure of process Pi (other process Pj) do { entry section 进入区 critical section 临界区 exit section 退出区 reminder section 剩余区 } while (1);
14
7.2.3同步机制应遵循的准则
空闲让进。 空闲让进。 当无进程进入临界区时,相应的临界资源处于空闲状态, 当无进程进入临界区时,相应的临界资源处于空闲状态, 因而允许一个请 求进入临界区的进程立即进入自己的临 界区。 界区。 忙则等待(互斥)。 忙则等待(互斥)。 当已有进程进入自己的临界区时, 当已有进程进入自己的临界区时,即相应的临界资源 正被访问,因而其它试图进入临界区的进程必须等待, 正被访问,因而其它试图进入临界区的进程必须等待,以 保证进程互斥地访问临界资源。 保证进程互斥地访问临界资源。 有限等待。 有限等待。 对要求访问临界资源的进程, 对要求访问临界资源的进程,应保证进程能在有限时 间进入临界区,以免陷入“饥饿”状态。 间进入临界区,以免陷入“饥饿”状态。 让权等待。 让权等待 当进程不能进入自己的临界区时,应立即释放处理机, 以免进程陷入忙等。 15
有界缓冲区 消费者进程 item nextConsumed; while (1) { while (counter == 0) ; /* do nothing */ nextConsumed = buffer[out]; out = (out + 1) % BUFFER_SIZE; counter--; }
解决临界区问题需满足
1.
2.
3.
互斥:假定进程Pi在其临界区内执行,其他任何 互斥:假定进程 在其临界区内执行, 在其临界区内执行 进程将被排斥在自己的临界区之外 空闲让进:临界区虽没有进程执行, 空闲让进:临界区虽没有进程执行,但有些进程 需要进入临界区, 需要进入临界区,不能无限期地延长下一个要进 入临界区进程的等待时间. 入临界区进程的等待时间 有限等待。 有限等待。在一个进程提出进入临界区的请求和 该请求得到答复的时间内, 该请求得到答复的时间内,其他进程进入临界区 前的等待时间必须是有限的. 前的等待时间必须是有限的 假定每个进程都以非零的的速率执行。 假定每个进程都以非零的的速率执行。 没有任何关于这n个进程相对执行速率的假定 没有任何关于这 个进程相对执行速率的假定
18
交换顺序后的算法2
共享变量 – boolean flag[2]; initially flag [0] = flag [1] = false. – flag [i] = true Pi 准备进入临界区 Process Pi do { while (flag[j]) ; flag[i] = true; critical section flag [i] = false; remainder section } while (1); Pi和Pj可能同时进入临界区。当 Pi执行了 可能同时进入临界区。 执行了while (flag[j])后, 和 可能同时进入临界区 执行了 后 Pj执行 执行while (flag[i]) ,这样两个进程同时进入了临界区 执行 19
背景
要保持数据的一致性, 要保持数据的一致性,就需要一种保证并发进程的 正确执行顺序的机制 章中解决有限缓冲区问题的共享内存方法… 第4章中解决有限缓冲区问题的共享内存方法 章中解决有限缓冲区问题的共享内存方法 假定我们通过增加一个计数器变量修改生产者-消 假定我们通过增加一个计数器变量修改生产者 消 费者代码, 费者代码,初始值为 0,在缓冲区增加一个项目 , 数据)计数器加1 (数据)计数器加