一些概念:

虚拟空间:是进程所看到的所有地址组成的空间。虚拟空间某个进程对所有分配给它的所有物理地址的重新映射。

寻址返回与计算机的位数有关系。分为内核空间与用户空间。针对32位的Linux系统,最高的1G字节为内核空间。最低的3G字节为用户空间。

进程阻塞:这是进程自身的一种主动行为。当进程进入阻塞状态的时候,不占用CPU资源。

文件描述符fd:非负整数,是一个索引值。指向内核为每一个进程所维护的该进程的打开文件记录表。

缓存IO:大多数文件系统的默认IO都是缓存IO。过程是:数据先被拷贝到操作系统的内核缓冲区(页缓存 page cache)中,然后再拷贝到应用程序的地址空间。

举例:

当一个read操作发生时,会经历两个阶段:

1 等待数据准备(waiting for the data to be ready)

2 将数据从内核拷贝到进程中(copying the data from the kernel to the process)

LInux IO模式分为5种:

阻塞IO(blocking IO)

非阻塞IO(non-blocking IO)

IO多路复用(IO multiplexing)

信号驱动IO(signal driven IO) (不常用)

异步IO(asynchronous IO)

阻塞IO(blocking IO):

在Linux中,默认情况下,所有的socket都是blocking的。图示如下:

上面提到了两个阶段,再blocking IO里,两个阶段都被阻塞了

非阻塞IO(nonblocking IO)

图示如下:

nonblocking IO的特点是用户进程需要不断的主动询问kernel数据准备好了没有

IO多路复用(IO multiplexing)

也称为event driven IO,包括select,poll,epoll。单个进程可以同时处理多个网络连接的IO。

原理是select,poll,epoll会不断轮询所负责的socket,当socket有数据到达了,会通知用户进程

图示如下:

用户进程调用了select,整个进程会被block。同时kernel会监视所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候再调用read,将数据从kernel拷贝到用户进程

在这里,我们使用了select,recvfrom两个system call,相比较blocking IO的一个system call(recvfrom)效率更差,使用select的优势在于它可以同时处理多个connection,而不是对于单个连接处理的更快。

所以,当要处理的连接数不是很高的话,使用select/epoll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延迟更大。

在IO multiplexing model里,对于每一个socket,一般都设置成non-blocking的。大多数情况下,整个用户的process被select函数所阻塞

异步IO(asynchronous IO)

异步IO的流程如下:

用户进程发起read之后立即返回,去做其他的事情。

kernel收到read之后,不会对用户进程产生任何block。而是等待数据准备完成,将数据拷贝到用户内存,然后给用户进程发送一个signal,告诉read操作完成了

总结:

blocking和non-blocking的区别

调用blocking IO会一直block住对应的进程直到操作完成,而non-blocking IO在kernel还准备数据的情况下立即返回

syschronous IO和asynchronous IO的区别

判断同步IO,异步IO的关键点在于在真实的IO操作里(比如recvfrom),进程有没有被阻塞。

在non-blocking中,如果kernel的数据没有准备好,这时候固然不会block进程。但是当kernel中数据准备好的时候,recvfrom会将数据从kernel拷贝到用户内存里,这时候进程是被block的,所以non-blocking,blocking均是同步IO

而异步IO是当进程发起IO操作之后,立即返回,再也不理睬,知道收到kernel发送的IO完成的信号。在这个过程中,进程完全没有被block

同步异步的区分点在于:用户进程是怎样知道数据ok了的(自己主动check得知,还是接收到的signal得知);数据在kernel中准备完成之后,是谁负责拷贝数据到用户内存的(自己拷贝还是kernel负责拷贝的)

各个IO model的比较图:

本文从以下ref中整理而来:

ref: https://segmentfault.com/a/1190000003063859

转载于:https://www.cnblogs.com/geeklove01/p/8979760.html

Linux IO模式和select,poll,epoll解释相关推荐

  1. linux IO模式及select、epoll、select详解(附示例)

    1 概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保 ...

  2. (转载) Linux IO模式及 select、poll、epoll详解

    注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...

  3. Linux IO模式及 select、poll、epoll详解

    https://segmentfault.com/a/1190000003063859 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的. ...

  4. Linux IO模式及select、poll、epoll实现nio详解

    注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 转自:https://segmentfault.com/a/1190000003063859 同步IO ...

  5. IO多路复用及select poll epoll讲解

    https://blog.csdn.net/weixin_43367828/article/details/84676775 https://www.jianshu.com/p/6a684546477 ...

  6. IO多路复用:select/poll/epoll

    select int select (int maxfds,fd_set * readfds,fd_set * writefds,fd_set * errorfds,struct timeval* t ...

  7. epoll编程实例客户端_深入底层探析网络编程之多路复用器(select,poll,epoll)

    IO模型 只关注IO,不关注IO读写完成后的事情. 同步:程序(APP)自己进行读/写操作 异步:由Kernel完成读/写,程序跑起来感觉像没有访问IO,访问的是buffer 阻塞:BLOCKING, ...

  8. Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)

    一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 1 简单的启动线程语法 2 def run(na ...

  9. select poll epoll 高效IO 多路转接

    目录 五种常见IO模型 高效IO的概念 阻塞 vs 非阻塞 非阻塞IO fcntl函数 I/O多路转接之select 初识select select函数原型 select操作接口 tcp_server ...

最新文章

  1. rt-thread端口时钟使能_(2)RTThread启动过程分析
  2. linux python fcntl模块 程序加锁 简介
  3. 财经法规2013江苏模拟题
  4. 涨姿势,图文带你了解 8 大排序算法
  5. 8. String to Integer[M]字符串转整数
  6. 20 张图揭开内存管理的迷雾,瞬间豁然开朗
  7. matlab2012b安装教程32位,Matlab2012B Windows 安装详细教程
  8. EnableViewState
  9. Vue脚手架安装教程
  10. windows10安装NVIDIA显卡驱动+cuda10.0教程
  11. 工作中PUSH用到的统计命令
  12. 《手把手教你构建自己的 Linux 系统》学习笔记(9)
  13. index.php.bak 颓废_CVE-2018-12613-phpmyadmin4.8.1远程文件包含漏洞复现
  14. sql查询包含某个字符_MySQL DBA基本知识点梳理和查询优化
  15. 2019年9月计算机一级试题,2019年9月计算机一级Ms Office试题(4)
  16. Hadoop是干什么的?
  17. 公众号(服务号)模板消息(个人通知)开发方案
  18. 华南理工计算机考研真题资料和问题回答。
  19. 商业承兑汇票的相关概念
  20. 分享个“软件开发需求文档”

热门文章

  1. CSS基础之清除浮动
  2. Ionic系列——使用ng-cordova插件
  3. 手机端禁止iPhone字体放大
  4. 面试题 01.04. 回文排列
  5. 利用 caffe的 python接口测试训练好的 mnist 模型
  6. oir 用image j打开的插件_Windows 上使用 VSCode Remote 插件进行远程开发
  7. r roc曲线 语言_R语言系列6:生存分析中多重时间依赖性ROC曲线绘制 timeROC
  8. 圣诞限定快乐,送3本技术好书
  9. SAP License:把握好集成测试大关,ERP就成功了一大半
  10. SAP License:SAP中的凭证查询、科目余额表及分类账详解