专栏首页指尖下的AndroidLinux中IO多路复用机制

Linux中IO多路复用机制

之前的面试有问到主线程在 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 的需求。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android 状态切换控件 EasyStateView

    简单介绍一下这个控件,像我们在实际的开发过程中,经常性的会遇到这样的场景,比如进入一个页面先出来加载动画,然后请求数据,如果网络异常就显示网络异常的布局,数据异...

    萬物並作吾以觀復
  • TextView中DrawableXXX图片无法设置大小的解决方案

    在开发过程中我们往往会遇到图片旁边带文字的布局,这种布局有些比较Low的开发会直接用一个ImageView和TextView,有经验的会给TextView设置D...

    萬物並作吾以觀復
  • 安卓运动圆环自定义View

    记得这个东西原来有个同事问过我,当时正在自学自定义View和属性动画这一块,对这个功能也没有写过,所以就google了一下,发了几个类似效果的github项目给...

    萬物並作吾以觀復
  • python并发编程

    py3study
  • Linux IO 概念(2)

    在上一篇IO底层的概念中杂合了很多模糊的概念,受知识水平的限制,只是从网上抄了很多过来.从linux一切皆文件的设计哲学,介绍了文件描述符,从进...

    用户3033338
  • python之IO多路复用

      为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。

    py3study
  • 彤哥说netty系列之IO的五种模型

    本文将介绍linux中的五种IO模型,同时也会介绍阻塞/非阻塞与同步/异步的区别。

    彤哥
  • 你所不知道到的NVMe

    NVMe SSD具有高性能、低时延等优点,是目前存储行业的研究热点之一,但在光鲜的性能下也同样存在一些没有广为人知的问题,而这些问题其实对于一个生产系统而言至关...

    Linux阅码场
  • Java|网络IO之同步、异步、阻塞、非阻塞

    黄小怪
  • 【Java小工匠】JavaNIO-基础概念

    阻塞与非阻塞主要是程序等待消息通知时的状态角度来说的。阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。

    Java小工匠

扫码关注云+社区

领取腾讯云代金券