手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

Spinlock 简介

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
就是 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
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!