分类: LINUX
2008-05-09 22:59:41
Spin_lock()
//
Spin_unlock()
自旋锁的作用就是对于一个临界资源将其进行锁定,使得同时不能有两个及以上的进程对该临界资源进行访问。
在smp上面,调用了spin_lock()之后,如果该锁现在没有被锁定,则锁定该锁并进入临界区,此时如果另一个CPU也要用到当前锁,则会自旋,但是在自旋的时候,它会调用preemp_enable(),使得其进程是可抢占的,因此可以被更高优先权的进程所抢占。
如果是在单CPU上面,则只是执行禁止与开户抢占这个功能。对于这个情况:
Spin_lock()
//
Spin_unlock()
假如运行在其中的时候该进程的时间片用完了的话,是该如何来处理呢?
在单处理机上,spin_lock()就退化成了。Preemp_disable(),它就是禁止抢占,即虽然时间片用完了,但是仍然是不能切换到其它进程去的。因此每个进程有一个preemp_count这个变量,如果这个变量为0的话表示其可以被其它进程所抢占,如果大于0则不能够被抢占,而在调用preemp_disable()的时候就会将该进程的preemp_count值加1。使得其不能够被抢占。而继续运行该进程,直到调用preemp_enable()将其设为可抢占,由于时间一般不长,因此不会有影响。
但是spin_lock()虽然不会进行进程切换,但它可能会被中断给打断,执行中断处理程序,此时在中断处理程序中就不能再调用spin_lock()去锁定刚刚被锁定的内容。否则会引起死锁。因此在内核中就会使用另外两个函数。
Spin_lock_irqsave()
Spin_unlock_irqstore()