免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: tianhailong
打印 上一主题 下一主题

[数据结构] linux 内核 等待队列 [复制链接]

论坛徽章:
3
双鱼座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亚洲杯之澳大利亚
日期:2015-04-20 00:28:02
11 [报告]
发表于 2013-08-30 13:17 |只看该作者
这个根据你的进程睡眠时是使用独占(exclusive)还是非独占(non-exclusive)的方式.
  当条件满足时,某个等待队列的 所有的非独占进程都会被唤醒,以及其中的第一个独占进程会被唤醒.
从源码来看, 加入等待队列有两种方式, 一种是插入到队列头, 用于非独占等待的进程. 另一种是插入到队列尾用于独占等待;
当被唤醒时, 会遍历等待队列的所有进程, 唤醒标志为NON-exclusive的所有进程和第一个标志为excluisve的进程.

     waitqueue------>Non-exclusive ------>Non-exclusive------->Non-exclusive------>exclusive--->exclusive
                      ^                                                                                                               ^
                     Non-exclusive                                                                                                 exclusive

论坛徽章:
0
12 [报告]
发表于 2013-08-30 15:05 |只看该作者
您看,如果有1,2,3,4,5,6 这些不同的进程在等待磁盘,
如果他们都被挂载到 等待磁盘的等待队列中,
此刻 4 进程可以读了,
内核会唤醒这个等待队列中的4号进程,
不会把1,2,3,4,5,6都唤醒吧,
因为1,2,3,5,6 即使唤醒也会发觉 准备好的不是我要读的文件,
就是说当等待的事件发生时,
内核也要遍历队列,来确定把谁唤醒,我这样理解对不对呢?

顺便问另一个问题,磁盘和cpu 一样,同一时刻,只能供一个进程使用吧,其他的进程
在一个队列里排队等候?
回复 8# dxyf1524


   

论坛徽章:
0
13 [报告]
发表于 2013-08-30 15:07 |只看该作者
当条件满足时,某个等待队列的 所有的非独占进程都会被唤醒,以及其中的第一个独占进程会被唤醒.
这个指的是什么意思,我们都在等待磁盘,但是等的文件不一样,磁盘有一个文件可读时,
对于 磁盘这个等待队列来说,其实只有一个进程是满足条件,其他的还要继续等待吧?
回复 11# kiongf


   

论坛徽章:
3
双鱼座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亚洲杯之澳大利亚
日期:2015-04-20 00:28:02
14 [报告]
发表于 2013-08-30 17:29 |只看该作者
回复 13# tianhailong


   

    举个buffer的例子:
    假设有N个进程想要锁住一个buffer, 首先它们试图取获得buffer的BH_LOCK; 之前已经有一个进程在获得了这个'锁', 那么这N个进程都会陷入睡眠, 它们以独占等待的方式进入睡眠.  而已经获得了这个锁的进程A假设要执行写回操作, 它也会把'锁'的控制权交给块层进行IO传输操作, 自己也在等待这个锁而陷入非独占等待的睡眠.  
    一旦IO传输完成, 那么回调函数将会释放这个锁. 那么之前获得锁的进程A和独占等待的第一个进程B都会被唤醒.

       A和B和N-1个进程, 共同等待的事件是锁被释放, 但A和B(以及N-1个进程)等待的事件发生后执行的操作不同。  B和其他N-1个进程唤醒后的共同动作都是试图获得buffer的控制权, 但同一时间仅有一个能获得, 所以没必要唤醒全部, 只唤醒其中一个就好了. 而A则不同,  A并不会抢buffer的控制权, 所以唤醒它之后它爱干吗干吗.
      
      所以,选择独占等待和非独占等待的操作在于, 它们被唤醒后会不会抢某个共有资源的控制权.

---------------------
     如果还不能理解的话,  那么考虑进入等待队列的进程 是没有被CPU调度的权利的. 如果共同抢夺某个资源的进程门都一起被唤醒, 那么它们都会获得被调度的权利,。它们被调度后, 第一件事就是抢夺资源, 又因为没有得到资源再次睡眠. 如此反复. 白白浪费了许多CPU时间.
      

      

论坛徽章:
3
双鱼座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亚洲杯之澳大利亚
日期:2015-04-20 00:28:02
15 [报告]
发表于 2013-08-30 17:40 |只看该作者
回复 13# tianhailong

   通俗点说
     看你的进程想要磁盘做什么.       N个高帅富想要自己霸占一个女神, 高帅富得等待女神分手.  N个吊死也在等女神分手, 但是它们没有竞争的欲望(资格), 等到女神分手事件发生后, 一个高帅富赢得美人归(其它高帅富继续排队祝他们早日分手), 吊死白日梦醒该干嘛干嘛去.

   

论坛徽章:
0
16 [报告]
发表于 2013-08-30 18:56 |只看该作者
回复 12# tianhailong


    这里涉及到一些进程调度方面的东西,唤醒的原因可能是很多方面,究竟那一个进程被唤醒,这里由机制处理,你理解就行,不必太过纠结
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP