Linux的5种IO模型用法详解
目录
- 阻塞IO(Blocking I/O)
- 非阻塞IO(Non-Blocking I/O)
- 多路复用IO(I/O Multiplexing)
- 信号驱动式IO(Signal-Driven I/O)
- 异步IO(Asynchronous I/O)
阻塞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做到了完全异步。
以上就是Linux的5种IO模型用法详解的详细内容,更多关于Linux 5种IO模型的资料请关注我们其它相关文章!
相关推荐
-
解析Linux高性能网络IO和Reactor模型
目录 一.基本概念介绍 二.网络IO的读写过程 三.Linux五种网络IO模型 3.1.阻塞式I/O (blocking IO) 3.2.非阻塞式I/O (nonblocking IO) 3.3.多路复用I/O (IO multiplexing) 3.4.信号驱动式I/O (SIGIO) 3.5.异步IO (POSIX的aio_系列函数) 四.多路复用IO深入理解一波 4.1.select 4.2.epoll 4.3.epoll相比select的优点 4.4.关于epoll的IO模型是同步异步的
-
Linux 下的五种 IO 模型详细介绍
概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间.针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空
-
c++网络编程下Linux的epoll技术和Windows下的IOCP模型
目录 一.IOCP和Epoll之间的异同 1.异 2.同 二:Epoll理解与应用. 1.epoll是什么? 2.epoll与select对比优化 3.epoll是怎么优化select问题的 三.epoll的几个函数的介绍: 1.epoll_create函数 2.epoll_ctl函数 3.epoll_wait函数 4.条件触发和边缘触发 四.IOCP理解与应用 1.传统服务器的网络IO流程 2.使用IOCP的基本步骤 一.IOCP和Epoll之间的异同 1.异 1).IOCP是WINDOWS系
-
Linux的Socket IO模型趣解
前言 之前有看到用很幽默的方式讲解Windows的socket IO模型,借用这个故事,讲解下linux的socket IO模型: 老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系. 他们的信会被邮递员投递到他们小区门口的收发室里.这和Socket模型非常类似. 下面就以老陈接收信件为例讲解linux的 Socket I/O模型. 一.同步阻塞模型 老陈的女儿第一次去外地工作,送走她之后,老陈非常的挂心她安全到达没有: 于是老陈什么也不干,一直在小区门口收发室里等着她女儿的报平安的
-
MySQL两种临时表的用法详解
外部临时表 通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表.这种临时表只对当前用户可见,当前会话结束的时候,该临时表会自动关闭.这种临时表的命名与非临时表可以同名(同名后非临时表将对当前会话不可见,直到临时表被删除). 内部临时表 内部临时表是一种特殊轻量级的临时表,用来进行性能优化.这种临时表会被MySQL自动创建并用来存储某些操作的中间结果.这些操作可能包括在优化阶段或者执行阶段.这种内部表对用户来说是不可见的,但是通过EXPLAIN或者SHOW S
-
Linux中 sed 和 awk的用法详解
sed用法: sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法 sed命令行格式为: sed [-nefri] 'command' 输入文本 常用选项: -n∶使用安静(silent)模式.在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上.但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来. -e∶直接在指令列模式上进行 sed 的
-
Linux 命令head和tail常见用法详解
head和tail是一组想对应的命令,默认分别显示文件的开头和末尾10行记录. head head 命令可以将一段文本的开头一部分输出到标准输出. head命令既可以处理文本文件也可以处理标准输入. 基本应用 处理文本文件: head input.txt 当有多个文件输入时,head会顺序处理并输出: head input1.txt input2.txt 处理标准输入: ls | head 当没有其他参数时,head默认输出前10行,当然,head有各种参数. 可选参数 -n: 输出的行数 例如
-
Linux常用命令之grep命令用法详解
1.官方简介 grep是linux的常用命令,用于对文件和文本执行重复搜索任务的Unix工具,可以通过grep命令指定特定搜索条件来搜索文件及其内容以获取有用的信息. Usage: grep [OPTION]... PATTERN [FILE]... Search for PATTERN in each FILE or standard input. PATTERN is, by default, a basic regular expression (BRE). Example: grep -
-
Linux中Vi和Vim编辑器用法详解
目录 一.简介 二.安装VIM 美化vim 三.进入 vi\VIM 编辑器 四.工作模式 三种工作模式: 五.退出 vi 编辑器 六.移动光标 七.控制命令 八.编辑文件 撤销命令: 重复命令: 九.删除字符 十.修改文本 十一.粘贴复制 十二.高级命令 十三.文本查找 全文件搜索 部分特殊字符列表: 搜索某行中的单个字符 十四.set 命令 十五.运行命令 十六.文本替换 十七.几点提示 十八.最全VI\Vim快捷键键位图 一.简介 Linux下的文本编辑器有很多种,vi 是最常用的,也是各版
-
Linux文本查找命令find的用法详解
find 命令主要用于查找目录和文件,可以指定多种参数进行匹配. 用法:find +查找路径 +命令参数 [输出形式] 查找路径:告诉find在哪查找 命令参数:指定要查找的文件属性,属性包括多种,类型.名称.大小.修改时间等等 常用的参数: -name 按文件名进行查找 -user 按照文件的属主进行查找 -mtime 按照文件的更改时间来查找,-n 表示文件修改时间距今天n天以内,+n 表示文件修改时间距今天n天以前 -type 按照文件的类型查找,d 表示目录, f表示文件 ,
-
Linux回收站机制实现过程及用法详解
前言: linux系统下的rm是不可挽回的,命令设计本身没有问题,问题在于我们通常非常的自信,执行的时候喜欢rm -rf,这样的话就非常危险了,在执行的时候如果执行命令不对,甚至是执行的目录不对,那么将会造成很大的麻烦,轻则会导致加班加点,浪费人力物力,重则影响公司业务,更甚则有开除之虞,而windows下的回收站机制就是一个非常不错的策略,但linux并不自带,那我们就可以手动创建一个,直接执行就好: mkdir -p ~/.Trash cat >>~/.bashrc<<EOF
-
Linux中fuser命令用法详解
描述: fuser可以显示出当前哪个程序在使用磁盘上的某个文件.挂载点.甚至网络端口,并给出程序进程的详细信息. fuser显示使用指定文件或者文件系统的进程ID. 默认情况下每个文件名后面跟一个字母表示访问类型. 在zkfc的日志里面,有一个warn:PATH=$PATH:/sbin:/usr/sbin fuser -v -k -n tcp 8090 via ssh: bash: fuser: 未找到命令 原因是最小化安装centos的时候,没有fuser这个命令 yum install -y
-
C++ STL 四种智能指针的用法详解
0.前言 C++ 标准模板库 STL(Standard Template Library) 一共给我们提供了四种智能指针:auto_ptr.unique_ptr.shared_ptr 和 weak_ptr,其中 auto_ptr 是 C++98 提出的,C++11 已将其摒弃,并提出了 unique_ptr 替代 auto_ptr.虽然 auto_ptr 已被摒弃,但在实际项目中仍可使用,但建议使用更加安全的 unique_ptr,后文会详细叙述.shared_ptr 和 weak_ptr 则是
随机推荐
- 基于JavaScript实现跳转提示页面
- jquery scrollTop方法根据滚动像素显示隐藏顶部导航条
- Vuejs 用$emit与$on来进行兄弟组件之间的数据传输通信
- VS2015自带LocalDB数据库用法详解
- 使用ASP.NET创建线程实例教程
- 使用Javascript写的2048小游戏
- 实例分析nodejs模块xml2js解析xml过程中遇到的坑
- C#抽象类和接口的区别分析
- 对象标记具有无效的 'MSWC.MyInfo' ProgID
- C#数据结构与算法揭秘五 栈和队列
- MYSQL设置触发器权限问题的解决方法
- jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
- SQL Server使用row_number分页的实现方法
- JavaScript中的条件判断语句使用详解
- nodejs中的fiber(纤程)库详解
- IE即可轻松远程控制对方电脑
- C++类静态成员与类静态成员函数详解
- c#动态类型,及动态对象的创建,合并2个对象,map实例
- Android实现滚动刻度尺效果
- 深入理解Java编程线程池的实现原理
其他
- eclipse项目红色错误
- turtle添加背景音乐
- springcloud2020 nacos配置中心不生效
- python 编写一个抽奖函数
- elementUI is-dot 红点不显示 使用
- drop_duplicates()方法可以删除重复值
- 小程序中是否可以使用css的变量
- java 获取 永久代 占用
- mysql5.6 以下 json字符串 模糊查询
- vue动态给css赋值
- 编译 dotnet和aspnetcore 源代码
- 把单词用#作为连接符 python
- springBoot IOC获取类中 传入构造参数
- flutter 编辑弹框
- vue 点击返回顶部没反应
- javers中的概念
- python 重复字符串 index
- 微信小程序保存登录状态
- vue2 配置后台接口
- jsonObject 批量修改value值