`

IO系列文章之一:UNIX IO模型的学习与总结

 
阅读更多

原先对于IO模型的认识总是很模糊,前段时间系统的学习了一下,分享出来,希望对看到的人有帮助。

UNIX网络编程中,将IO模型划分为5种:

(1)阻塞IO (2)非阻塞IO (3)信号驱动IO (4)IO复用 (5)异步IO

1、IO操作的2个步骤

以上5种IO操作都分成了两个步骤:发起IO请求实际IO操作

(1)发起IO请求:IO请求一般需要请求特殊资源(如磁盘、RAM、文件),当资源被上一个使用者使用没有被释放时,IO请求就会被阻塞,直到能够使用这个资源。

(2)实际IO操作:真正进行数据接收。

2、IO分类

步骤1(发起IO请求):分为阻塞IO非阻塞IO,区别(看发起IO请求是否阻塞进程):

应用程序调用后,不能立即返回的称为阻塞IO:即资源不可用时,IO请求一直阻塞,直到反馈结果(有数据或超时)。

能立即返回的称为非阻塞IO:资源不可用时,IO请求离开返回,返回数据标识资源不可用。

步骤2(实际IO操作):分为同步IO异步IO,区别(看实际IO操作是否阻塞进程):

在将数据从内核拷贝到用户空间时,将数据拷贝到应用缓冲区期间是否阻塞。

也就是说,如果实际IO读写阻塞请求进程(应用阻塞在发送或接收数据的状态,直到数据成功传输或返回失败),那么就是同步IO。

如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你(应用发送或接收数据后立刻返回,数据写入OS缓存,由OS完成数据发送或接收,并返回成功或失败的信息给应用),那么就是异步IO。

 

综上所述,前4种属于同步IO,最后一种才是异步IO。虽然(2)(3)(4)种IO是非阻塞IO,但其实也只是同步非阻塞,不能算异步。

 

附:UNIX网络编程一书中的截图(来源于网络)

阻塞IO:
非阻塞IO:

 IO复用:

 信号驱动IO:

 异步IO:


5种IO模型比较:

 

 

 

  • 大小: 49.2 KB
  • 大小: 75.4 KB
  • 大小: 65.5 KB
  • 大小: 65 KB
  • 大小: 55.6 KB
  • 大小: 89.2 KB
分享到:
评论
1 楼 yuanliangding 2016-08-20  
简略了点。

相关推荐

    IO模型1

    IO模型1

    io:java io学习项目

    Unix Domain Socket熟悉Linux下命令行工具深入理解进程,线程了解Java内存模型了解Java的并发包,如锁,读写锁,Barrier,Executer和Future了解Java 8的Lambda表达式和Streaming API理解TCP/IP协议族理解HTTP协议和...

    特征:1、跨平台(Linux, Windows, MacOS, Solaris)2、高性能事件循环.rar

        在类unix系统中有五大I/O模型,依次为阻塞IO(BIO)、非阻塞IO(NIO)、IO多路复用(linux下有select、poll、epoll三种方案)、信号驱动IO、异步IO(前面四种都是同步IO),本文主要介绍常用的C的IO库,几乎都是...

    nginx v1.5.9 for windows

    2 增加wsa网络IO模型(Windows socket异步IO模型) 该模型支持WEB服务器 反向代理服务器和SSL安全连接 与Linux下的epoll具有同等的功能和效率 3 增加Windows和Linux平台下的多线程支持(Unix下尚未实现) 多线程...

    nginx v1.5.9 for windows 源程序

    2 增加wsa网络IO模型(Windows socket异步IO模型) 该模型支持WEB服务器 反向代理服务器和SSL安全连接 与Linux下的epoll具有同等的功能和效率 3 增加Windows和Linux平台下的多线程支持(Unix下尚未实现) 多线程...

    socketjava源码-demo-sockets-io-nio-nio2:“Java套接字I/O:阻塞,非阻塞和异步”文章和源代码

    socket java原始码Java套接字I ...非阻塞-套接字的一种属性,当检测到所请求的动作没有未知的延迟就无法完成时,套接字的调用将立即返回。 同步I / O操作-导致请求线程被阻塞直到该I / O操作完成的I

    C-plus-plus-Series:学习C ++的旅程

    C ++学习规划 一。二月计划 C ++入门二刷完成 笔记记录完成 二。三月学习计划 有效的C ++完成 剑指优惠看完 计算机网络与操作系统基础知识积累与背诵 刷题100道 三。四月学习计划 更有效的C ++学习 TCP / IP编程 ...

    KMV的MATLAB的代码-libDori:概率数据结构

    ++项目中使用,也可以与提供的Shell脚本和良好的旧Unix IO重定向一起使用。 CLI : 命令行程序的代码可以在cli文件夹中找到。 它们基于C ++库构建,并以便捷的方式公开了libDori的三个基本功能:基数,频繁项和采样...

    netty-4.1.33.Final

    Netty 是一款用于快速开发高性能的网络应用程序的 Java 框架。它封装了网络编程的复杂性, 使网络编程和 Web 技术的最新...它还定义了一种架构模型以及一套丰富的设计模式。 该资源就是开发Netty程序必须要依赖的jar包

    一个进程池的服务器程序

    一个进程池的服务器程序 下面做了非常简单的http服务器,该服务器只能接收Get请求。 流程大概如下: 1,父进程listen,创建pipe(下面所有父子进程之间的通信都用该pipe) 2,父进程预fork n个子进程 3,各个子...

    linux网络编程-宋敬彬-part1

    9.3.4 信号驱动IO模型 258 9.3.5 异步IO模型 258 9.4 select()函数和pselect()函数 259 9.4.1 select()函数 259 9.4.2 pselect()函数 261 9.5 poll()函数和ppoll()函数 262 9.5.1 poll()函数 263 ...

    java多线程tcpsocketserver源码-Java-Book:Java学习资料整理

    --(这三本书主要还是看看Linux下的IO模型,select 和epoll的区别,后面有的框架会涉及到这些内容,比如netty) Unix网络编程 Linux 系统编程手册 Java 基础和进阶 疯狂Java讲义 Java 核心基础卷1/2 Java编程思想 Java...

    apache-commons源码及jar文件

    一种 unix-daemon-like java 代码的替代机制 DBCP Commons-DBCP 提供数据库连接池服务 DbUtils DbUtils 是一个 JDBC helper 类库,完成数据库任务的简单的资源清除代码. Digester Commons-Digester 是一个 XML-...

    网管教程 从入门到精通软件篇.txt

    小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。  Bootcfg  bootcfg 命令启动配置和故障恢复(对于大多数计算机,即 boot.ini 文件)。  含有下列参数的 bootcfg 命令仅在...

    python cookbook(第3版)

    第一章:数据结构和算法 1.1 解压序列赋值给多个变量 1.2 解压可迭代对象赋值给多个变量 1.3 保留最后N个元素 1.4 查找最大或最小的N个元素 1.5 实现一个优先级队列 1.6 字典中的键映射多个值 1.7 字典排序 ...

    gccbosc18-training:GCCBOSC 2018的Nextflow培训文档

    功能/React式编程模型 解耦和任务隔离 简洁的DSL,可重复执行任务 务实,允许快速原型制作和迭代 隐藏复杂性 与错误共存(!) 先决条件 类似于Unix的操作系统(Linux,macOS等) Java 8或更高版本 Docker引擎1.10...

    Toad 使用快速入门

     把鼠标定位到表/视图/存储过程名称之上,按F4,可以打开对象描述窗口,方便的查看表和视图的定义,存储过程的源代码,  非常容易对SQL语句的分析其执行计划:单击工具栏上的 按钮就可以看到Explain Plan的...

    linux网路编程 中文 23M 版

    1.3 Linux 与 U N I X 的异同.................................................. 5 1 . 4 操作系统类型选择和内核版本的选择..................................... 5 1.4.1常见的不同公司发行的Linux异同...........

Global site tag (gtag.js) - Google Analytics