C_blankbird 2018-10-30 04:09 采纳率: 0%
浏览 756
已结题

linux0.11中lock_buffer函数为什么采用进程关中断,然后进入睡眠?

linux0.11有一段对缓冲块上锁的代码,定义在ll_rw_blk.c文件中:

    static inline void lock_buffer(struct buffer_head * bh)
{
    cli();
    while (bh->b_lock)
        sleep_on(&bh->b_wait);
    bh->b_lock=1;
    sti();
}

可以看到,函数先关闭中断,然后缓冲块被锁定的话就跑去睡眠。直到该缓冲块解锁的时候唤醒所有等待该缓冲块的进程(包括此进程)。这里有个矛盾,假设缓冲块上锁的原因是正在进行磁盘读写,那么解锁必然发生在磁盘中断的中断处理程序中,但是这个时候中断被关闭了,磁盘中断不能被处理,那么这个缓冲块不是永远得不到解锁了吗?
想了好久没想通,是不是我哪里理解错误了?

问题解决了:原因是中断许可标志位在EFLAGS寄存器中,而这个寄存器是进程上下文的一部分,也就是说每个进程都有各自的中断许可状态。所以如果一个进程关闭中断并跑去睡眠,并不影响其后进程的中断位状态。

  • 写回答

1条回答

  • zqbnqsdsmd 2018-10-31 14:37
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)