免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5101 | 回复: 15
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-25 16:31 |只看该作者 |倒序浏览

进程以阻塞方式访问设备并对其进行操作时,如果不能及时获得设备资源则会被挂起,直到满足可操作的条件时才进行相应的操作。被挂起的进程会进入睡眠状态,并被移至某个等待队列;当条件满足时候,会被移出这个等待队列

这个事对于等待队列的描述

其中有个问题我不太清楚,

比如说:

           A 进程在等待 读file1,磁盘比较慢,A进程会被放入一个等待队列阻塞,直到内核完成读,唤醒进程A

但是这种类似的事件很多,系统中有数千个进程,每个进程可能读文件,可能等待socket,可能等待信号量.....
内核中不就有成千个不同的等待队列了?
例如:

        file1 有一个等待队列
        file2 有一个等待队列
        .......
        file1000 有一个等待队列

请大家指教了

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 2013-08-26 09:04 |只看该作者
回复 1# tianhailong
但是这种类似的事件很多,系统中有数千个进程,每个进程可能读文件,可能等待socket,可能等待信号量.....
内核中不就有成千个不同的等待队列了?
例如:

        file1 有一个等待队列
        file2 有一个等待队列
        .......
        file1000 有一个等待队列

请大家指教了


以socket为例,如果设置socket为block类型,那么对这个sock的recv,如果没有数据包到达就会将读取的进程放到sock->sk_sleep()等待队列中。
每个socket都有一个等待队列,所以内核的确有非常多的等待队列。
   

论坛徽章:
0
3 [报告]
发表于 2013-08-26 14:39 |只看该作者
谢谢,还有点不明白的,
一个机器可能有几万个socket,
如果都设置成阻塞的,
内核不是至少要几万个等待队列了?回复 2# 瀚海书香

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
4 [报告]
发表于 2013-08-26 19:15 |只看该作者
回复 3# tianhailong
谢谢,还有点不明白的,
一个机器可能有几万个socket,
如果都设置成阻塞的,
内核不是至少要几万个等待队列了


1. 内核socket默认就是阻塞的
2. 如果socket有几万个,那就有几万个等待队列了。

你应该去看看等待队列的代码。 其实几万个等待队列跟有几万个socket没有什么本质的区别,就是多用些内存罢了。

论坛徽章:
0
5 [报告]
发表于 2013-08-28 16:15 |只看该作者
你的对等待队列的理解没什么大问题,但是这个等待队列的队列头却不是以文件或者socket来指定的,而是指特定的事请,比如说你的文件读写导致进程睡眠,很可能是磁盘驱动器在驱动层
建立一个等待队列头,所有等待访问磁盘的进程都挂载这一队列上

论坛徽章:
0
6 [报告]
发表于 2013-08-29 18:53 |只看该作者
谢谢指教,昨天一直忙没顾上问您,具体的事件指什么呢,
等待 读 文件 是个 事件
等待 读 socket 也是个事件,?
如果等待一个socket算一个事件,
那么内核还是有可能为每个socket建立一个队列?

还有您举得列子:
比如说你的文件读写导致进程睡眠,很可能是磁盘驱动器在驱动层
建立一个等待队列头,所有等待访问磁盘的进程都挂载这一队列上
但是当一个读满足条件时,应该有一个进程被唤醒处理,但是这个队列上有很多进程,
内核怎么决定唤醒谁呢
回复 5# dxyf1524


   

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
7 [报告]
发表于 2013-08-29 23:27 |只看该作者
回复 6# tianhailong


    全部唤醒吧,然后发生所谓的惊群效应?

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


    你应该向底层看去,比如说为了满足用户的文件的需求,这里涉及到文件系统和块设备驱动的设计,不同的环境不同的机制,我说不全。
但是针对磁盘访问来说,我给你一个假想的流程吧,访问磁盘文件,你的内核驱动最终要操作磁盘控制器读取某一位置的数据。而很可能块设备驱动
里面有一个IO请求队列,将所有的访问该磁盘的文件读写请求调度和排列,以更好的使磁盘连续读取,提高整体性能,所谓的你读文件的某一进程
睡眠,就是现在的磁盘驱动程序还无法满足你的要求,正在为别人服务,所以让你睡一会,等我调度到你的时候,我自然有办法唤醒你,通知你,醒来吧
至于这个醒来的机制,有很多方法,也跟你访问的方式有关,至于上面说的全部唤醒,实际上如果是互斥的访问要求,一般只唤醒一个,内核也会尽量避免所有睡眠
在某一等待队列的进程如洪水猛兽般醒来的这样的事发生,你说对吧

论坛徽章:
0
9 [报告]
发表于 2013-08-30 08:59 |只看该作者
回复 6# tianhailong

http://blog.163.com/leyni@126/bl ... 010220122611523786/
你可一看下这个
   

论坛徽章:
0
10 [报告]
发表于 2013-08-30 09:38 |只看该作者
回复 6# tianhailong
#define wake_up(x)                        __wake_up(x, TASK_NORMAL, 1, NULL)
#define wake_up_nr(x, nr)                __wake_up(x, TASK_NORMAL, nr, NULL)
#define wake_up_all(x)                        __wake_up(x, TASK_NORMAL, 0, NULL)
#define wake_up_locked(x)                __wake_up_locked((x), TASK_NORMAL)

等待队列唤醒有好几种方式,可以只唤醒一个,也可以唤醒全部,不同场景应用不同


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP