Author:张一极
20201116-23:28
互斥量 初值一般为1
表示临界区只允许一个进程进入, 实现互斥
a.当互斥量为0, 表示临界区已有1个进程, 临界区外无进程等待
b.当互斥量小于0, 表示临界区有1个进程,互斥量绝对值表示临界区外等待进入的进程数量
当前资源可用量为K,信号量为K(K>0), 当信号量小于0,则表示临界区外等待
由一个整数类型变量和两个原子操作组成
变量(假设为Flag)表示资源数目
变量绝对值表示总体资源情况
EX: flag=3,意味着有三个资源可供使用
P()
flag-=1
如果flag<0,则等待
V()
flag+=1
如果它<=0,唤醒一个正在等待的进程,绝对值表示等待进程数目
信号量的pv操作不会被中断和应用程序干扰,P可能会阻塞,V不会
防止了忙等实现了让权等待的特点
x
1class flag_os:
2 def__init__(self):
3 flag
4 waitQueue=[]
5 def P(self,flag):
6 flag-=1
7 if flag<0:
8 waitQueue.append(t)
9 stop(t)
10 def V(self,flag):
11 flag+=1
12 if flag<=0:
13 waitQueue.delete(t)
14 wakeup(t)
1.二进制信号量:0&1
2.资源信号量: 资源数目N
xxxxxxxxxx
1mutex=creat_flag(1)
2#检查信号量是否合规
3P(mutex)
4do sthing#执行所需代码
5V(mutex)#释放资源
6
xxxxxxxxxx
71flag_=creat_flag(0)#初值为0
2def process_1(flag):
3 doing sth
4 V(flag)#先执行所需操作后释放
5def process_2(flag):
6 P(flag)#释放后说明上游任务已经完成,可以直接进行本次任务,如未完成,则无法进行本次任务
7 doing sth
进程进出临界区的情况,当进程阻塞(IO等), 此时进程所在临界区上锁,后续进程可以访问除此以外的临界区,不受影响且允许,如果执意访问,将会在临界区的锁上阻塞,只能等待下次调度出来
临界区和临界资源不一样,临界区实际上指的是访问临界资源的程序和代码,类似PV操作,锁解等, 操作系统访问临界资源,只关心临界区操作过程,因为涉及进程调度,而不关心临界资源使用情况.
临界区->访问临界资源的代码
空闲让进,忙则等待,让权等待,有限等待
互斥: 进程相互竞争而使用独占型资源的制约关系(互斥资源)
同步: 进程之间协同工作需要交换信息,相互等待产生的制约关系(上下游任务)(共享的缓冲区是互斥访问,如果两个上下游任务关系是需要上游写入缓冲区以后下游任务才能读取的话,其不止有同步关系,由于缓冲区是互斥访问,其也有互斥关系)
管程包含了一个数据结构和对该数据结构处理的一组操作,这组操作可以同步进程并且改变管程中的数据
1.数据
2.在这组数据上对应的操作
任意时刻,最多只有一个线程执行管程代码
管程有条件变量,作为等待机制的实现,如果进入管程的线程因为某些原因进入等待状态,每个条件变量代表不同的等待原因,对应有一个等待队列
两大操作:
wait()
把自己阻塞,唤醒一个等待者,或者接纳一个线程进入管程
signal()
唤醒一个线程
如果上游任务已经结束,产生了必要信息(供给下游任务), 则信号量初值为一个非0整数,如果上游任务未完成,则信号量初值应该为0
即系统中不可被修改的代码,这部分代码可以被多个进程在任意时刻共享,不管任意一个代码调用次程序结果都一样,不可被改写
m个程序共享一段程序,每次只允许n个程序进入,故信号量最大为n, 每次最多有m个程序申请进入, 故信号量范围为[n-m,n]
M个进程,并行访问了同一个变量,那么每一个进程中都有访问变量的代码,所以每个进程中都有相关临界区,因此是M个临界区构成