前言

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

用户空间和内核空间

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

这两个空间是独立的。

使用 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. 一次webpack小规模优化经历

    这标题一点营销号味道都没有,怎么会有人看啊!(笑) 没人看也无所谓的文章背景: 八月份入职了新公司,是个好几年的老项目了,公司产品是存在很久了,但我接触到的代码版本保守估计应该是有个三年到四年这样的历 ...

  2. Angular 之装饰器@Input

    Input 一个装饰器,用来把某个类字段标记为输入属性,并提供配置元数据. 该输入属性会绑定到模板中的某个 DOM 属性.当变更检测时,Angular 会自动使用这个 DOM 属性的值来更新此数据属性 ...

  3. HotSpot类模型之InstanceKlass

    上一篇 HotSpot源码分析之类模型 介绍了类模型的基础类Klass的重要属性及方法,这一篇介绍一下InstanceKlass及InstanceKlass的子类. 1.InstanceKlass类 ...

  4. [LeetCode题解]142. 环形链表 II | 快慢指针

    解题思路 本题是在141. 环形链表基础上的拓展,如果存在环,要找出环的入口. 如何判断是否存在环,我们知道通过快慢指针,如果相遇就表示有环.那么如何找到入口呢? 如下图所示的链表: 当 fast 与 ...

  5. webbug3.0菜鸟笔记1

    渗透学习笔记--基础篇--sql注入(字符型)http://bbs.51cto.com/viewthread.php?tid=1148930 渗透学习笔记--基础篇--sql注入(数字型)http:/ ...

  6. 图解HTTP简单笔记【上】

    第一章 了解WEB及网络基础(省略了TCP/IP的知识点) 1.1.使用HTTP协议访问web  当我们在主机的浏览器的地址输入URL之后 请求将回发送至目标服务器 目标服务器在接受到响应请求时将会响 ...

  7. php读取Excel文件数据

    首先先下载 PHPExcel 脚本之家下载地址:https://www.jb51.net/codes/194070.html 然后把文件丢到php脚本同级目录里面 在php文件里面写下以下代码即可 & ...

  8. overflow:scroll

    <div style="position: relative;"> <div class="container mycontent" styl ...

  9. 闭关苦修半年,最终靠着这份面试题,我成功拿到了阿里的offer!

    前言 我大概我是从去年12月份开始看书学习,到今年的6月份,一直学到看大家的面经基本上百分之90以上都会,我就在5月份开始投简历,边面试边补充基础知识等.也是有些辛苦.终于是在前不久拿到了阿里的off ...

  10. python3使用HTMLTestRunner生成测试报告

    自动化测试运行完了需要直观的了解测试结果,需要用到第三方的模块HTMLTestRunner. 一:下载 HTMLTestRunner 下载路径:https://pypi.python.org/pypi ...