一个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. 领域驱动设计(DDD)部分核心概念的个人理解

    领域驱动设计(DDD)是一种基于模型驱动的软件设计方式.它以领域为核心,分析领域中的问题,通过建立一个领域模型来有效的解决领域中的核心的复杂问题.Eric Ivans为领域驱动设计提出了大量的最佳实践 ...

  2. Redis系列(四)-低成本高可用方案设计

    关于Redis高可用方案,看到较多的是keepalived.zookeeper方案. keepalived是主备模式,意味着总有一台浪费着.zookeeper工作量成本偏高. 本文主要介绍下使用官方s ...

  3. JavaScript常见原生DOM操作API总结

    [TOC] 最近面试的时候被这个问题给卡了,所以抽时间好好复习一下. 几种对象 Node Node是一个接口,中文叫节点,很多类型的DOM元素都是继承于它,都共享着相同的基本属性和方法.常见的Node ...

  4. php语言

    <?php//单行注释/*多行注释*///弱类型语言//var a=10;//php定义变量/*$a =10; //变量名前加$$b="hello";var_dump($a) ...

  5. .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库

    批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...

  6. sql复习第四次

    1.关系操作的特点是集合操作 2.关系模型的完整性规则包括实体完整性规则,参照完整性规则,用户定义的完整性规则 3.rou联接运算是由笛卡儿积和选择操作组合而成的 4.自然联接运算是由笛卡儿积,选择, ...

  7. ASP.NET MVC5 网站开发实践 - 概述

    前段时间一直在用MVC4写个网站开发的demo,由于刚开始学所有的代码都写在一个项目中,越写越混乱,到后来有些代码自己都理不清了.1月26日晚上在群里跟@怒放 他们讨论这个问题,结论是即使只是一个小d ...

  8. JAVA实现发送电子邮件

    相信大家对于网站也好,手机app也好,用户注册时,需要进行邮箱验证的功能特别好奇吧,本篇我将带领大家一起实现一下这个简单而又神奇的小功能,让我们的应用也可以加入这些神奇的元素.废话不多说,下面开始我们 ...

  9. Android之OptionsMenu与Notification的实现

    OptionsMenu是Android提供的一种菜单方式,我们知道当智能机刚兴起时,手机上都会有一个MENU(菜单键),当我们点击时,默认我们打开Android提供的默认菜单,本篇我么就一起来学一下, ...

  10. SpringMVC那点事

    一.SpringMVC返回json数据的三种方式 1.第一种方式是spring2时代的产物,也就是每个json视图controller配置一个Jsoniew. 如:<bean id=" ...