1、顺序环境和顺序程序
- 顺序环境
- 程序的指令或语句序列是顺序的;
- 在计算机系统中只有一个程序在运行;
- 一个程序独占系统中所有资源;
- 一个程序执行不受外界影响。
- 顺序特征
- 顺序性执行;
- 封闭独占资源;
- 确定可再现性。
2、并发环境和并发进程
- 并发环境
- 在一定时间内物理机器上有两个或两个以上的程序;
- 程序处于开始运行但尚未结束的状态;
- 程序执行次序不是事先确定的。
- 并发特征
- 程序结果是不可再现性的;
- 程序的执行呈现间断性;
- 系统中各类资源共享;
- 独立性和制约性;
- 程序和计算不再对应。
3、相交进程和无关进程
- 间接式和直接式制约
- 直接作用:也称"合作关系",是指一个进程执行完后,另一个进程才能开始,否则不能开始;
- 间接作用:也称“竞争关系”,是指一个进程访问共享资源时,其他需访问此资源的进程必须等待。
- 相交和无关进程
- 相交进程:逻辑上的有某种联系的并发进程;
- 无关进程:逻辑上无任何联系的并发进程;
- 直接作用只发生在相交进程之间;
- 间接作用可以发生再相交进程或无关进程之间。
4、进程同步和进程互斥
- 进程同步(直接制约)
- 根据一定的时序关系合作完成一项任务;
- 并发进程因直接制约而互相等待,彼此相互发送消息进行合作,使得个进程按一定的速度执行。进程间的直接制约关系来源于合作;
- 进程建的互相联系式有意识安排的,直接作用只发生再相交的进程间。
-
进程互斥(间接制约)
- 各进程竞争使用临界资源;
- 临界资源:在操作系统中,进程是占有资源的最小单位(线程可以访问其所在进程内的所有资源,但线程本身并不占有资源或仅仅占有一点必须资源)。但对于某些资源来说,其在同一时间只能被一个进程所占用。这些一次只能被一个进程所占用的资源就是所谓的临界资源。典型的临界资源比如物理上的打印机,或是存在硬盘或内存中被多个进程所共享的一些变量和数据等(如果这类资源不被看成临界资源加以保护,那么很有可能造成丢数据的问题);
- 进程间通过中介发生联系,是无意识安排的;
- 可发生在相交进程间,也可发生再无关进程间。
- 进程同步和互斥的关系
- 互斥反映了进程间的竞争关系,而同步则反映了进程间的合作关系;
- 进程互斥是进程同步的一种特殊情况;
- 互斥所涉及的进程之间没有固定的必然的联系,它们只是竞争获得共享资源的使用权;而同步所涉及的并发进程之间有一钟必然的联系,即使资源可用,若没有获得同步消息,进程也不能去使用。
- eg.
- 若干同学去图书馆借书(互斥)
- 输入进程和计算进程(同步)
- 流水线生产的各道工序(同步)
- 若干进程使用一台打印机(互斥)
- 商品生产和社会消费(同步)
5、访问临界资源
- 对于临界资源的访问,必须是互斥进行。也就是当临界资源被占用时,另一个申请临界资源的进程会被阻塞,直到其所申请的临界资源被释放。而进程内访问临界资源的代码被成为临界区。对于临界区的访问过程分为四个部分:
- 进入区:查看临界区是否可访问,如果可以访问,则转到步骤二,否则进程会被阻塞
- 临界区:在临界区做操作
- 退出区:清除临界区被占用的标志
- 剩余区:进程与临界区不相关部分的代码
6、临界区及其使用原则
- 临界区
- 进程中涉及临界资源的程序段
- 多个进程的临界区为相关临界区
- 使用原则
- 有空让进
- 无空等待
- 多中择一(让权等待)
- 有限等待
7、临界区管理软件方法
- Dekker算法
- Dekker算法用指示器turn来指示应该哪个进程进入临界区
1 var inside: array[1..2] of Boolean; 2 inside[1] = false; 3 inside[2] = false; 4 turn: interger; 5 turn := 1 or 2;
-
- 进程1
1 process P1 2 begin 3 inside[1] = true; 4 while inside[2] do if turn = 2 then 5 begin 6 inside[1]:= false; 7 while turn = 2 do begin end; 8 inside[1]:= true; 9 end 10 临界区; 11 turn := 2; 12 inside[1]:= false; 13 end;
-
- 进程2
1 process P2 2 begin 3 inside[2] = true; 4 while inside[1] do if turn = 1 then 5 begin 6 inside[2]:= false; 7 while turn = 1 do begin end; 8 inside[2]:= true; 9 end; 10 临界区; 11 turn:= 1; 12 inside[2]:= false; 13 end;
8、临界区管理的硬件方法
- 测试并建立指令TS
1 /* s代表临界资源状态,由TS指令控制 */ 2 s : boolean; 3 s := true; 4 process Pi /* i = 1,2,...,n */ 5 pi : boolean; 6 begin 7 repeat pi := TS(s) until pi; 8 临界区; 9 s := true; 10 end;
- 交换指令SWAP
- 交换指令将交换两个字的内容
- 公共变量lock决定临界区是否上锁
- 每个进程的私有变量key用于与lock交换
1 /* 交换函数 */ 2 void SWAP(int* a, int* b) { 3 int temp; 4 temp = *a; 5 *a = *b; 6 *b = temp; 7 } 8 9 key = true; 10 do {SWAP(&lock, key);} 11 while(key); 12 临界区; 13 lock := flase;
- 开关中断指令
- 进入临界区前执行“关中断”指令
- 离开临界区后,执行“开中断”指令
- 控制进程互斥进入临界区
9、软硬件方法的优缺点
- 软硬件方法都采用了忙等待方式
- 软件方法实现复杂,需要编程技巧
- 硬件指令方法代码简洁有效
- 硬件中断屏蔽方法代价较高