llxmars的个人空间 https://blog.eetop.cn/193015 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

看到别人对wait_on_buffer()中cli,sli的理解[转述]

已有 2746 次阅读| 2011-3-6 19:52

取自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核有一个充分的准备!希望大家能够经常发出这样有价值的帖子,当然最好能够事先仔细分析一下!


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 0

    获赞
  • 2

    评论
  • 976

    访问数
关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-13 20:23 , Processed in 0.009614 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部