[内核入门] 关于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会去检测一类设备文件,测试其是否可以读写,如果没有则进入休眠,记住如果需要用到它,一定记得唤醒。
如果有设备可读写呢?就不会进入阻塞。那它的优势到底体现在什么地方呢?

这是我不解的地方,上面的理解也不知道有没有错误,还请各位指教!
...全文
158 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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上发帖无人理。。
[14本经典Android开发教程] 8 Linux内核阅读心得体会 读核感悟 2 读核感悟 Linux内核启动 内核的生成 2 读核感悟 Linux内核启动 从hello world说起 3 读核感悟 Linux内核启动 BIOS 5 读核感悟 Linux内核启动 setup辅助程序 6 读核感悟 Linux内核启动 内核解压缩 8 读核感悟 Linux内核启动 开启页面映射 9 读核感悟 Linux内核启动 链接脚本 11 读核感悟 伪装现场 系统调用参数 13 读核感悟 伪装现场 fork 系统调用 15 读核感悟 伪装现场 内核线程: 17 读核感悟 伪装现场 信号通信 19 读核感悟 kbuild系统 内核模块的编译 22 读核感悟 kbuild系统 编译到内核和编译成模块的区别 24 读核感悟 kbuild系统 make bzImage的过程 26 读核感悟 kbuild系统 make menuconfig 31 读核感悟 文件系统 用C来实现面向对象 32 读核感悟 设计模式 用C来实现虚函数表和多态 32 读核感悟 设计模式 用C来实现继承和模板 33 读核感悟 设计模式 文件系统和设备的继承和接口 34 读核感悟 设计模式 文件系统与抽象工厂 36 读核感悟 阅读源代码技巧 查找定义 37 读核感悟 阅读源代码技巧 变量命名规则 42 读核感悟 内存管理 内核中的页表映射总结 43 读核感悟 健壮的代码 exception table 内核中的刑事档案 44 读核感悟 定时器 巧妙的定时器算法 45 读核感悟 内存管理 page fault处理流程 45 读核感悟 文件读写 select实现原理 47 读核感悟 文件读写 poll的实现原理 49 1 功能介绍: 49 2 关键的结构体: 49 3 poll的实现 49 4 性能分析: 50 读核感悟 文件读写 epoll的实现原理 50 1 功能介绍 50 2 关键结构体: 51 3 epoll create的实现 53 4 epoll ctl的实现 53 5 epoll wait的实现 54 6 性能分析 54 读核感悟 同步问题 同步问题概述 55 1 同步问题的产生背景 55 2 内核态与用户态的区别 55 读核感悟 同步问题 内核态自旋锁的实现 56 1自旋锁的总述 56 2非抢占式的自旋锁 56 3 锁的释放 57 4 与用户态的自旋锁的比较 57 5 总结 58 读核感悟 内存管理 free命令详解 58 读核感悟 文件读写 2 6 9内核中的AIO 59 1 AIO概述 59 2 内核态AIO的使用 61 读核感悟 文件读写 内核态AIO相关结构体 61 1 内核态AIO操作相关信息 61 2 AIO上下文: 63 3 AIO ring 63 4 异步I O事件的返回信息 64 读核感悟 文件读写 内核态AIO创建和提交操作 65 1 AIO上下文的创建 io setup 65 2 AIO请求的提交:io submit实现机制 66 读核感悟 文件操作 AIO操作的执行 66 1 在提交时执行AIO 66 2 在工作队列中执行AIO 66 3 负责AIO执行的核心函数aio run iocb 67 4 AIO操作的完成 67 读核感悟 文件读写 内核态是否支持非direct I O方式的AIO 67 已上传7本: [14本经典Android开发教程] 1 Android开发从入门到精通 http: download csdn net detail cleopard 8355245 [14本经典Android开发教程] 2 Android开发手册 API函数详解 http: download csdn net detail cleopard 8374487 [14本经典Android开发教程] 3 Android SDK 中文开发文档 http: download csdn net detail cleopard 8380429 [14本经典Android开发教程] 4 Android应用程序开发36技 http: download csdn net detail cleopard 8380495 [14本经典Android开发教程] 5 linux Android基础知识总结 http: download csdn net detail cleopard 8380529 [14本经典Android开发教程] 6 Android驱动开发入门及手机案例开发分析教程 http: download csdn net detail cleopard 8388019 [14本经典Android开发教程] 7 Android编程入门教程 http: download csdn net detail cleopard 8388043 剩余8本稍后上传 @或直接从这里寻找@ http: download csdn net user cleopard album @更多@ http: cleopard download csdn net 福利 http: xuemeilaile com 17份软件测试文档 http: download csdn net album detail 1425 13份WPF经典开发教程 http: download csdn net album detail 1115 C#资料合辑二[C#桌面编程入门篇] http: download csdn net album detail 957 C#资料合辑一[C#入门篇] http: download csdn net album detail 669 [Csharp高级编程 第6版 ] 共8压缩卷 http: download csdn net album detail 667 10个[精品资源]Java学习资料合辑[一] http: download csdn net album detail 663 10个C#Socket编程代码示例 http: download csdn net album detail 631 6份GDI+程序设计资源整合[全零分] http: download csdn net album detail 625 2014年移动游戏行业数据分析 http: download csdn net detail cleopard 8340331 一文读懂2014年全球互联网广告新生态 http: download csdn net detail cleopard 8340303">[14本经典Android开发教程] 8 Linux内核阅读心得体会 读核感悟 2 读核感悟 Linux内核启动 内核的生成 2 读核 [更多]

1,324

社区成员

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

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