一顿饭的事儿,搞懂了Linux5种IO模型
大家好,我是老三,人生有三大难题,事业、爱情,和
——这顿吃什么!
人在家中躺,肚子饿得响,又到了不得不吃的时候,这顿饭该怎么吃?吃什么呢?
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模型相关推荐
- linux5种IO模型以及同步异步,阻塞非阻塞
同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...
- 让机器搞懂100万种隐含语义 腾讯Peacock模型全揭秘
让机器搞懂100万种隐含语义 腾讯Peacock模型全揭秘 腾讯模型 36大数据 · 2015-02-28 17:21 Peacock通过并行计算对10亿x1亿级别的大规模矩阵进行分解,从海量样本数据 ...
- 彻底搞懂Java的网络IO
IO是Input/Output的缩写.Unix网络编程中有五种IO模型: blocking IO(阻塞IO) nonblocking IO(非阻塞IO) IO multiplexing(多路复用IO) ...
- 一文弄懂Linux下五种IO模型
Linux下主要的IO主要分为:阻塞IO(Blocking IO),非阻塞IO(Non-blocking IO),同步IO(Sync IO)和异步IO(Async IO). 同步:调用端会一直等待服务 ...
- 你应该知道的五种IO模型
点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 写在前面 linux操作系统包含了五种IO模型,各种上层编程语言或者网络编程框架的上层实现都是基于操作系统的这些IO实现来实 ...
- 通俗易懂的5种IO模型文章
本文讲述了五种IO模型包括:阻塞IO,非阻塞IO,IO多路复用,信号驱动IO,异步IO. 文章末尾有总结 在这里推荐一套高级JAVA面试题: 点击查看 说到IO模型,都会牵扯到同步.异步.阻塞.非阻塞 ...
- linux下的五种io模型,Linux下的五种IO模型
Java中提供的IO有关的API,在文件处理的时候,其实依赖操作系统层面的IO操作实现的(关于Java对IO的三种封装,可见我的另一篇博客) 开门见山,Linux下的如中IO模型:阻塞IO模型,非阻塞 ...
- java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之OS_Part_2整起~IO们那些事【包括五种IO模型:(BIO、NIO、IO多路复用、信号驱动、AIO);零拷贝、事件处理及并发等模型】
PART0.前情提要: 通常用户进程的一个完整的IO分为两个阶段(IO有内存IO.网络IO和磁盘IO三种,通常我们说的IO指的是后两者!):[操作系统和驱动程序运行在内核空间,应用程序运行在用户空间, ...
- 1.聊聊Netty那些事儿之从内核角度看IO模型
从今天开始我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架. 它的设计异常优雅简洁,扩展性高,稳定性强.拥有非常详细完整的用户文档. 同时内置了很多非常有用的模块 ...
最新文章
- php-fpm 参数及配置详解
- [GO] go使用etcd和watch方法进行实时的配置变更
- 【总结】在VirtualBox上面安装Mac的注意事项
- C语言文件读写(结构体文件)
- 五个温度带的分界线_女神建筑师在拿破仑故乡打造的海景别墅,超美!超有温度!【环球设计2225期】...
- c++语言 tcp例子,C++中TCP通信实现文件传输
- 大数据之-Hadoop3.x_Yarn_FIFO调度器---大数据之hadoop3.x工作笔记0144
- 【leetcode】First Missing Positive(hard) ☆
- 最齐全的地面贴图素材,速来收藏
- 神经网络训练的一些方法
- blast2go windows 下本地化
- 【数据库CS751】数据库的建表与插入
- sql是什么mysql是什么意思_sql是什么意思
- 中国云计算产业的发展趋势和当今现状
- 2019.10.26日常总结兼一码学成普及模拟4比赛选解
- 在信用证支付的情况下,空运单可否作成以银行为收货人?在此种情况下可否起到约束进口方付款的作用?...
- Linux中使用交叉编译、二进制分析工具链
- 【Day1】数组、704二分查找、27移除元素
- 什么是高防CDN?高防CDN的用处有哪些?
- 2020文献积累:计算机 [1] Reinforcement learning in Economics and Finance