[内核入门] 关于select和poll的问题

shop_ping 2013-11-29 06:31:29

新手第一次发帖好紧张,也不知道这个问题是不是太浅显了,但是还希望各大牛能帮帮小弟。废话不多说

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

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

这是我不解的地方,上面的理解也不知道有没有错误,还请各位指教!
...全文
149 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2013-12-01
  • 打赏
  • 举报
回复
汗。。。别上升到内核级别,你这缺乏应用层经验啊。 没有select/poll,你一样可以在一个线程里处理若干个fd,无非设置成非阻塞,不停的去尝试read/write而已。 但这样的问题就是如果长时间不可读写,你还不停的忙轮询,就是浪费CPU了,所以就发明了select/poll。 具体到实现,select/poll都是走系统调用syscall陷入内核,然后让出cpu挂起,等内核获得相关设备中断后重新schedule恢复select进程的执行。
shop_ping 2013-11-30
  • 打赏
  • 举报
回复
引用 4 楼 Idle_Cloud 的回复:
select poll 的优势,你看看socket就知道了,你不知道对方什么时候发送消息,如果你堵塞了,那就很麻烦,所以不能堵塞。 对于你那个隔一段时间调用一次poll,那个应用层的行为。 你2楼的问题,我也没怎么看明白。
谢谢你。 我现在就是不明白一个问题: 加入我们读取到了可读设备文件的个数,只是个数。那么,我们怎么知道对应的具体是哪些设备文件是可读的呢?(难道是一个一个去询问?)
Carl_CCC 2013-11-30
  • 打赏
  • 举报
回复
select poll 的优势,你看看socket就知道了,你不知道对方什么时候发送消息,如果你堵塞了,那就很麻烦,所以不能堵塞。 对于你那个隔一段时间调用一次poll,那个应用层的行为。 你2楼的问题,我也没怎么看明白。
shop_ping 2013-11-30
  • 打赏
  • 举报
回复
竟然也是没有人回复么????我顶
Carl_CCC 2013-11-30
  • 打赏
  • 举报
回复
引用 5 楼 King_BingGe 的回复:
[quote=引用 4 楼 Idle_Cloud 的回复:] select poll 的优势,你看看socket就知道了,你不知道对方什么时候发送消息,如果你堵塞了,那就很麻烦,所以不能堵塞。 对于你那个隔一段时间调用一次poll,那个应用层的行为。 你2楼的问题,我也没怎么看明白。
谢谢你。 我现在就是不明白一个问题: 加入我们读取到了可读设备文件的个数,只是个数。那么,我们怎么知道对应的具体是哪些设备文件是可读的呢?(难道是一个一个去询问?)[/quote] 对于select机制,是的,select函数返回后一个一个去询问,不过那个速度很快的。比起堵塞好很多了。
shop_ping 2013-11-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肯定会有读出这类设备文件的机制吧? 但是,很遗憾,我没有找到。 在此恳请大神。
shop_ping 2013-11-29
  • 打赏
  • 举报
回复
万能的csdn大神,在uc上发帖无人理。。

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧