1.基本概念
- 临界资源:一次仅允许一个进程使用的资源称为临界资源。
在每个进程中访问临界资源的那段代码称为临界区,把临界资源的访问过程分为4个部分:
do{
enter section; //进入区
critical section; //临界区
exit section; //退出区
remainder section; //剩余区
}while(true)
- 同步:也称为直接制约关系,是指为了完成某种任务而建立的两个或多个进程,这些进程因为需要某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系。
例如:输入进程A通过一个缓冲区向进程B提供数据。当该缓冲区空时,进程B不能获取所需的数据而阻塞,一旦进程A将数据送入缓冲区,进程B就唤醒。反之,当缓冲区满时,进程A被阻塞,仅当进程B取走缓冲数据时,才唤醒进程A。
- 互斥:也称为简介制约关系,当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一进程才被允许访问此临界资源。
为了禁止两个进程同时进入临界区,同步机制因遵循一下准则:
1)空闲让进
2)忙则等待
3)有限等待
4)让权等待
2.记录型信号量
首先采用了记录型的数据结构,描述记录型信号量:
typedef struct{
int value;
struct process *L;
}semaphore;
相应的wait(S)和signal(S)的操作:
void wait(semaphore S){ //相当于申请资源
S.value--;
if(S.value<0){
add this process to S.L;
block(S.L);
}
}
void signal(semaphore S){ //相当于释放资源
S.value++;
if(S.value<=0){
remove a process p from S.L;
wakeup(S.L);
}
}