原先对于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模型比较:
相关推荐
IO模型1
Unix Domain Socket熟悉Linux下命令行工具深入理解进程,线程了解Java内存模型了解Java的并发包,如锁,读写锁,Barrier,Executer和Future了解Java 8的Lambda表达式和Streaming API理解TCP/IP协议族理解HTTP协议和...
在类unix系统中有五大I/O模型,依次为阻塞IO(BIO)、非阻塞IO(NIO)、IO多路复用(linux下有select、poll、epoll三种方案)、信号驱动IO、异步IO(前面四种都是同步IO),本文主要介绍常用的C的IO库,几乎都是...
2 增加wsa网络IO模型(Windows socket异步IO模型) 该模型支持WEB服务器 反向代理服务器和SSL安全连接 与Linux下的epoll具有同等的功能和效率 3 增加Windows和Linux平台下的多线程支持(Unix下尚未实现) 多线程...
2 增加wsa网络IO模型(Windows socket异步IO模型) 该模型支持WEB服务器 反向代理服务器和SSL安全连接 与Linux下的epoll具有同等的功能和效率 3 增加Windows和Linux平台下的多线程支持(Unix下尚未实现) 多线程...
socket java原始码Java套接字I ...非阻塞-套接字的一种属性,当检测到所请求的动作没有未知的延迟就无法完成时,套接字的调用将立即返回。 同步I / O操作-导致请求线程被阻塞直到该I / O操作完成的I
C ++学习规划 一。二月计划 C ++入门二刷完成 笔记记录完成 二。三月学习计划 有效的C ++完成 剑指优惠看完 计算机网络与操作系统基础知识积累与背诵 刷题100道 三。四月学习计划 更有效的C ++学习 TCP / IP编程 ...
++项目中使用,也可以与提供的Shell脚本和良好的旧Unix IO重定向一起使用。 CLI : 命令行程序的代码可以在cli文件夹中找到。 它们基于C ++库构建,并以便捷的方式公开了libDori的三个基本功能:基数,频繁项和采样...
Netty 是一款用于快速开发高性能的网络应用程序的 Java 框架。它封装了网络编程的复杂性, 使网络编程和 Web 技术的最新...它还定义了一种架构模型以及一套丰富的设计模式。 该资源就是开发Netty程序必须要依赖的jar包
一个进程池的服务器程序 下面做了非常简单的http服务器,该服务器只能接收Get请求。 流程大概如下: 1,父进程listen,创建pipe(下面所有父子进程之间的通信都用该pipe) 2,父进程预fork n个子进程 3,各个子...
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 ...
--(这三本书主要还是看看Linux下的IO模型,select 和epoll的区别,后面有的框架会涉及到这些内容,比如netty) Unix网络编程 Linux 系统编程手册 Java 基础和进阶 疯狂Java讲义 Java 核心基础卷1/2 Java编程思想 Java...
一种 unix-daemon-like java 代码的替代机制 DBCP Commons-DBCP 提供数据库连接池服务 DbUtils DbUtils 是一个 JDBC helper 类库,完成数据库任务的简单的资源清除代码. Digester Commons-Digester 是一个 XML-...
小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。 Bootcfg bootcfg 命令启动配置和故障恢复(对于大多数计算机,即 boot.ini 文件)。 含有下列参数的 bootcfg 命令仅在...
第一章:数据结构和算法 1.1 解压序列赋值给多个变量 1.2 解压可迭代对象赋值给多个变量 1.3 保留最后N个元素 1.4 查找最大或最小的N个元素 1.5 实现一个优先级队列 1.6 字典中的键映射多个值 1.7 字典排序 ...
功能/React式编程模型 解耦和任务隔离 简洁的DSL,可重复执行任务 务实,允许快速原型制作和迭代 隐藏复杂性 与错误共存(!) 先决条件 类似于Unix的操作系统(Linux,macOS等) Java 8或更高版本 Docker引擎1.10...
把鼠标定位到表/视图/存储过程名称之上,按F4,可以打开对象描述窗口,方便的查看表和视图的定义,存储过程的源代码, 非常容易对SQL语句的分析其执行计划:单击工具栏上的 按钮就可以看到Explain Plan的...
1.3 Linux 与 U N I X 的异同.................................................. 5 1 . 4 操作系统类型选择和内核版本的选择..................................... 5 1.4.1常见的不同公司发行的Linux异同...........