操作系统(2.4)--进程的描述与控制

四、进程同步

进程同步的主要任务是对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。

1.基本概念 

1.1两种形式的制约关系 

在多道程序环境下,对于同处于一个系统中的多个进程,它们之间可能存在着以下两种形式的制约关系:
1)间接相互制约关系
多个程序在并发执行时,由于共享系统资源,如CPU、I/O 设备等,致使在这些并发执行的程序之间形成相互制约的关系。像打印机、磁带机这样的临界资源。

为了保证这些进程能有序地运行,对于系统中的这类资源,必须由系统实施统一分配,即用户在要使用之前,应先提出申请,而不允许用户进程直接使用。
2)直接相互制约关系
进程间的直接制约关系就是源于它们之间的相互合作

例如,有两个相互合作的进程一输入进程 A和计算进程B,它们之间共享一个缓冲区。进程A通过缓冲向进程B提供数据。进程B从缓冲中取出数据,并对数据进行处理。但如果该缓冲空时,计算进程因不能获得所需数据而被阻塞。一旦进程 A把数据输入缓冲区后便将进程B唤醒;反之,当缓冲区已满时,进程A因不能再向缓冲区投放数据而被阻塞,当进程B将缓冲区数据取走后便可唤醒A。

1.2临界资源

限定进程只能互斥地访问的资源叫临界资源(指一次仅允许一个进程使用的资源)。

1.3临界区 

人们把在每个进程中访问临界资源的那段代码称为临界区。显然,若能保证诸进程互斥地进入自己的临界区,便可实现诸进程对临界资源的互斥访问。一个访问临界资源的循环进程描述如下:

一定有四个区,顺序不变。 

repeat
entry section//进入区
critical section;//临界区
exit section//退出区
remainder section;//剩余区
until false;

1.4同步机制应遵循的规则

所有同步机制都应遵循下述四条准则:

  • (1)空闲让进。当无进程处于临界区时,表明临界资源处于空闲状态,应允许一一个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界资源。
  • (2)忙则等待。当已有进程进入临界区时,表明临界资源正在被访问,因而其它试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
  • (3)有限等待。对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入“死等”状态。
  • (4)让权等待。当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态。

2.硬件同步机制

2.1关中断

关中断是实现互斥的最简单的方法之一。

进程在临界区执行期间,计算机系统不响应中断,从而不会引发调度,也就不会发生进程或线程切换。由此,保证了对锁的测试和关锁操作的连续性和完整性,有效地保证了互斥。

关中断的方法存在许多缺点:

①滥用关中断权力可能导致严重后果;

②关中断时间过长,会影响系统效率,限制了处理器交叉执行程序的能力

③关中断方法也不适用于多CPU系统,因为在一个 处理器上关中断并不能防止进程在其它处理器上执行相同的临界段代码。

2.2利用Test-and-Set指令实现互斥 

借助一条硬件指令———“测试并建立”

int TS(int *flag) // flag表示锁
{                 // flag=0为打开;为1为锁定
int temp;
temp=*flag;
*flag=1;//将锁锁定
return temp;//将锁的值作为函数值
};//函数值即为锁的当前状态值

while TS(lock) skip;//设锁是lock,
临界区;
lock=0;

2.3利用交换指令swap实现互斥

对换指令,在Intel 80x86中又被称为XCHG指令,用于交换两个字的内容。

void swap(int *a,int *b)// 交换a、b的值
{ int temp; 
temp=*a;
*a=*b;
*b=temp;
};

key=1;
do{
swap(& lock,&key);
}while key==1;
临界区
lock=0;

3.信号量机制 

3.1整型信号量

整型信号量定义为一一个用于表示资源数目的整型量S,它与一般整型量不同,除初始化外,仅能通过两个标准的原子操作wait(S)和signal(S)来访问。这两个操作一直被分别称为P、V操作。

wait(S){
while (S<=0);
S--;
signal(S)
S++;

wait(S)和signal(S)是两个原子操作,因此,它们在执行时是不可中断的。

3.2记录型信号量

记录型信号量机制是一种不存在“忙等”现象的进程同步机制。采取了“让权等待”的策略后出现多个进程等待访问同一临界资源的情况。

在信号量机制中,引入两个数据结构:

整型变量value:用于表示资源数目;进程链表指针list:用于链接所有等待进程

typedef struct {
int value; 
struct process_control_block *list;
}semaphore;

相应地,wait(S)和 signal(S)操作可描述如下:
wait(semaphore *S) {
S->value--;
if (S->value < 0) block(S->list);
}
signal(semaphore *S) {
S->value++;
if (S->value<=0) wakeup(S->list);
}

当S=1时,此时的信号量转化为互斥信号量。

4.信号量的应用 

 信号量S值的物理含义:

S≥0时,表示某类可用资源的数目,或者说表示可以执行P操作而不会被阻塞的进程的数目;当S<0时,其绝对值表示信号量S的阻塞队列中的进程数,即系统中因请求该类资源而被阻塞的进程的数目,亦即被信号灯挡住的进程数目,这些进程需要别的进程发出相应的信号灯来唤醒。另外,S的值只能由P、V操作来改变

用P、V操作原语实现进程的互斥
(1)分析清楚题目涉及的临界资源,临界区。
(2)设置信号量(包括信号量的个数和初值及其物理含义),有几个临界资源设置几个互斥信号量,互斥信号量的初值为1。
(3)给出进程相应程序的算法描述或流程控制,并把P、V操作加到临界区上下位置。

用P、V操作原语实现进程的同步
(1)分析清楚题目涉及的进程间的制约关系。
(2)设置信号量(包括信号量的个数和初值及其物理含义),合作进程间需要收发几条消息相应就设置几个信号量。同步信号量的初值一般为0,表示得到合作进程的消息后才能向前推进。
(3)给出进程相应程序的算法描述或流程控制,并把P、V操作加到程序的适当处。
 

猜你喜欢

转载自blog.csdn.net/weixin_53197693/article/details/129619181