第五章 并发性:互斥和同步
第一部分
一、
并发的三种硬件环境/场景:单核、多核、分布式处理器
并发的概念:concurrency(并发)一个时间段内多个进程在执行、
parallel(并行)cpu中具有多个计算核心,在同一个时刻有多个进程在不同的核上运行(多核上)
程序 独立的部分抽取出来,让一件事情实现并发处理,提高效率
进入并发前要了解的7个概念:
原子操作:一段代码要么不执行要么同时执行
临界资源:同一个时刻只能允许一个资源访问
临界区:用来访问临界资源的代码
死锁:一组并发的进程,执行需要另外的资源,3..造成相互等待
活锁:等待很久后,主动释放自己的资源,让另一个并发的进程先执行,执行完毕后将资源都给它
互斥:排他性,访问临界资源时,一次只能一个访问,其他的必须等待
条件竞争:资源的状态由最后的进程决定
饥饿:有个进程,已经具备执行的条件,但由于某种情况,永远处于等待(eg:划分优先级,低优先级的进程,一直在等待高优先级的先完成)
并发的两种概念:1)concurrencey并发: 同一个时间段内多个程序同时执行 2)parallel并行:CPU中同时具有多个计算核心,同一时刻在不同核心同时运行
软件中使用并发目的/软件方面并发的三种场景:1)多应用程序 2)加速运行,结构化应用程序 3)操作系统结构(提高效率)
二、并发的原理
1.程序执行三个特点1)独占计算机系统全部资源 2)程序是封闭的,不会被其他程序打断,具有连续性 3)程序执行的一致性
2.引入并发/并发带来的问题:1)失去封闭性,资源为多个进程共享 2)表现出明显的中断性interleave 3)不一致性:相同的输入在多次执行中得到不同的输出
1)全局共享 2)难进行资源最优分配 3)定位程序设计错误是很困难的
三、条件竞争
发生在多个进程或者线程读写数据时,其最终的结果依赖于多个进程的指令执行顺序。
四、操作系统关心的问题
1.需要考虑的问题:1)必须能跟踪不同的进程(进程控制块) 2)分配和释放资源(处理器的时间;内存管理;文件;IO设备)
3)保护数据和资源 4)保证一致性,即输出与执行速度无关
2.怎么保证一致性:1)取消资源共享:互斥 2)程序执行按期望顺序执行:同步 3)
3.进程和进程的关系:1)不知道对方存在,必然存在竞争资源 2)间接知道:通过共享方式存在一定合作关系 (处理互斥)3)直接知道:
操作系统对互斥的要求:1)空闲让进 2)忙则等待:进程正在使用临界资源,其他进程全部阻塞 3)有限等待:不会死锁和饥饿 4)让权等待:请求临界资源主动把CPU资源释放出来
第二部分 互斥:硬件的支持
互斥的原则(需求):空闲让进;(有多个进程访问临界资源,如果空闲,允许一个访问)
忙则等待;
有限等待;(等待临界资源的时间是有期限的,不能让其他的一直处于等待)
让权等待。(cpu使用权,有一个进程已经获得cpu,访问临界资源,。。主动把cpu资源让出来)
互斥的实现方式:软件、硬件、操作系统和编译器(信号量、管程、消息传递)
硬件:
一、中断禁用
1.概念:中断屏蔽,访问临界资源时不被中断。保证了互斥
2.缺点:1)降低CPU利用率 2)不能完全实现对共享资源互斥的访问
二、机器指令
1.概念:禁止其他指令对共享资源进行访问
特点(有效保证实现互斥):1)能在一个指令周期内对指令资源实现读写 2)禁止其他指令访问机器指令正在使用的资源
优点:1)只需要定义一个指示变量,对并发进程速度没有限制 2)机器指令不会中断,值不会被修改 3)支持多个临界区
缺陷:1)忙时等待,浪费cpu资源 2)可能饥饿:其他进程不能访问临界区 3)可能死锁
三、信号量semphores
1.概念:本质上是数据结构。首先定义了一个整型的变量,不同取值空间产生不同信号量,semwait对整型变量进行减1操作,当小于0,将进程放进阻塞队列。对应的操作是semsignal,对整型变量加1操作,如果值小于等于0,会把阻塞队列队首进程放进就绪队列。blocked list,放着执行semwait而阻塞的进程
2.分类:
二元信号量binary semaphore:原始值只取0或1
一般信号量normal:所有整数空间
互斥信号量:信号量中的semwait与semsignal放在同一个进程
强信号量:执行semsignal将一个进程从blocked list移除时,有策略的信号量
弱信号量:没有固定策略的信号量。
3.
Synchronization:
For example: process p1 must run before process p2
How can do it by using semaphore?
Semphore mutual=0;
Process p1: Process P2:
While(1) while(1)
{ {
critical area; semwait(mutula);
semsignal(mutual); critical area;
} }
步骤
1)判断进程的关系:直接or间接
2)具体分析关系:
3)定义信号量,并对信号量的值进行初始化
4)调用semwait,semsignal实现互斥、同步
例题讲解
•The Simple Problem of Producer-Consumer
One producer and one consumer:
1)if the buffer is empty ,the consumer must wait;
2)if the buffer is full, the producer must wait;
How can I implement this situationby using semaphore?
步骤
1.定性
Semphore s1=0
Semphore s2=1
void main
{
produce a product;
semwait(s2);
put product in repertory;
semsignal(s1);
}
void consumer()
{
semwait(s1); //判断仓库是否有产品可供消费
take product from repertory;
semsignal(s2);
consume;
}
2.
Onlyone producer or consumer may access the buffer at any one time
Semphore mutex=1; //刚刚开始任何进程都可以去抢临界区,临界资源只有一个所以设为1。仓库是一个临界区,需要互斥访问
Semphore s1=0;
Semphore s2=1;
void main()
{
semwait(s2);
semwait(mutex);
put product into rep;
semsignal(mutex); //释放临界区
semsigal(s1);
}
void consumer()
{
semwait(s1); //是否有产品可消费
semwait(mutex); //抢临界区
take product;
semsignal(mutex);
semsignal(s2);
}
3.仓库能放m个产品
semphore mutex=1;
semphore s1=0;
semphore s2=m;
void main()
{
semwait(s2); //valid
semwait(mutex);
put product into rep;
semsignal(mutex);
semsigal(s1); //s1已经是一般信号量,取值范围为整数空间
}
void consumer()
{
semwait(s1);
semwait(mutex);
take product;
semsignal(mutex);
semsignal(s2);
}
读者-写者问题(只有互斥关系,不存在同步,因为读写没有顺序,竞争使用文件)
有一个文件,有多个进程读文件,同时也有多个进程写文件:
(1)允许多个读者同时执行读操作;
(2)不允许读者、写者同时操作;
(3)不允许多个写者同时操作。
int count=0; // R-R每一个读操作都要对count进行改变,所以存在顺序,存在竞争
semphore rmutex=1;
semphore mutex=1;
reader
{
int temp;
semwait(rmutex);
count+=1;
temp=count; //避免全局变量的副作用
semsignal(rmutex);
if(temp==1) semwait(mutex);
read;
semwait(rmutex);
count-=1;
temp=count;
if(temp==0 semsignal(mutex);
semsignal(rmutex);
}
write
{
semwait(mutex);
write file;
semsignal(mutex);
}
改进:再加一个信号量,semaphore queue;