就是 spin_lock() 和 spin_unlock()
这两个函式。在上面我们已见过这两个函式展开的情形了, 在 UP 的环境里,这两个函式跟空的没什幺两样。但为何在UP底下,他们能够做到保护 critical
section的作用呢?原因其实也讲过了,因为在UP底下只有一个 CPU,所以,在同一时间只有一个行程在执行,除非行程自己放弃执行,不然只有 interrupt
会中断其执行。刚才我们说过,使用这组函式的前提是在 interrupt handler 中不能使用到放在 critical section 中的资料结构。既然在
interrupt handler 中不会使用到,就算在 critical section 使用这个资料结构使用到一半,中断突然发生,处理完中断,CPU
还是会直接回来执行 critical section 的程式码。所以,不会造成受保护的资料结构的不稳定。我们现在来看看,假如我们使用这组函式, 而且在
interrupt handler 中使用受保护的资料结构时会发生什幺事。
|
spin_lock(&lock); .... <------ interrupt spin_lock(&lock); ... spin_unlock(&lock) |
|
在 UP 的的环境下,由于 spin_lock()
是空的,则当中断发生时,很有可能行程使用资料结构到一半,中断跑进来,也在使用他,造成这个资料结构的不稳定。假如是在SMP的环境下,由于 spin_lock()
是真的有在做事,所以当中断发生时,假如这个中断是发生在别的 CPU 上, 那就没事,因为 spin_lock() 只会让中断发生的 CPU suspend
住而已。等原先的 CPU 执行完 spin_unlock() 他就能够恢复了,但是假如这时的中断还是发生在原先的 CPU 上时,那在 interrupt
handler 中,CPU 会一直被 suspend 住,直到 lock 被释放为止。这就造成了一个 dead lock。因为这颗 CPU 现在已被 lock
住,如何离开 interrupt handler 去呼叫 spin_unlock() 呢。
混合使用
针对 rwlock_t 这组函式除了上面提到的用法外,事实上,还是能够混合 spin_lock() 及 spin_unlock() 来使用的。由于
rwlock_t 能够允许多个 reader,所以假如在 interrupt handler 中只会读取受保护的资料结构,而不会去修改他的话,那我们能够使用
spin_lock() 这组函式,但是当行程要修改资料结构时,还是得呼叫 write_spin_lock() 及 write_spin_unlock()
这组的函式。这样既能够增加执行的效率,又能够确保重要资料结构的稳定性了。
结论
虽然在 UP 的环境中,保护重要的资料结构只要呼叫 cli() 和 sti() 就好,但是随着 SMP 技术的成熟,相信 SMP
系统会逐渐的增加,为了让自己写的程式具备可移植性,善用 spinlock 这项机制相信会为未来省下相当修改程式码的功夫。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!