前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux中IO多路复用机制

Linux中IO多路复用机制

作者头像
萬物並作吾以觀復
发布2019-08-05 17:11:53
1.2K0
发布2019-08-05 17:11:53
举报
文章被收录于专栏:指尖下的Android指尖下的Android

之前的面试有问到主线程在 ActivityThread 里初始化 Looper 后调用了 Looper.loop() 这个死循环为什么不会阻塞主线程,当时回答因为在 Looper.loop() 方法里调用了 MessageQueue.next() 方法,这个 next() 中调用了nativePollOnce() ,这个本地方法最终实现是 android_os_MessageQueue_nativePollOnce ,因为这里的 IO 机制采用 epool ,当它没有消息时会调用 wait() 函数释放 CPU 进入休眠等待,当有消息来临会通过管道写入来通知唤醒。后面百度了一下 epool 函数,然后对比其他 IO 模型做一个笔记,首先说 IO 是什么, IO 就是 InputStream 和 OutputStream 的缩写,输入和输出的意思,传统的我们通过字节流或字符流来操作流,此时是同步阻塞 IO 模型,后面更新的Java NIO 是同步非阻塞 IO 模型

同步阻塞 IO 模型

同步非阻塞IO模型

由上面两张图我们发现一个线程对应一个 IO 操作,然后进入阻塞或轮询判断的状态,这其实对性能损耗很大,阻塞等待 IO 拷贝返回时,用户线程不能执行后面的逻辑流,非阻塞则是开启线程轮询判断,对 CPU 消耗比较大,所以才有了我们后面的 IO 多路复用。

select 多路复用 IO 模型

先解释一个Linux中文件描述符的概念,通过文件描述符,可以找到文件指针,从而进入打开文件表,文件表里有很多关于文件的相关信息。关于Linux的IO多路复用模型还有 poll 和 epoll ,这里说一下它们之间的区别,poll 可监视的 IO数量大于 select,而 epoll 和其他两个函数的区别就是不会轮询文件描述符来操作 IO,当一个IO完毕就直接通知刷新,而不是一直轮询判断可读写的状态来刷新,简单的说,epoll 只会刷新已经成功的 IO,而其他两个函数判断 IO 是否已成功是用轮询的方式,细心的朋友会发现,我们的这个 IO 多路复用好像也没有比阻塞或非阻塞 IO 模型强到哪去,而且还要往函数里添加 socket 监听回调,IO 多路复用的核心就在于同一时刻一个逻辑流也就是一个线程可以监听操作多个 IO,而其他 IO 模型只能通过多线程来进行多个 IO 的需求。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.08.04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档