首页 理论教育 操作系统实现:多CPU互斥机制

操作系统实现:多CPU互斥机制

时间:2023-10-21 理论教育 版权反馈
【摘要】:在多CPU环境下对共享资源的访问需要一种互斥锁来进行同步,尤其是在中断上下文环境中对共享资源进行访问的情况下。Power PC CPU通过lwarx和stwcx指令可以实现一个test and set的原子操作。下面给出一个典型的自旋锁的实现。需要注意的是,stwcx与Acquire_lock中的lwarx指令对应。在上述实现中,还涉及两条指令isync和sync。这两条指令用于完成上下文的同步,在此不作详细描述,详细内容可参考Power PC的用户编程手册。

操作系统实现:多CPU互斥机制

在多CPU环境下对共享资源的访问需要一种互斥锁(spin lock)来进行同步,尤其是在中断上下文环境中对共享资源进行访问的情况下。Power PC CPU通过lwarx和stwcx指令可以实现一个test and set的原子操作。利用这个原子操作,可以构造一个自旋锁来保护共享数据。应用程序在访问共享数据的时候,首先试图获取保护该数据结构的自旋锁,若获取成功,则访问共享的数据结构,否则进入忙等待状态。

下面给出一个典型的自旋锁的实现。首先看该自旋锁的获取操作:

第一条指令,li r4,1,用于初始化r4寄存器,然后调用test-and-set例程(该例程的实现参考上节)。在test and set例程里,会对自旋锁(一个内存字)进行判断,若自旋锁当前状态为可获取状态(为0),则test and set设置自旋锁为1(r4寄存器),并设置CR0寄存器中的特定比特(该比特用于标志比较结果),若自旋锁处于被占用状态,则test and set例程直接返回。在上述代码中,若test-and-set例程没有获得自旋锁,则bne指令会被执行,从而导致该例程又一次被调用,直到获得自旋锁为止。

下面是自旋锁的释放代码:(www.xing528.com)

代码比较简单,stwcx指令把自旋锁清零,并清除Reserve比特。需要注意的是,stwcx与Acquire_lock中的lwarx指令(实际上在test and set例程中)对应。

在上述实现中,还涉及两条指令isync和sync。这两条指令用于完成上下文的同步,在此不作详细描述,详细内容可参考Power PC的用户编程手册。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈