并发进程存在的问题
系统当中的多个进程,从资源访问的角度来看,一个进程的运行,有没有可能受到其他进程的制约。有可能
一个和时间有关的错误
共享变量的修改冲突一竞争关系
进程之间的同步关系
进程间的制约关系
(1)竞争关系
:有些资源需要互斥使用,因此各进程竞争使用这些资源一独占分配到的部分或全部共享资源,进程的这种关系为进程的互斥
(2)同步关系
:系统中多个进程中发生的事件存在某种时序关系
,需要相互合作,共同完成一项任务。即一个进程运行到某一点时要求另一伙伴进程为它提供消息,在未获得消息之前该进程处于等待状态,获得消息后被唤醒进入就绪态.进程的这种关系为进程的同步
临界区(critical section)
什么叫临界区
(1)并发进程中与共享变量有关的程序段成为临界区。
(2)共享变量代表的资源成为临界资源。
(3)当多个并发进程访问资源时,结果依赖于他们执行的相对速度,便称出现了竞争条件。
一个和时间有关的错误
临界区的管理
计算机专家Di jkstra 1968年 提出临界区设计原则,即一组并发进程互斥执行时必须满足:
①每次至多有一个进程
处于临界区。
②当若干进程同时要求进入它们的临界区时,应在有限时间内
使一进程进入临界区,它们不应相互堵塞
而致使彼此不能进入临界区。
③进程仅在临界区内逗留有限的时间
。
进入区、退出区
同步机制应遵循的规则
1)空闲让进。
临界资源空闲
时,允许请求进入的进程立即进入
临界区
2)忙则等待。.
有其他进程访问临界资源时,必须等待
3)有限等待。
对请求进入临界区访问资源的进程,应该保证它在有限的时间内能进入自己的临界区
4)让权等待
进程由于无法进入临界区处于等待状态时,应该释放处理机
,避免进程陷入忙等 的状态
一个进程互斥问题
描述
:
一个系统中有2台打印机,多个进程如何互斥地访问它们?
信号量的提出
信号量
: 1965年,由荷兰学者Dijkstra提出的一种特殊整型变量。
信号量定义
: 1个数据结构+2个基本操作(ADT)
2个基本操作分别是P、V操作
,使用于访问临界资源的“进入区”和“退出区”
一个简单的信号量实现
1.整型信号量
(1)信号量S -整型变量,信号量代表可用资源实体的数量。
(2)除了初始化之外,仅能通过两个不可分割的[原子]操作访问
这两个操作一直被分别称为P、V操作
。
P操作和V操作可分别描述为:
2、记录型信号量
在整型信号量机制中的wait操作&#xff0c;只要是信号量S<&#61;0&#xff0c;就会不断地测试。因此&#xff0c;该机制并未遵循“让权等待”的准则&#xff0c;而是使进程处于“忙等
”的状态。
记录型信号量机制&#xff0c;则是-种不存在“忙等”现象的进程同步机制。但在采取了“让权等待
”的策略后&#xff0c;又会出现多个进程等待访问
同一临界资源的情况。
区别:在记录型信号量机制中&#xff0c;除了需要一个用于代表资源数目的整型变量value外&#xff0c;还应增加一个进程链表L&#xff0c;用于链接上述的所有等待进程。
记录型信号量的结构可描述为:
typedef struct{int value;struct process_ control_ block *list;}semaphore;
value
: 临界资源的数目;
list
:等待访问资源的进程PCB链表;
wait(S)和signal(S)操作可描述为:
wait(S)和signal(S)操作可描述为:
信号量和P、V原语
(1)S是与临界区内所使用的公用资源有关的信号量
S>&#61;0可供
并发进程使用的资源数
S<0正在等待
进入临界区的进程数
(2)信号量只能通过初始化和两个标准的原语来访问一作为OS核心代码执行&#xff0c;不受进程调度的打断
初始化指定一个非负整数值
&#xff0c;表示空闲资源总数
.
信号量的使用例子
某系统中接入了2台打印机&#xff0c;使用信号量实现打印机的互斥使用
1、初始化Semaphore s &#61; 2;
2、所有使用打印机的代码使用P、V操作保护
P(s);
使用打印机;
V(s)
练习题
&#xff08;1&#xff09;信号量S的初值为8,在S上执行了10次wait操作&#xff0c; 6次signal操作后&#xff0c; S的值为(4)
&#xff08;2&#xff09;有3个进程&#xff0c;两台打印机&#xff0c;用wait和signal操作来实现互斥访问打印机&#xff0c;则信号量S的取值范围是(2,1,0, -1)
&#xff08;3&#xff09;两个并发进程&#xff0c;设互斥信号量mutex(初值为1)&#xff0c;若信号量&#61;0,则(表示有一个进程进入临界区)
利用信号量实现互斥
&#xff08;1&#xff09;如果信号量的value为1&#xff0c;表示只允许一个进程访问临界资源&#xff0c;此时的信号量转化为互斥信号量,也称作互斥锁
。
&#xff08;2&#xff09;为临界资源设置一个互斥信号量mutex (MUTual Exclusion)&#xff0c;其初值为1;
&#xff08;3&#xff09;在每个进程中将临界区代码置于P(mutex)和V(mutex)原语之间
一个和时间有关的错误
利用信号量来描述前趋关系
&#xff08;1&#xff09;前趋关系:并发执行的进程P1和P2中&#xff0c;分别有代码C1和C2&#xff0c;要求C1在C2开始前完成;
&#xff08;2&#xff09;为前趋关系设置一个信号量S12,其初值为0
一个经典的进程同步问题
例:生产者-消费者问题
描述
:
一个具有n个缓冲区的缓冲池&#xff0c;生产者进程每次放入一个产品到缓冲区中;消费者进程可从一个缓冲 区中取走产品去消费。
约束条件
:
它们之间必须保持同步&#xff0c;即不允许消费者进程到一个空缓冲区去取产品;也不允许生产者进程向一个已装满产品且尚未被取走的緩冲区中投放产品。
生产者和消费者共同操作同一个缓冲区。
生产者消费者问题中的“同步”问题
&#xff08;1&#xff09;生产者必须先生产产品&#xff0c;消费者才能消费&#xff0c;即:缓冲区空时, 消费者进程需要等待。
&#xff08;2&#xff09;消费者如果一直不消费&#xff0c;生产者将缓冲区填满后&#xff0c;无法再继续生产&#xff0c;只能等消费者再次消费产品后才能继续。即:缓冲区满时&#xff0c;生产者进程需要等待。
生产者消费者问题中的“互斥”问题
对于共享变量counter,生产者做加1操作&#xff0c;消费者做减1操作&#xff0c;可用下面的形式描述:
解决生产者消费者问题.
若干进程通过有限
的共享缓冲区交换数据
“生产者”进程不断写入
“消费者”进程不断读出
共享缓冲区共有N个
任何时刻只能有一个进程可对共享缓冲区进行操作
(1)假定在生产者和消费者之间的公用缓冲池中&#xff0c;具有n个缓冲区&#xff0c;这时可利用互斥信号量mutex
实现诸进程对缓冲池的互斥
使用;
&#xff08;2&#xff09;利用信号量empty和full
分别表示缓冲池中空缓冲区
和满缓冲区
的数量。
&#xff08;3&#xff09;假定这些生产者和消费者相互等效&#xff0c;只要缓冲池未满&#xff0c;生产者便可将消息送入缓冲池;只要缓冲池未空&#xff0c;消费者便可从缓冲池中取走一个消息。
生产者-消费者问题算法描述
注意
:
◆在每个程序中 用于实现互斥的wait(mutex)和signal(mutex)必须成对地出现:
◆对资源信号量empty和full的wait和signal操作&#xff0c;同样需要成对地出现&#xff0c;但它们可以
分别处于不同的程序中。
例如&#xff0c;wait (empty)在生产者进程中&#xff0c;而signal (empty)则在消费者进程中&#xff0c;生产者进程若因执行wait (empty)而阻塞&#xff0c;则 以后将由消费者进程将它唤醒;
◆在每个程序中 的多个wait操作顺序不能颠倒。
应先执行对资源信号量的wait操作&#xff0c;然后再执行对互斥信号量的wait操作&#xff0c;否他的进程死锁。
P.V操作总结
信号量的物理含义
:
S>0表示有S个资源可用
S&#61;O表示无资源可用
S<0则|S|表示S等待队列中的进程个数
P(S):表示申请一个资源V(S):表示释放一个资源
信号量的初值应该大于等于0
2、P. V操作必须成对出现&#xff0c;有一个P操作就一定有一个V操作
&#xff08;1&#xff09;当为互斥操作时&#xff0c;它们处于同一进程
&#xff08;2&#xff09;当为同步操作时&#xff0c;则不在同一进程中出现
&#xff08;3&#xff09;对于前后相连的两个P(S1)和P(S2)&#xff0c;顺序是至关重要的:同步P操作应该放在互斥P操作前,而两个V操作顺序则无关紧要