Linux IO的五种模型 ongoing
服务器端编程经常需要构造高性能的IO模型,常见的IO模型:
- 阻塞I/O模型 (Blocking IO) ------------(同步)(阻塞)
- 非阻塞I/O模型 (Non-Blocking IO)---------(同步)(非阻塞)
- I/O多路复用模型 (IO Multiplexing)---------(异步)(阻塞)
- 异步I/O模型(Asynchronous IO) -----------(异步)(非阻塞)
阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式:阻塞是指IO操作需要彻底完成后才返回到用户空间;而非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。
同步和异步的概念描述的是用户线程与内核的交互方式:同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行;而异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。----????
1. (同步)阻塞I/O模型 (Blocking IO)
当read或write一个文件时,如果read/write不能立即返回,那么调用者就会进入睡眠状态,用户线程执行到read/write就不动了,开始等待内核空间,直到该文件变成可读/可写。这种模式就是阻塞模式。
以TCP连接为例,用户空间read/write是与TCP缓冲区交互的,而不是直接同网卡驱动交互。当接收缓冲区内无数据时,read操作就无法立即返回,因此就会阻塞住调用线程,直到对方发送数据过来并由网卡驱动拷贝到接收缓冲区;同理,当网络延时过大或接收方问题导致本端(发送方)发送缓冲区满时,调用write无法将数据写入到发送缓冲区(一个字节都没法写入),调用进程也会阻塞。
整个IO请求的过程中,用户线程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够。
2. (同步)非阻塞I/O模型 (Non-Blocking IO)
默认创建的socket都是阻塞的,非阻塞IO类型的socket需要调用设置函数,例如fcntl等,被设置为NONBLOCK。
用户线程可以在发起IO请求后可以立即返回。
用户需要不断地调用read,尝试读取socket中的数据,直到读取成功后,才继续处理接收的数据。整个IO请求的过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断地轮询、重复请求,消耗了大量的CPU的资源。用户需要不断地调用read,尝试读取socket中的数据,直到读取成功后,才继续处理接收的数据。很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性。
3. I/O多路复用模型 (IO Multiplexing)
有时也称为异步阻塞IO. 是经典的Reactor设计模式--?。Java中的Selector和Linux中的epoll都是这种模型。
1) 它的形成原因
如果一个I/O流进来,我们就开启一个线程处理这个I/O流。那么假设现在有一百万个I/O流进来,那我们就需要开启一百万个线程一一对应处理这些I/O流(这就是传统意义下的多线程并发处理)。一百万个进程的CPU占有率高,及其的不合理。所以人们提出了I/O多路复用这个模型,一个线程,通过记录I/O流的状态来同时管理多个I/O,可以提高服务器的吞吐能力。
2) 通过它的英文单词来理解一下I/O多路复用
I/O multiplexing 也就是我们所说的I/O多路复用,multi意味着多,而plex意味着丛(丛:聚集,许多事物凑在一起。),那么字面上来看I/O multiplexing 就是将多个I/O凑在一起。就像下面这张图的前半部分一样,中间的那条线就是我们的单个线程,它通过记录传入的每一个I/O流的状态来同时管理多个IO。
3)I/O多路复用的实现
IO多路复用模型是建立在内核提供的多路分离函数select基础之上的。
如下图所示,用户首先将需要进行IO操作的socket添加到select中,然后阻塞,等待select系统调用返回。当数据到达时,select函数返回。用户线程才发起read请求,读取数据并继续执行。---- select函数亦可等待固定时间后,即使没有检测到数据 也返回。 下面讲的select函数都是指的没有数据返回就无限等待。
从流程上来看,使用select函数进行IO请求和 阻塞模型没有太大的区别,甚至还多了添加监视socket,以及调用select函数的额外操作,效率更差。但是,使用select以后最大的优势是用户可以在一个线程内 同时 处理多个socket的IO请求。用户可以注册多个socket,然后不断地调用select读取被激活的socket,即可达到在同一个线程内同时处理多个IO请求的目的,。有任何一个socket口的消息来了,都可以让停在select处的用户线程被开启, 而在 阻塞模型中,必须通过多线程的方式才能达到这个目的。
在代码中:在while死循环中调用select,select监视的是一组你感兴趣的文件,有文件被激活后,可以继续往下执行select后面的语句了,先判断是哪一个文件被激活,然后马上读取该文件的数据,然后继续循环。
使用IO多路复用时,一般使用Reactor设计模式:------????
IO多路复用是最常使用的IO模型,但是其异步程度还不够“彻底”,因为它使用了会阻塞线程的select系统调用。因此IO多路复用只能称为异步阻塞IO,而非真正的异步IO。
1)select/poll---??
2)epoll---??
4.异步I/O模型(Asynchronous IO)
经典的Proactor设计模式,也称为异步非阻塞IO。----??
5.信号驱动I/O模型
Ref:
https://www.jianshu.com/p/6a6845464770https://blog.csdn.net/shuxiaogd/article/details/50366039
https://blog.csdn.net/baixiaoshi/article/details/48708347
Linux IO的五种模型 ongoing的更多相关文章
- IO的五种模型
为了区分IO的五种模型,下面先来看看同步与异步.阻塞与非阻塞的概念差别. 同步:所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.按照这个定义,其实绝大多数函数都是同步调用(例如 ...
- 2. 彤哥说netty系列之IO的五种模型
你好,我是彤哥,本篇是netty系列的第二篇. 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识. 简介 本文将介绍linux中的五种IO模型,同时也会介绍阻塞/非阻塞与同步/异步的区别. ...
- 【网络IO系列】IO的五种模型,BIO、NIO、AIO、IO多路复用、 信号驱动IO
前言 在上一篇文章中,我们了解了操作系统中内核程序和用户程序之间的区别和联系,还提到了内核空间和用户空间,当我们需要读取一条数据的时候,首先需要发请求告诉内核,我需要什么数据,等内核准备好数据之后 , ...
- IO 的五种模型是什么
目录 前言 用户空间和内核空间 IO 五种模型 阻塞型 IO 非阻塞 IO IO 多路复用 信号驱动 IO 异步 IO 总结 阻塞和非阻塞 同步与异步 前言 我们经常看到阻塞/非阻塞,同步/异步这两组 ...
- Linux 下的五种 IO 模型
概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的 ...
- Linux 中的五种 IO 模型
Linux 中的五种 IO 模型 在正式开始讲Linux IO模型前,比如:同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一 ...
- 浅谈Linux下的五种I/O模型 两篇别人的博客
http://blog.csdn.net/sinat_34990639/article/details/52778562 http://www.cnblogs.com/chy2055/p/5220 ...
- []转帖] 浅谈Linux下的五种I/O模型
浅谈Linux下的五种I/O模型 https://www.cnblogs.com/chy2055/p/5220793.html 一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是 ...
- 浅谈Linux下的五种I/O模型
一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是无法直接操作I/O设备的,其必须通过系统调用请求内核来协助完成I/O动作,而内核会为每个I/O设备维护一个buffer.如下图所 ...
随机推荐
- LibreOJ #6217. 扑克牌
二次联通门 : LibreOJ #6217. 扑克牌 /* LibreOJ #6217. 扑克牌 背包.... 回到家之后简直了...sb题想半天 */ #include <cstdio> ...
- python中如何给散点图上面的特定点做标记
今天想在散点图的某些特定的点外面画圆圈标记,从下面的文章找到一些灵感,只要在原来的散点图上面给指点添加相应的标志,设置其透明度就可以实现该想法. 顺便复习下散点图的用法. 大家平时为了直观地显示数据的 ...
- 【原创】go语言学习(五)函数详解1
目录 1.函数介绍 2.多返回值和可变参数 3.defer语句 4.内置函数介绍 1.函数介绍 1.1定义: 有输⼊入.有输出,⽤用来执⾏行行⼀一个指定任务的代码块. func functionnam ...
- (5)打造简单OS-进入保护模式
1.简介: 8086实模式 80286才出现保护模式,保护模式下的段寄存器存储的是段选择子,不在是8086实模式的段基址了! [扩展知识]:可以看了后面知识在回头看一下这段. [8086各个段寄存器和 ...
- 10月清北学堂培训 Day 3
今天是钟皓曦老师的讲授~ zhx:题很简单,就是恶心一些qwq~ T1 别人只删去一个字符都能AC,我双哈希+并查集只有40?我太菜了啊qwq 考虑到越短的字符串越难压缩,越长的字符串越好压缩,所以我 ...
- Python中一些高效的数据操作
列表统计 chars = ["a", "b", "a", "c", "a", "d&quo ...
- 2019-12-10:win7,win12提权练习
一.win7 1,上传webshell到服务器,访问 2,因为win7权限没设置好,导致任何命令都可以执行 直接提权成功,还可以通过msf工具利用exp进行提权,今天太晚了就先不做了 二.win201 ...
- EXCEL技巧-多级目录设置
现有如下图所示的数据,要求:以方法.厚度.品种进行分类汇总,并对数量.面积.金额求和. 在进行分类汇总前需要先对数据进行排序,操作如下图所示. 在排序对话框中,点击“添加条件” 两次,这样可以对三个字 ...
- 近似最近邻算法-annoy解析
转自https://www.cnblogs.com/futurehau/p/6524396.html Annoy是高维空间求近似最近邻的一个开源库. Annoy构建一棵二叉树,查询时间为O(logn) ...
- GDPR全文翻译(二)
第三节 数据保护影响评估以及事先咨询 第35条 数据保护影响评估 1.鉴于一种数据处理方式,尤其是使用新技术进行数据处理,统筹考虑处理过程的性质.范围.内容和目的,(不难得知)这很可能对自然人权利和自 ...