前言

我们经常看到阻塞/非阻塞,同步/异步这两组容易混淆的概念,那么该如何区分呢?

用户空间和内核空间

内核是操作系统的核心,可以访问底层硬件设备的所有权限。为了保护内核安全,就把操作系统的内存空间分为:内核空间和用户空间。

这两个空间是独立的。

使用 TCP 发送数据时,需要先将数据从用户空间拷贝到内核空间,再用内核操作将数据从内核空间发出。

当我们使用 TCP 读取数据时,先在内核空间准备好,再从内核空间拷贝到用户空间使用。

IO 五种模型

IO 五种模型分别是 :阻塞型 IO、非阻塞 IO、IO 多路复用、信号驱动 IO、异步 IO。

阻塞型 IO

用户进程发起请求时,阻塞到数据拷贝到用户空间才为止。

阻塞 IO 在这两个阶段都是阻塞的。(发送数据拷贝到内核空间是阻塞的,内核空间拷贝到用户空间,返回数据也是阻塞的)

非阻塞 IO

用户进程不断询问内核,数据准备好了吗?直到内核说准备好了,将数据从内核空间拷贝到用户空间。

非阻塞IO第一阶段不阻塞(用户进程询问内核,会立即得到回应,不阻塞 ),第二阶段会阻塞(要等着内核空间拷贝数据到用户空间并返回)。

IO 多路复用

多个 IO 操作共同使用一个 selector(选择器)去询问哪些 IO 需要的数据准备好了,selector 负责通知那些准备好的 IO,那些 IO 再自己去请求内核数据。

IO 多路复用,第一阶段会阻塞到 slector 上,第二阶段拷贝数据也会阻塞。

信号驱动 IO

用户进程发起读取请求前先注册一个信号给内核说明自己需要什么数据,这个注册立刻返回。等内核准备好了,主动通知用户进程,用户进程再读取数据,等待数据从内核空间拷贝到用户空间再返回。

信号驱动 IO,第一阶段不阻塞(注册信号会立刻返回),第二阶段阻塞(需要等待数据从内核空间拷贝到用户空间)。

异步 IO

用户进程读取数据请求后立马返回,当数据从内核空间拷贝到用户空间再通知用户直接使用数据。

异步IO,两个阶段都不阻塞。

总结

阻塞和非阻塞

阻塞:调用结果返回之前,当前线程会被挂起,直到调用结果返回。

非阻塞:不能立即得到结果之前,当前线程不会被挂起,可以做其他事。

阻塞调用后必须等着结果返回,非阻塞调用之后爱干什么干什么

同步与异步

同步:调用者会被阻塞,直到 IO 操作完成,调用的结果随着请求的结束返回。

异步:调用者不会被阻塞,调用的结果不随着请求的结束而返回,而是通过通知或者回调函数的形式返回。

也就是说,阻塞/非阻塞,更关心的是当前线程是不是被挂起。而同步/异步,更关心的是调用结果是不是随着请求结束而返回。

所以 IO 五种模型中,阻塞IO、非阻塞IO、多路复用IO、信号驱动IO都是同步IO,只有最后一个才是异步IO。

IO 的五种模型是什么的更多相关文章

  1. IO的五种模型

    为了区分IO的五种模型,下面先来看看同步与异步.阻塞与非阻塞的概念差别. 同步:所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.按照这个定义,其实绝大多数函数都是同步调用(例如 ...

  2. 2. 彤哥说netty系列之IO的五种模型

    你好,我是彤哥,本篇是netty系列的第二篇. 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识. 简介 本文将介绍linux中的五种IO模型,同时也会介绍阻塞/非阻塞与同步/异步的区别. ...

  3. 【网络IO系列】IO的五种模型,BIO、NIO、AIO、IO多路复用、 信号驱动IO

    前言 在上一篇文章中,我们了解了操作系统中内核程序和用户程序之间的区别和联系,还提到了内核空间和用户空间,当我们需要读取一条数据的时候,首先需要发请求告诉内核,我需要什么数据,等内核准备好数据之后 , ...

  4. Linux IO的五种模型 ongoing

    服务器端编程经常需要构造高性能的IO模型,常见的IO模型: 阻塞I/O模型  (Blocking IO) ------------(同步)(阻塞) 非阻塞I/O模型 (Non-Blocking IO) ...

  5. 图解I/O的五种模型

    1.1 五种I/O模型 1)阻塞I/O 2)非阻塞I/O 3)I/O复用 4)事件(信号)驱动I/O 5)异步I/O 1.2 为什么要发起系统调用? 因为进程想要获取磁盘中的数据,而能和磁盘打交道的只 ...

  6. socket编程五种模型

    客户端:创建套接字,连接服务器,然后不停的发送和接收数据. 比较容易想到的一种服务器模型就是采用一个主线程,负责监听客户端的连接请求,当接收到某个客户端的连接请求后,创建一个专门用于和该客户端通信的套 ...

  7. Linux-I/O五种模型

    一. 概念说明 在进行解释之前,首先要说明几个概念: 用户空间和内核空间 进程切换 进程的阻塞 文件描述符 缓存 I/O 同步(Sync)/异步(Async) 阻塞(Block)/非阻塞(Unbloc ...

  8. linux第7天 I/O的五种模型, select

    服务器端避免僵尸进程的方法: 1)通过忽略SIGCHLD信号,解决僵尸进程 signal(SIGCHLD, SIG_IGN) 2)通过wait方法,解决僵尸进程 signal(SIGCHLD, han ...

  9. 说说基于网络的五种IO模型

    # django不是一个异步框架 # tornado是异步的web框架 # 处理每秒大量的请求 # 个人理解的IO:就是应用层与内核驱动层的交互,这个过程无论从应用层到内核中,还是驱动层等待硬件层的数 ...

随机推荐

  1. Go 语言设计哲学之四:项目布局-你如何设计项目结构

    在多年的 Go 语言实践积累后逐渐形成了一种典型项目结构,如下图所示: 上面就是一个支持构建二进制可执行文件(在 src 下)的典型 Go 项目的结构. 1 src 目录: 存放项目要编译构建的可执行 ...

  2. async await 你真的用对了吗?

    大部分同学了解Promise,也知道async await可以实现同步化写法,但实际上对一些细节没有理解到位,就容易导致实际项目中遇到问题. 开始先抛结论,下文将针对主要问题点进行论述. 1.所有as ...

  3. kettle练习

    Kettle实现,把数据从CSV文件复制到Excel文件. 首先,创建一个转换,找到核心对象,找到输入里面的CVS文件输入图元,拖拽到工作区域,双击CVS文件输入. 可以修改步骤的名称,点击浏览,选择 ...

  4. CTF-lottery[git文件泄露利用+PHP弱类型]

    知识点:PHP弱类型 .git文件泄露 玩攻防世界 遇到一个题lottery  进去看看  分析玩法 我们发现 进入登陆用户都是初始值 金钱是20  彩票号码必须输入7位 然后看你输入的彩票号码有多少 ...

  5. Guitar Pro 7 中文界面的介绍

    用过Guitar Pro这款软件的小伙伴们都知道,Guitar Pro这款吉他软件因为是国外开发商研发的,所以软件最初都是英文版本,对于国内的的吉他爱好者来说,在软件使用上还是很不方便的.随着Guit ...

  6. tcp连接的三次握手

    为什么tcp连接需要三次握手才能建立连接 主要是为了初始化sequence number的初始值,通信的双方要互相通知双方的sequence number,这个要作为以后数据通信的序号,保证以后不会因 ...

  7. 【Updating】汇编语言学习记录02

    换码指令.字符的输出 前置知识: XLAT 指令:将BX指定的缓冲区中.AL指定的位移处的一个字节数据取出赋给AL,实际相当于(AL) = (DS:(BX+AL)).注意,不是单纯地赋予AL+BX,而 ...

  8. SQL优化思路与解决方案

    1.面对问题SQL的思考 这条查询SQL的语句到底有没有问题? 存在什么问题? 什么情况下存在问题? 怎么去优化? 2.SQL优化思路 where查询字段是否建立索引? 是否有建立索引但是查询时候没有 ...

  9. volatile禁止重排使用场景与单例模式的Double Check Lock

    普通单例模式Demo public class Demo{ private static Demo INSTANCE; private Demo(){} public static Demo getI ...

  10. java42

    1.Random类 随机生成某个整数 Random r = new Random(); System.out.println(r.nextInt()); 伪随机数:第一次打印为随机,再次运行,数字将保 ...