一个IO操作涉及两个系统对象:

  • 调用这个IO的用户Process/Thread
  • 系统内核 - System Kernel

一个具体的Read操作包括两个阶段:

  • 内核等待数据准备就绪:Waiting for the data to be ready
  • 从内核向用户进程/线程拷贝数据:Copying the data from the Kernel to the Process/Thread

只有在同步的情况下才会有“阻塞”和“非阻塞”之说,异步情况,必须是非阻塞的!

“同步 - 异步”指访问数据的一种协作方式,同步需要主动读写数据,在读写数据的过程中还是会阻塞;异步只需要I/O操作完成的通知,并不主动读写数据,由内核完成数据的读写。“阻塞 - 非阻塞”指进程/线程要访问的数据是否就绪,进程/线程是否需要等待。同步和异步着重点在于多个任务的执行过程中,一个任务的执行是否会导致整个流程的暂时等待,阻塞和非阻塞着重点在于发出一个请求操作时,如果进行操作的条件不满足是否会返会一个标志信息告知条件不满足。

同步/异步仅关注消息通知的方式,并不关心消息如何处理,消息处理过程中应用程序(线程)的状态用阻塞/非阻塞来描述,是函数/方法的实现方式。

参考:socket阻塞与非阻塞、同步与异步概念详解 - 1socket阻塞与非阻塞、同步与异步概念详解 - 2

同步 vs 异步

消息的通知机制,针对Client端(和Server端的交互),进程/线程触发IO操作后:

  • 同步:进程/线程等待IO操作完成(阻塞)或轮询查看IO操作是否完成(非阻塞);
  • 异步:直接返回,进程/线程做自己的事情,IO操作交给内核处理、完成后内核通知进程/线程;

其中,异步中处理的执行部通过三种途径返回结果给调用者:

  • 状态:需要调用者定时检查,效率低;
  • 通知:效率高;
  • 回调函数:类似通知;

同步 Synchronous

A Synchronous-I/O operation causes the requesting process to be blocked until that I/O operation completes.

 串行,无条件等待,具体见下前4种I/O。

异步 Asynchronous

An Asynchronous-I/O operation does not cause the requesting process to be blocked.

 并发,无需等待、无需轮询,具体见下异步I/O。

阻塞 vs 非阻塞

应用程序在等待消息时的状态,针对Server端,Server端是否阻塞与Client端无关,至于Client端在等待的前提下啥也不做还是边做其他事边等待,由Client端自己决定。关于阻塞/非阻塞,在网络编程中通常应用在是不是需要等待数据就绪。

阻塞 Blocking

 挂起等待,具体见下阻塞I/O。

非阻塞 Non-Blocking

 轮询检查等待,具体见下非阻塞I/O。

参考:怎样理解阻塞非阻塞与同步异步的区别? - 知乎

I/O模型

阻塞I/O(Blocking I/O)

进程阻塞等待,进程挂起睡眠直到数据拷贝完成。

简单易实现,不适于同时处理大量套接字、扩展性差。改进:

  • 多进程/线程;
  • 线程池或连接池;

非阻塞I/O(Non-Blocking I/O)

进程非阻塞等待,数据准备阶段进程不睡眠而是轮询等待(导致CPU占用率高)、数据拷贝阶段进程阻塞。

便于处理多套接字的通信,但实现复杂、需仔细检查返回代码并对收到的错误信息进行处理。

I/O多路复用(I/O Multiplexing) Reactor模式

对一个IO端口,两次调用、两次返回。

数据准备阶段进程阻塞等待于select()/epoll()、数据拷贝阶段进程阻塞,其中select()可以同时阻塞多个I/O端口的操作,直到某个端口有数据可读/写时,才真正调用I/O操作函数。 实现同时对多个IO端口进行监听,适于处理大量套接字的连接。

I/O多路复用经典模式(2种):

  • 基于同步I/O的Reactor
  • 基于异步I/O的Proactor

参考:Reactor和Proactor

信号驱动I/O(Signal Driven I/O)

两次调用,两次返回。

数据准备阶段进程继续执行、数据拷贝阶段进程阻塞。 需要建立信号处理程序。

异步I/O(Asynchronous I/O) Proactor模式

 无阻塞,无需等待、无需轮询、无需多线程。

异步过程调用,调用者不能立刻得到结果,实际处理这个调用的部件在完成处理后,通过状态、通知或回调来通知调用者。异步需操作系统的底层支持。

:信号驱动模型由内核通知用户可以开始一个IO操作(数据在内核缓冲区中),异步IO由内核通知IO操作已经完成(数据已在用户空间中)。

比较

同步IO - 异步IO:数据访问时的消息通知机制,数据访问/拷贝时(第二阶段)进程是否等待,主动等待还是被动通知等待消息的触发! 同步IO和异步IO的关键区别反映在数据拷贝阶段是由用户线程完成还是内核完成。

阻塞IO - 非阻塞IO:等待数据就绪时(第一阶段)应用程序的调用是否立即返回!

推荐书籍:

  • Richard Stevens -《UNIX网络编程 - 卷1》:第六章

参考:

谈I/O模型的更多相关文章

  1. 老李谈JVM内存模型

    老李谈JVM内存模型   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨 ...

  2. 【Linux】浅谈I/O模型

    关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是无法直接操作I/O设备的,其必须通过系统调用请求内核来协助完成I/O动作,而内核会为每个I/O设备维护一个buffer. 如下图所示: ...

  3. 浅谈Java内存模型

    Java内存模型虽说是一个老生常谈的问题 ,也是大厂面试中绕不过的,甚至初级面试也会问到.但是真正要理解起来,还是相当困难,主要这个东西看不见,摸不着.网上已经有大量的博客,但是人家的终究是人家的,自 ...

  4. 浅谈CSS盒子模型

    [摘要]盒子模型是CSS中的一个重要概念,虽然CSS中没有盒子这个单独的属性对象,但它却是CSS中无处不在的一个重要组成部分.掌握盒子模型的原理和使用方法可以极大地丰富HTML元素的表现效果,同时对于 ...

  5. 浅谈css盒模型

    在我们网页上的每一个元素,一个按钮,一段文本,一张图片等等,浏览器都将它们当做一个“盒子”看待,并把这样的盒子称为盒模型(box model).使用Chrome的右键>审查元素对某个网页上的元素 ...

  6. 浅谈隐语义模型和非负矩阵分解NMF

    本文从基础介绍隐语义模型和NMF. 隐语义模型 ”隐语义模型“常常在推荐系统和文本分类中遇到,最初来源于IR领域的LSA(Latent Semantic Analysis),举两个case加快理解. ...

  7. Java NIO1:浅谈I/O模型

    一.什么是同步?什么是异步? 同步和异步的概念出来已经很久了,网上有关同步和异步的说法也有很多.以下是我个人的理解: 同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或 ...

  8. [JS学习笔记]浅谈Javascript事件模型

    DOM0级事件模型 element.on[type] = function(){} 兼容性:全部支持   lay1 lay2 lay3 e.target:直接触发事件的元素[IE8及以下不支持tage ...

  9. 浅谈I/O模型

    在学习线程,NIO等知识时都需要知道一些基础知识. 一.什么是同步或异步 同步:个人通俗理解多个人排队打饭一个窗口,只有前面一个人打完了,后面的人才能打.如果前面人因为什么原因一直站在那里不走,后面的 ...

随机推荐

  1. HTML5- Canvas入门(三)

    前两章我们掌握了线段.矩形和多边形的绘制方法,今天我们主要是学习如何绘制圆弧和贝塞尔曲线. 圆弧的绘制 圆弧可以理解为一个圆上的某部分线段,在canvas中,绘制一条圆弧的语法如下: ctx.arc( ...

  2. DDD实践问题之 - 关于论坛的帖子回复统计信息的更新的思考

    之前,在用ENode开发forum案例时,遇到了关于如何实现论坛帖子的回复的统计信息如何更新的问题.后来找到了自己认为比较合理的解决方案,分享给大家.也希望能和大家交流,擦出更多的火花. 论坛核心领域 ...

  3. Lesson 11 One good turn deserves another

    Text I was having dinner at a restaurant when Tony Steele came in. Tony worked in a layer's office y ...

  4. 利用gulp搭建本地服务器,并能模拟ajax

    工作中可能会用到的小工具,在此记录一下.可以实现的功能有: 本地http服务器 页面实时刷新 可以模拟ajax请求 第一步,新建package.json文件.用到了gulp.gulp-webserve ...

  5. 《精通正则表达式》笔记 --- “验证”Email格式

    写一个正则表达式的三个步骤: 理解需求并找出你需要验证的数据的特征: 写一个还可以用的正则表达式: 看看能不能达到你的目的,同时想想会不会匹配到一些不想要的数据: [可选]性能优化 我觉得写一个正则表 ...

  6. TroubleShooting笔记--快照进程sp_replupdateschema和索引重建发生冲突

    今天早上服务器出现大面积的阻塞,上去排查blocking,最后大概确定的问题是: rebuild index job(243) --->blocked--->sp_replupdatesc ...

  7. Atitit常见的标准化组织与规范数量jcp ecma iso

    Atitit常见的标准化组织与规范数量jcp ecma iso 1. 常见的标准化组织1 1.1. 重要的基金会apache1 1.2. 美国国家标准学会(American NationalStand ...

  8. JS函数 -- 功能,语法,返回值,匿名函数,自调用匿名函数,全局变量与局部变量,arguments的使用

    “JavaScript设计得最出色的就是它的函数的实现.” -- <JavaScript语言精粹> 函数包含一组语句,它们是JS的基础模块单元,用于指定对象的行为.一般来说,所谓编程,就是 ...

  9. 基本SQL语句

    说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1 ...

  10. distribution 中一直在运行 waitfor delay @strdelaytime 语句

    Replication 自动创建来一个 Job:Replication monitoring refresher for distribution,这个Agent执行一个sp: dbo.sp_repl ...