linux和unix中的IO模型总结
高性能网络IO编程模型
一、I/O模型简介
在一个 linux 操作系统中,一般分为用户空间和内核空间。
用户空间一般就是我们进行应用程序编程的地方。
内核空间就是 linux 操作系统自己运行的一些系统,比如内存系统,文件系统,进程调度,硬件驱动程序等等,都是操作系统内核进行控制。
处于 2 个不同的空间,那应用程序怎么对内核进行一些操作呢?
应用程序运行在用户空间,是不具备直接操作系统功能的权限。应用程序要访问内核系统的一些功能,需要通过系统调用(System Call)来完成。
具体就是操作系统内核为应用程序提供了一些接口 API(封装的函数),供应用程序使用,来访问操作内核的一些功能。

Linux 中的 I/O 模型是什么?
在用户空间的应用程序与在内核空间的内核系统怎么进行数据交换,交换的方式有哪些?
在《unix网络编程》中总结了 5 种 I/O 模型。
二、5 种IO模型
在 《unix网络编程第1卷》中介绍了 5 种 IO 模型:
- 阻塞 I/O - Blocking I/O
- 非阻塞 I/O - Non-Blocking I/O
- I/O 复用(select,poll和epoll)- I/O Multiplexin
- 信号驱动 I/O - Signal Driven I/O
- 异步 I/O(aio_ 系列函数)- Asynchronous I/O
1.阻塞IO模型
应用程序进程发起 IO 系统调用,这里是 recvfrom 函数。这个进程一直阻塞在 recvfrom 调用,直到内核把数据准备好,然后从内核空间拷贝数据到用户空间缓冲区,最后返回数据。
这里进程阻塞的整段时间是指调用 recvfrom 开始到系统返回成功指示,应用进程开始处理数据。

(来自《unix网络编程第1卷》第6章)
2.非阻塞IO模型
把套接字接口设置成非阻塞方式,就是告诉内核,请求I/O操作没有数据时,不要使进程阻塞(进程睡眠),而是返回一个错误。
等到内核把数据准备好,被拷贝到应用程序缓冲区,程序返回成功。

(来自《unix网络编程第1卷》第6章)
3.IO多路复用模型
把多个接收的 socket FD 注册到 select(多路复用器)上,然后使用一个进程监听 select。只要有一个 socket 上准备好,就返回该 socket 数据。
多路复用函数有select,poll,epoll。

(来自《unix网络编程第1卷》第6章)
4.信号驱动IO模型
信号驱动就是内核在 FD(文件描述符)准备好时用信号 SIGIO 通知应用程序。
首先,套接字接口允许信号驱动I/O,通过系统调用 sigacton 安装一个信号处理。此系统调用立即返回,进程继续工作,它是非阻塞的。当
内核数据报准备好时,就为该进程生成一个 SIGIO 信号,给进程发信号。可以立即在信号处理程序中调用 recvfrom 程序读取数据报,

(来自《unix网络编程第1卷》第6章)
5.异步IO模型
异步IO是Posix.1的一个扩展,让内核来操作整个数据过程,在内核把数据准备完成后,从内核拷贝到应用进程缓冲区,然后通知应用进程。
接口函数一般以 aio_ 开头。

(来自《unix网络编程第1卷》第6章)
三、5种IO模型区别
从上面5种模型可以看出,各个模型都有 2 个阶段。
第一阶段:等待内核准备好数据。
第二阶段:将数据从内核拷贝到用户空间(应用进程缓冲区)
前面4种模型当数据从内核拷贝到应用进程缓冲区时,进程都会阻塞在 recvfrom 的调用。
最后第5种异步IO模型两阶段处理都不同于前面4种IO模型。

(来自《unix网络编程第1卷》第6章)
四、参考
- 《Unix网络编程第1卷》 作者: Richard Stevens,Bill Fenner,Andrew M. Rudoff
linux和unix中的IO模型总结的更多相关文章
- Linux设备驱动中的IO模型---阻塞和非阻塞IO【转】
在前面学习网络编程时,曾经学过I/O模型 Linux 系统应用编程——网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用. 回顾一下在Unix/Linux下共有五种I/O模型,分别是: ...
- Linux 下的五种 IO 模型
概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的 ...
- Java NIO学习系列六:Java中的IO模型
前文中我们总结了linux系统中的5中IO模型,并且着重介绍了其中的4种IO模型: 阻塞I/O(blocking IO) 非阻塞I/O(nonblocking IO) I/O多路复用(IO multi ...
- 深入理解JAVA I/O系列六:Linux中的IO模型
IO模型 linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大致描述了数据从外部磁盘向运行中程序的内存中移动的过程. 用户空间.内核空间 现在操作系统都是采用虚拟存储器, ...
- 深入理解JAVA I/O系列六:Linux中的IO模型(转载的文章非常值得学习)
From:http://www.cnblogs.com/dongguacai/p/5770287.html IO模型 linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大 ...
- 浅谈计算机中的IO模型
IO模型一共有5种: blocking IO #阻塞IO nonblocking IO #非阻塞IO IO myltiplexing #IO多路复用 signal driven IO #信号驱动IO ...
- IO调度 | Linux块设备中的IO路径及调度策略
当文件系统通过submit_bio提交IO之后,请求就进入了通用块层.通用块层会对IO进行一些预处理的动作,其目的是为了保证请求能够更加合理的发送到底层的磁盘设备,尽量保证性能最佳.这里面比较重要的就 ...
- [转载] Linux五种IO模型
转载:http://blog.csdn.net/jay900323/article/details/18141217 Linux五种IO模型性能分析 目录(?)[-] 概念理解 Lin ...
- (转载) Linux五种IO模型
转载:http://blog.csdn.net/jay900323/article/details/18141217 Linux五种IO模型及分析 目录(?)[-] 概念理解 Linux下 ...
- 从 Linux 操作系统谈谈 IO 模型(终)
Linux 为什么要区分内核空间与用户空间? Linux 操作系统的 IO 模型有哪几种?有啥区别? 常说的阻塞现象,到底是咋回事? 网络编程研发时,那块到底耗时最多,代码是否还有优化空间? 前几期的 ...
随机推荐
- [转帖]终于!SOFATracer 完成了它的链路可视化之旅
https://my.oschina.net/sofastack/blog/5283439 ▼ 背 景 有幸参与开源软件供应链点亮计划--暑期 2021 支持的开源项目,目前 SOFATracer 已 ...
- [转帖]GitHub 近两万 Star,无需编码,可一键生成前后端代码,这个开源项目JeecgBoot有点强
GitHub 近两万 Star,无需编码,可一键生成前后端代码,这个开源项目JeecgBoot有点强 https://www.cnblogs.com/05-hust/p/14515686.html 一 ...
- [转帖] 在Linux上查看活跃线程数与连接数
https://www.cnblogs.com/codelogs/p/17178675.html 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明. 简介# 现 ...
- MySQL数据库页存储结构学习与了解
MySQL数据库页存储结构学习与了解 背景 MySQL总是出现奇奇怪怪的问题. 想着自己能够学习与提高一下. 最近看了很多文档.关于MySQL数据库相关的. 想着总结和提炼一下, 希望能够给未来的工作 ...
- 国产CPU制造工艺与部分性能总结
国产CPU制造工艺与部分性能总结 背景 最近一段时间验证了很多国产CPU的性能. 感觉很多地方与之前的理解有一些偏差. 前几天总结了部分架构和指令集相关的差异 今天想着总结一下制造相关的部分. 希望能 ...
- [转帖]【JVM】类文件结构
Class文件的定义 一组以8字节为基础单位的二进制流, 各个数据项目严格按照顺序紧凑排列在class文件中, 中间没有任何分隔符,这使得class文件中存储的内容几乎是全部程序运行的程序. 注:Ja ...
- expect 的简单学习与使用
背景 最近工作中总有很多重复的事项. 比较繁琐,想着能够简单一点是一点的角度 准备采用expect来建华部分工作量. 其实还可以使用其他方式来处理. 但是感觉expect还是能够简单明了的. 所以暂时 ...
- Mysql 安装文件下载
今天上了mysql的官方网站想下载mysql数据库 https://www.mysql.com 注册之后发现 出口许可证的问题 这里fxxk 一下川建国的老婆和女儿 感觉比较抑郁 然后就去百度了下 发 ...
- 【解决一个小问题】proto文件中的enum,去掉长长的重复的enum名字
在proto中定义的enum,通常类型名字都会带上enum的前缀,很丑陋,如何去掉呢? enum DataSourceType{ NotUse = 0; MySQL = 1; ElasticSearc ...
- Vue基础系列文章05----babel安装与使用
1.安装babel-node包,运行: 1) npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/node 2 ...