大家好,我是老三,人生有三大难题,事业、爱情,和

——这顿吃什么!

人在家中躺,肚子饿得响,又到了不得不吃的时候,这顿饭该怎么吃?吃什么呢?

Linux里有五种IO模型:阻塞IO非阻塞IO多路复用IO信号驱动式IO异步IO,我发现这五种IO模型,其实能和吃饭这件事关联起来。

阻塞IO(Blocking I/O)

阻塞IO是最常见的IO模型。

当发起一个IO操作时,比如读取数据,系统会调用read()函数。如果请求的数据没有准备好,此时进程会被挂起(blocked),进入等待状态。直到数据准备好,而且复制到应用进程的缓冲区,这时候才会返回。

从调用到返回,整个时间段都是阻塞的,所以被称为阻塞IO。

就像是手机没电的时候,去饭馆吃饭,我点完菜,只能等着厨师做好,服务员端上来,我才能愉快干饭。这段时间,我就只能坐在座位上干等。

非阻塞IO(Non-Blocking I/O)

阻塞IO,还是比较浪费资源的,那么非阻塞IO就来了。

所谓非阻塞IO,是在调用IO操作时,如果缓冲区没有数据的话,直接返回一个错误码。应用进程需要不断轮询,来检查数据是否准备好。数据准备好了,就返回数据。

就像是我奢侈一把,想吃个西餐,于是就去了肯德基,点完餐,我就可以坐着刷刷手机。当然,我还需要时不时地看看我的餐是不是已经备好,餐备好了,就去取一下。

多路复用IO(I/O Multiplexing)

虽然非阻塞IO相比阻塞IO,性能提升了很多,但是轮询过程中,还是有大量的系统调用,上下文切换的开销比较大。

那么,多路复用IO就来了。

多路指的是多个数据通道,复用指的是一个进程可以同时监控多个文件描述符(比如socket),当某个文件描述符状态发生变化(比如变得可读或可写),多路复用的函数将返回变化的文件描述符。

这样,在数据传输过程中,同一个进程中不同的任务都能被处理。特点是在数据传输过程中,进程能够同时处理多个任务,提高了程序的效率。

select、poll、epoll 等都是 I/O 多路复用的具体实现。

以select/poll为例,进程通过将一个或多个fd传递给select或poll系统调用,阻塞在select操作上,这样select/poll可以侦测多个fd是否处于就绪状态。当有fd就绪时,立即回调函数rollback,接下来就可以进行读取。

就像是我想吃顿好的,于是选择去吃自助餐,自助餐有很多餐区,我先看看哪个餐区有我想吃的菜,然后端着盘子去取就行了,一个人就可以取多个菜,肉、蔬菜、水果,什么都能吃一点,而且不用怎么等。

信号驱动式IO(Signal-Driven I/O)

信号驱动式IO利用信号机制来进行数据传输。

进程首先告诉内核,当数据准备好时,请发送一个SIGIO信号。进程继续执行其他任务,等到收到信号后,再开始进行数据传输。

就像是我去吃饭,外带,跟服务员打声招呼,餐好了通知我,这时候我就可以去干其它事情,餐备好之后,服务员通知我,我取餐就行了。

异步IO(Asynchronous I/O)

异步IO是指当发起一个IO操作后,系统会立即返回。异步IO操作在后台进行数据传输,数据传输完成后,系统将通知进程。这样,在整个数据传输的过程中,进程都可以执行其他任务,不需要等待。

就像是准备吃饭了,我自己懒得动,直接在某团上点个餐,点完之后爱干啥干啥,等着快递小哥给我送到就行了。


可以看到,阻塞非阻塞主要指的是等待数据这个过程应用进程需不需要挂起,同步异步指的是等待数据和数据拷贝这两个过程应用进程需不需要挂起,只有异步IO做到了完全异步。

那么最后一个问题,我到底吃了啥?——

搞点腊肉,煮了个面条,真香!


参考:

[1].《Netty权威指南》

[2]. 《Netty核心原理与RPC实践》

一顿饭的事儿,搞懂了Linux5种IO模型相关推荐

  1. linux5种IO模型以及同步异步,阻塞非阻塞

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...

  2. 让机器搞懂100万种隐含语义 腾讯Peacock模型全揭秘

    让机器搞懂100万种隐含语义 腾讯Peacock模型全揭秘 腾讯模型 36大数据 · 2015-02-28 17:21 Peacock通过并行计算对10亿x1亿级别的大规模矩阵进行分解,从海量样本数据 ...

  3. 彻底搞懂Java的网络IO

    IO是Input/Output的缩写.Unix网络编程中有五种IO模型: blocking IO(阻塞IO) nonblocking IO(非阻塞IO) IO multiplexing(多路复用IO) ...

  4. 一文弄懂Linux下五种IO模型

    Linux下主要的IO主要分为:阻塞IO(Blocking IO),非阻塞IO(Non-blocking IO),同步IO(Sync IO)和异步IO(Async IO). 同步:调用端会一直等待服务 ...

  5. 你应该知道的五种IO模型

    点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 写在前面 linux操作系统包含了五种IO模型,各种上层编程语言或者网络编程框架的上层实现都是基于操作系统的这些IO实现来实 ...

  6. 通俗易懂的5种IO模型文章

    本文讲述了五种IO模型包括:阻塞IO,非阻塞IO,IO多路复用,信号驱动IO,异步IO. 文章末尾有总结 在这里推荐一套高级JAVA面试题: 点击查看 说到IO模型,都会牵扯到同步.异步.阻塞.非阻塞 ...

  7. linux下的五种io模型,Linux下的五种IO模型

    Java中提供的IO有关的API,在文件处理的时候,其实依赖操作系统层面的IO操作实现的(关于Java对IO的三种封装,可见我的另一篇博客) 开门见山,Linux下的如中IO模型:阻塞IO模型,非阻塞 ...

  8. java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之OS_Part_2整起~IO们那些事【包括五种IO模型:(BIO、NIO、IO多路复用、信号驱动、AIO);零拷贝、事件处理及并发等模型】

    PART0.前情提要: 通常用户进程的一个完整的IO分为两个阶段(IO有内存IO.网络IO和磁盘IO三种,通常我们说的IO指的是后两者!):[操作系统和驱动程序运行在内核空间,应用程序运行在用户空间, ...

  9. 1.聊聊Netty那些事儿之从内核角度看IO模型

    从今天开始我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架. 它的设计异常优雅简洁,扩展性高,稳定性强.拥有非常详细完整的用户文档. 同时内置了很多非常有用的模块 ...

最新文章

  1. Ubuntu 14.04 python3.6 安装
  2. jQuery |淡入淡出
  3. 在Metro App中显示Toast notification
  4. 互联网架构,究竟为什么需要配置中心?
  5. 【script】python 使用json模块实现字符串与字典的相互转换
  6. python经典数据类型
  7. shell条件判断 if else
  8. 大道至简 7、8、读后感
  9. Win7中的clr_optimization服务
  10. -bash: vi: command not found -bash: ls: command not found
  11. 基于单片机的超市储物柜设计_毕业设计论-单片机储物柜
  12. Mysql中eft join、right join、inner join的区别
  13. 第6章:可维护性软件构建方法 6.1可维护性的度量和构造原则
  14. i3 2310M i7 9700T i7 9700K MacBookPro 16寸 CPU 跑分对比
  15. 6U VPX SRIO交换板
  16. linux用vi编辑后保存退出命令是什么,linux vi保存退出命令
  17. 两台计算机如何传输数据,详解两台电脑直连传输数据方法
  18. pandas数据清洗的一些操作
  19. hive插入多条数据sql_HIVE sql使用总结
  20. PHP全栈学习笔记7

热门文章

  1. java readfile函数_从fs.readFile获取数据
  2. EngineerCMS在linux下部署,并采用docker、onlyoffice实现文档协作
  3. 计算机提示msvcp140.dll丢失该如何修复?
  4. Java zip 解压缩
  5. Kotlin入门笔记(二) Kotlin 函数的简单介绍
  6. 1000G素材资源大礼包,里面包含设计软件、设计师字体包,PS教程笔刷等。
  7. flex/air 护眼健康卫士(源码/air安装包)
  8. 三战上岸复旦工研院考研回忆(无干货)
  9. 2.1 reverse
  10. 智慧工地~智慧工厂:安全生产可视化指挥调度系统~“安全第一、预防为主、综合治理”