免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1747 | 回复: 5

[内核入门] 关于select和poll的问题 [复制链接]

论坛徽章:
0
发表于 2013-11-29 17:24 |显示全部楼层
新手第一次发帖好紧张,也不知道这个问题是不是太浅显了,但是还希望各大牛能帮帮小弟。废话不多说

1.我使用系统调用select去检测是否有设备文件可读,首先运行./monitor
此时打印的信息是,显示无文件可读(因为我还没有执行写操作),这个可以理解。
2.说道第一步的monitor,通过printk,发现底层驱动的poll函数被调用了一次,记住仅仅是一次,我使用的dmesg命令查看的,
在这里有个问题。因为我在晚上查阅资料,有人说,隔一段时间会调用一次poll?
3.执行完monitor后,我这边的效果是进入睡眠了,所以我就执行write,写数据进去。此时monitor突然活了,也就是说被唤醒了。因为我在底层的write函数中实现了唤醒操作
这个也没有问题,之后,程序就跑完了。

现在我的理解是:select会去检测一类设备文件,测试其是否可以读写,如果没有则进入休眠,记住如果需要用到它,一定记得唤醒。
如果有设备可读写呢?就不会进入阻塞。那它的优势到底体现在什么地方呢?

这是我不解的地方,上面的理解也不知道有没有错误,还请各位指教!

论坛徽章:
0
发表于 2013-11-29 18:29 |显示全部楼层
自己思考了一下。小小总结了一下,把心得发出来,希望高人指点
以下内容为我自己的理解,有误之处,请指出。
1.假设有A、B、C、D四个设备文件
2.如果我们在一个应用程序中打开了这四个设备文件
3.如果这四个设备文件都不具备读写属性的时候,那么该进程阻塞
4.假如四个设备中,至少有一个设备文件是可读或者可写(这个由poll返回值表示)的话,那么改进程将不会发生阻塞,同时select函数会返回具有可读或是写属性的
设备文件的个数。值得注意的是:select函数会遍历各个设备文件中的底层poll函数,以探测其属性。

那么,这样做有什么原因呢?
1.在之前已经提到过,当我们程序中的设备文件A不具读写属性(我暂且这样叫),而其他几个是具有这种属性的话。那么当我们读取设备文件A的时候,将会引起整个
进程的阻塞,这样将会使得BCD 四个设备文件也无法读取,极大影响系统的执行效率
2.当引入poll机制的话, 那么在select函数的探测中,只要含有可读写设备文件,那么该进程就不会阻塞,我们可以在进程中,对各个设备文件进行轮流read。
3.我用一个伪代码来表示

app.c

1. fd_num = select (.......)
2.if(fd_num)
{
  read 1;
  read 2;
  read 3;
}

上面是我个人的理解,肯定有许多地方有问题。
纵然如此,我还是有地方不懂:
1.我知道在真正的应用中,肯定不是轮流去read,那么是如何做的呢?
2.即使是我们读取到了fd_num,那又怎么样呢?那又该如何知道哪些设备文件是已经具有读写属性的呢?linux肯定会有读出这类设备文件的机制吧?
但是,很遗憾,我没有找到。
在此恳请大神。

论坛徽章:
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
发表于 2013-11-30 11:57 |显示全部楼层
回复 2# wsshopping
1.在之前已经提到过,当我们程序中的设备文件A不具读写属性(我暂且这样叫),而其他几个是具有这种属性的话。那么当我们读取设备文件A的时候,将会引起整个
进程的阻塞,这样将会使得BCD 四个设备文件也无法读取,极大影响系统的执行效率
2.当引入poll机制的话, 那么在select函数的探测中,只要含有可读写设备文件,那么该进程就不会阻塞,我们可以在进程中,对各个设备文件进行轮流read。


你的理解完全错误,建议先从书上或者网络上了解一下基本的基础知识,然后再看内核代码。网络资料很多,随便搜索一个http://www.jb51.net/article/37416.htm




   

论坛徽章:
0
发表于 2013-11-30 12:18 |显示全部楼层
回复 3# 瀚海书香


    谢谢版主的回复,我说的第1点提到整个进程阻塞指的是 阻塞IO方式 访问(并没有引入select/poll)。这些也是我结合书本/网络 产生的理解。你指的那个链接博文我看过了。可是并没有说明
这个问题:

假如select返回了当前可读写设备文件的个数num,那么我们如何知道具体哪些设备文件是可读写得呢?  (难道是一个一个去轮询么?)


另外,我确实是结合书本来看的,或许有些地方描述的不清楚,版主,还请指点迷津,哪些地方理解有误  谢谢。。

论坛徽章:
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
发表于 2013-11-30 12:27 |显示全部楼层
回复 4# wsshopping
假如select返回了当前可读写设备文件的个数num,那么我们如何知道具体哪些设备文件是可读写得呢?  (难道是一个一个去轮询么?)


select和poll的机制是去轮询。
epoll是通过注册回调的方式,不需要轮询。
   

论坛徽章:
0
发表于 2013-12-02 09:55 |显示全部楼层
回复 5# 瀚海书香


    好的,谢谢版主了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP