当前位置: 技术问答>linux和unix
[内核入门] 关于select和poll的问题
来源: 互联网 发布时间:2017-05-03
本文导语: 新手第一次发帖好紧张,也不知道这个问题是不是太浅显了,但是还希望各大牛能帮帮小弟。废话不多说 1.我使用系统调用select去检测是否有设备文件可读,首先运行./monitor 此时打印的信息是,显示无文件可读(因为我还没...
新手第一次发帖好紧张,也不知道这个问题是不是太浅显了,但是还希望各大牛能帮帮小弟。废话不多说
1.我使用系统调用select去检测是否有设备文件可读,首先运行./monitor
此时打印的信息是,显示无文件可读(因为我还没有执行写操作),这个可以理解。
2.说道第一步的monitor,通过printk,发现底层驱动的poll函数被调用了一次,记住仅仅是一次,我使用的dmesg命令查看的,
在这里有个问题。因为我在晚上查阅资料,有人说,隔一段时间会调用一次poll?
3.执行完monitor后,我这边的效果是进入睡眠了,所以我就执行write,写数据进去。此时monitor突然活了,也就是说被唤醒了。因为我在底层的write函数中实现了唤醒操作
这个也没有问题,之后,程序就跑完了。
现在我的理解是:select会去检测一类设备文件,测试其是否可以读写,如果没有则进入休眠,记住如果需要用到它,一定记得唤醒。
如果有设备可读写呢?就不会进入阻塞。那它的优势到底体现在什么地方呢?
这是我不解的地方,上面的理解也不知道有没有错误,还请各位指教!
|
汗。。。别上升到内核级别,你这缺乏应用层经验啊。
没有select/poll,你一样可以在一个线程里处理若干个fd,无非设置成非阻塞,不停的去尝试read/write而已。
但这样的问题就是如果长时间不可读写,你还不停的忙轮询,就是浪费CPU了,所以就发明了select/poll。
具体到实现,select/poll都是走系统调用syscall陷入内核,然后让出cpu挂起,等内核获得相关设备中断后重新schedule恢复select进程的执行。
没有select/poll,你一样可以在一个线程里处理若干个fd,无非设置成非阻塞,不停的去尝试read/write而已。
但这样的问题就是如果长时间不可读写,你还不停的忙轮询,就是浪费CPU了,所以就发明了select/poll。
具体到实现,select/poll都是走系统调用syscall陷入内核,然后让出cpu挂起,等内核获得相关设备中断后重新schedule恢复select进程的执行。