IO 模式

对于 Linux 的 network IO:
一次 IO 访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区 copy 到应用程序的地址空间。所以说,当一个 read 操作发生时,它会经历两个阶段:

  1. 等待数据准备 (Waiting for the data to be ready)
  2. 将数据从内核 copy 到进程中 (Copying the data from the kernel to the process)

对应的就有5种 IO 模式

  • 阻塞 I/O(blocking IO)
  • 非阻塞 I/O(nonblocking IO)
  • I/O 多路复用(IO multiplexing)
  • 信号驱动 I/O(signal driven IO)
  • 异步 I/O(asynchronous IO)

分类:

IO 操作时阻塞:同步 IO(包含阻塞 IO、非阻塞 IO、IO 多路复用)
IO 操作时不阻塞:异步 IO

blocking IO

读取时如果没有数据就会发生阻塞,从内核空间 copy 到用户空间也会阻塞

nonblocking IO

读取时如果没有数据也不会发生阻塞,从内核空间 copy 到用户空间会阻塞
实现原理:不断地调用 recvfrom 检查是否有数据,如果没有数据内核会直接返回错误,直到有数据

IO multiplexing

和 blocking IO 相似,但是一个进程可以监视多个描述符,只要其中其中一个就绪就会返回,从内核空间 copy 到用户空间也会阻塞
实现原理:一次发送多个描述符,等待内核返回就绪确认之后才调用 recvfrom 接收数据

种类(事件驱动)

select

select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点。select的一 个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但 是这样也会造成效率的降低。

poll

poll 相比 select 没有最大的数量限制

epoll

相对于 select 和 poll 来说,epoll 更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的 copy 只需一次
gevent 和 epoll 都通过 libevent.so 实现,但协程关注更多的是任务的切换

selector

selectors 封装了 select 和 epoll,默认使用 epoll,如果无法使用 epoll 就换成 select <-点击查看

asynchronous IO

从内核空间 copy 到用户空间都不阻塞
实现原理:内核收到请求直接返回,等待数据 copy 到用户内存后,发送信号告诉用户进程

最新文章

  1. UICollectionView的使用小记录和一些说明
  2. MQTT V3.1----flow
  3. 如何在 ejs 模板中使用 helper function 外部函数进行特殊处理?
  4. redis 应用场景
  5. [磁盘管理与分区]——MBR破坏与修复
  6. js高程笔记1-3章
  7. window.clearInterval与window.setInterval的用法(
  8. Water Tree
  9. xadmin集成ueditor
  10. undefined reference to `sin&amp;#39;问题解决
  11. iOS 发布项目到CocoaPods其实没那么复杂&#128518;
  12. 【LSGDOJ1834 Tree】树链剖分
  13. python使用redis
  14. Spring Boot 打war包后自定义404页面不生效解决方法
  15. Java 调用 Shell 命令
  16. Game Engine Architecture 8
  17. tcp拥塞控制 tahoe reno new reno sack
  18. IO流巧记图
  19. ceil,floor,trunc,round,sign几个函数在SQL的使用方法
  20. KMP(http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&amp;problemid=2772)

热门文章

  1. 算法设计与分析 1.1 Joyvan的矩阵
  2. [ Python入门教程 ] Python文件基本操作_shutil模块
  3. 使用canal增量同步mysql数据库信息到ElasticSearch
  4. umi+dva+antd新建项目(亲测可用)
  5. 【分布式架构】--- 基于Redis组件的特性,实现一个分布式限流
  6. C# QRBarCode
  7. Docker实用debug调试技巧锦集
  8. MongoDB 高级教程
  9. Java内存模型以及happens-before规则
  10. Java技巧——比较两个日期相差的天数