采用硬件方法实现进程互斥就是通过计算机提供的一些机器指令来实现进程的互斥。实现进程互斥本质上是实现临界区互斥,而实现临界区互斥的关键又是正确的设置进入区和退出区。机器指令是指在一个指令周期内执行完成的指令,而专用机器指令的执行则不会被中断。使用专用机器指令可以在没有其他指令干扰的情况下,获得临界区是否使用的状态信息。专用机器指令通过设置控制临界区访问的布尔型变量,来控制多个进程对临界区的互斥访问。常用的专用机器指令有3个:开关中断指令、测试与设置指令以及交换指令。
1.开关中断指令
开关中断指令又称为硬件锁,使用它来实现进程互斥最简单。具体方法是进程在进入临界区之前,先执行“关中断”指令来屏蔽掉所有中断,进程完成临界区的任务后,再执行“开中断”指令将中断打开。由于单CPU系统中的进程只能交替执行,因此一旦在进入临界区之前屏蔽掉所有中断,计算机系统就不再响应中断,因此也就不能调度其他进程运行。这样,进程在进入临界区后就一直占用CPU,而其他进程则因中断被屏蔽也无法被调度执行,故不能进入临界区。
使用开关中断的指令实现进程互斥只适合单CPU系统,且存在以下缺点:如果关中断的时间过长,会使系统效率下降,若关中断不当,有可能导致系统无法正常调度进程运行。
2.测试与设置指令TS(Test and Set)
采用TS方法则要为每个临界资源设置一个整型变量S,可以将它看成一把锁。若S的值为0(开锁状态),则表示没有进程访问该锁对应的临界资源;若S的值为1(关锁状态),则表示该锁对应的临界资源已被某个进程占用。
利用TS指令可以实现临界区的开锁和关锁原语操作。在进入临界区之前先用TS指令测试S,若S等于0则表明没有进程使用临界资源,于是本进程可以进入临界区,否则必须循环测试直至S的值为0。当前运行进程执行完临界区代码在退出临界区时必须将S重新置为0,以表示将该临界资源的锁重新打开以便其他进程使用。由于TS指令执行过程不能被中断(专用机器指令),因此使用本方法可以保证实现进程互斥的正确性。(www.xing528.com)
3.交换指令(Swap)
交换指令(Swap)的功能是交换两个字的内容,可以用以下函数描述。
若要使用交换指令来实现进程互斥,则需要为每个临界资源设置一个整型的全局变量S。若S的值为0,则表示没有进程在临界区;若S的值为1,则表示有进程在临界区(即正在访问临界资源)。此外,还要为每个进程设置一个整型局部变量key,只有当S的值为0并且key的值为1时,本进程才能进入临界区。进入临界区后,S的值为1且key的值为0,退出临界区时,应将S的值置为0。使用交换指令实现进程互斥的程序结构如下。
信号量是荷兰计算机科学家Dijkstra提出的。信号量的概念是模拟交通管制中使用的信号灯,信号灯是铁路交通管理中的一种常用设备,交通管理人员利用信号灯的状态(颜色)实现交通管理。Dijkstra将使用信号来协调铁路这个公共资源的方法引用到进程同步中来,形成了信号量机制。信号量其实就是一个记录型数据结构,这个记录型数据结构包含一个具有非负初值的整型变量和一个初始状态为空的等待队列。一般每一类资源对应一个信号量,其中的整型变量代表了可用资源的数目,等待队列里链接的是等待使用这种资源的进程。整型变量的值如果大于零,代表有多个资源可用。整型变量的值如果等于零,代表无可用资源。整型变量的值如果小于零,代表有进程在等待资源,整型变量的绝对值等于等待队列中进程的数目。
信号量是被保护的数据结构。除信号量的赋初值外,信号量的值仅能由两个同步原语改变。Dijkstra将这两个同步原语命名为“P操作(又称wait操作)”和“V操作(又称signal操作)”(P、V来源于荷兰文的“发信号”和“等待”二词的第一个字母)。信号量按其用途可分为三类。①互斥信号量:对应着某一临界资源,其初值均为1。②资源信号量:对应着某一类共享资源,其初值为最初可用资源数目。③同步信号量:用于协调进程间的同步关系,初始值为0或1。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。