并发编程 进程原语

什么是原语?内核提供给核外调用的过程或者函数成为原语(primitive),原语在执行过程中不允许中断。

计算机进程的控制通常由原语完成。所谓原语,一般是指由若干条指令组成的程序段,用来实现某个特定功能,在执行过程中不可被中断。在操作系统中,某些被进程调用的操作,如队列操作、对信号量的操作、检查启动外设操作等,一旦开始执行,就不能被中断,否则就会出现操作错误,造成系统混乱。所以,这些操作都要用原语来实现。

原语是操作系统内核的一个组成部分,并且常驻内存,通常在管态下执行。原语一旦开始执行,就要连续执行完,不允许中断。

操作系统提供了一些原语,其中常用的有两个 阻塞原语(sleep) 和 唤醒原语(wakeup)。

1) 阻塞原语(sleep)

阻塞原语的大致工作过程如下:开始时,进程正处于执行状态,因此首先应中断CPU执行,并保存该进程的CPU现场,然后把阻塞状态赋予该进程,并将它插入具有相同实体的阻塞队列中。

2) 唤醒原语(wakeup)

一进程因为等待事件的发生而处于阻塞状态,当等待的事件完成后,进程又具有了继续执行的条件,这时就要把该进程从阻塞状态转变为就绪状态,这个工作由唤醒原语来完成。唤醒原语执行的操作有:先把被唤醒进程从阻塞队列中移出,设置该进程当前状态为就绪状态,然后再将该进程插入到就绪队列中。

3) 两者之间的关系

阻塞原语 sleep 是一个将调用进程阻塞的系统调用,直到另外一个进程调用唤醒原语 wakeup 方法,将被阻塞的进程作为参数,将其唤醒。

阻塞与忙等待最大的区别在于,进程被阻塞后 CPU 将不会分配时间片给它,而忙等待则是一直在空转,消耗 CPU 的时间片。

进程的阻塞和唤醒是是在不同的进程中执行的,比如说进程 A 调用了 sleep() 会进入阻塞,而进程 B 调用 wakeup(A)会把进程 A 唤醒。因为是在不同的进程中进行的,所以也存在着被中断的问题 ...