前言

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

用户空间和内核空间

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

这两个空间是独立的。

使用 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. JS简单介绍与简单的基本语法

    1.JavaScirpt是一门编程语言,是为前端服务的一门语言. (1)基础语法 (2)数据类型 (3)函数 (4)面向对象 2.还涉及到BOM和DOM (1)BOM(操作浏览器的一些功能) (2)D ...

  2. 为什么说线程太多,cpu切换线程会浪费很多时间?

    问题1: 假如有一个计算任务,计算1-100的和,每10个数相加,需要占用一个cpu时间片(1s).如果起一个线程(模拟没有线程切换),完成任务需要多长时间?如果起5个线程,完成任务需要消耗多久时间? ...

  3. centos 6 系统下同步本地时间

    1.date显示系统时间 [root@oldboy ~]# dateTue Mar 31 22:45:55 CST 2020   #CST是指是指某中标准时间 非东八区时间 更改时间的三种方法 1.c ...

  4. 解决adober reader已停止工作的问题

    公司电脑出现打开pdf阅读器后没到1分钟就闪退,应该是adobe做了什么正版审核策略,让安装了这个软件的电脑自动连接到adobe服务器验证导致. 解决方法:在C:\Windows\System32\d ...

  5. 如何利用FL Studio进行音乐合并

    FL Studio20是Fruity Loops Studio的简称,也叫做水果音乐制作软件.它是一款功能十分强大的音乐制作软件,将作曲.编曲.混音.录音.大碟等功能集合一体,外接MIDI即可成为一个 ...

  6. 虚拟机VM14.X安装Mac10.12启动出现问题的解决方法

    虚拟机安装Mac系统,会出现的问题太多,于是乎变记录下来,方便以后使用或者方便大家解决问题. 一:VM14.X安装Mac10.12虚拟机,启动出现下面无限重启问题 解决方法: 亲测有效 在OS X 1 ...

  7. mybatis 动态SQL 源码解析

    摘要 mybatis是个人最新喜欢的半自动ORM框架,它实现了SQL和业务逻辑的完美分割,今天我们来讨论一个问题,mybatis 是如何动态生成SQL SqlSessionManager sqlSes ...

  8. SpringBoot整合Elasticsearch7

    SpringBoot连接ElasticSearch有以下种方式, TransportClient,9300端口,在 7.x 中已经被弃用,据说在8.x 中将完全删除 restClient,9200端口 ...

  9. 【mq读书笔记】消息到达唤醒挂起线程检查新消息

    DefaultMessageStore#start 当新消息到达CommitLog是,ReputMessageService线程负责将消息转发给ConsumeQueue,IndexFile,如果Bro ...

  10. 关于transition动画效果中,滚动条会闪一下就消失的问题

    具体问题说明: 我在通过transition来改变width的长度,在transition变化过程中,底下的滚动条会闪烁一下. 问题原理:因为是里面容器没办法完全被装下,并且容器的宽度被限制住了. 解 ...