|
取自linuxorg论坛
[这个贴子最后由love-centry在 2005/03/18 10:26pm 第 2 次编辑]
个人觉得这段代码肯定是工作在内核态.
之所以要中断,其实前面的贴子已经说了,一条C语言并不对应于一条汇编语言,所以当计算机在判断inode->i_lock是否置位时至少需要两条语句,首先将inode->i_lock值读入寄存器中,然后再将该寄存器的值与立即数1进行与操作,看值是否等于1.若该过程不进行关中断,那么很有可能出现以下不正常现象:
计算机系统将inode->i_lock值读入寄存器中,假设这时inode->i_lock值为1,说明当前系统正在对该I节点进行修改. 一旦执行为这语句后,计算机系统发生一中断,该中断的主要的作用就是将inode->i_lock值复位成0,也就是说该I节点已经修改完成,可以被别的进程修改.并且系统会唤醒该inode等待队列的第一个进程.然后中断返回.注意这时系统将执行刚才被中断的那个进程,由于刚才那个进程已经将 inode->i_lock值读入了寄存器,所以系统用寄存器里的inode->i_lock值与立即数1进行比较,比较结果是该I节点还处于lock状态,产生了误解,将该进程加入到该I节点的等待队列中,然后重新调度.
从上面的讨论中我们可以看到这时该进程睡眠是没有必要的,也是不正确的!只有将中断关闭才能够阻止这种现象发现!
其实对于上面的讨论我认为还是非常有用的,只有这样才能正常理解linux0.11内核,才能对理解2.4核有一个充分的准备!希望大家能够经常发出这样有价值的帖子,当然最好能够事先仔细分析一下!