进程同步:
(1) 间接相互制约关系。同处于一个系统中的进程,通常都共享着某种系统资源,如共享CPU、共享I/O 设备等。所谓间接相互制约即源于这种资源共享,例如,有两个进程A和B,如果在A 进程提出打印请求时,系统已将惟一的一台打印机分配给了进程B,则此时进程A只能阻塞;一旦进程B将打印机释放,则A进程才能由阻塞改为就绪状态。
(2) 直接相互制约关系。这种制约主要源于进程间的合作。例如,有一输入进程A通过单缓冲向进程B 提供数据。当该缓冲空时,计算进程因不能获得所需数据而阻塞,而当进程A把数据输入缓冲区后,便将进程B唤醒;反之,当缓冲区已满时,进程A因不能再向缓冲区投放数据而阻塞,当进程B将缓冲区数据取走后便可唤醒A。
临界资源:
诸进程间需要互斥方式对其进行共享的资源,如打印机、磁带机等。
临界区:每个进程中访问临界资源的那段代码成为临界区。
同步机制应遵循的规则:空闲让进、忙则等待、有限等待和让权等待(当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态。)
整型信号量:用于表示资源数目的整形量S,它与一般整型量不同,除初始化外,仅能通过PV操作访问。
PV操作:
P(S):wait(S)
每次wait操作,意味着进程请求一个单位的该类资源,使系统可供分配的该类资源数减少一个。
① 将信号量S的值减1,即S.value:=S.value-1;
② 当S.value<0时,表示该类资源分配完毕,进程调用block原语,进行自我阻塞,放弃处理机,并插入到信号量链表中。
V(S):signal(S)
每次signal操作,表示执行进程释放一个单位资源,使系统中可供分配的该类资源数增加一个
① 将信号量S的值加1,即S.value:=S.value+1;
② 如果S.value<=0,表示在该信号量链表中,仍有等待该资源的进程被阻塞,故还应调用wakeup原语,将链表中的第一个等待进程唤醒