I/O模式

对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。

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

  1. 等待数据准备
  2. 将数据从内核拷贝到进程中

因为这两个阶段,Unix系统的IO分为五种模式:

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

阻塞 I/O

特点就是在IO执行的两个阶段,用户进程都被block了。

Linux中,默认情况下所有的socket都是blocking

非阻塞 I/O

特点是用户进程要不断得通过系统调用询问内核,文件描述的数据是否准备好了,这种方式称为轮询(polling)。

如果数据还没有准备好,用户进程不会被阻塞,而是立刻返回一个error。用户进程收到error可以再次进行read操作。

I/O 多路复用

特点是单个用户进程可以处理多个 I/O 事件,减少多进程切换带来的系统开销。

分成三种形式:

  • select
  • poll
  • epoll

select 或者 poll 可以监视多个文件描述符,期间会被阻塞,任何一个描述符的数据准备好后通知用户进程,进程调用 recvfrom 把数据从内核复制到进程中。两者的区别是:

  • select基于数组实现,可以监视的文件描述符数量有限制
  • poll基于链表实现,可以监视的文件描述符数量没有限制

epoll 仅适用于 Linux系统,也可以监视多个文件描述符,内核通过回调函数把数据准备好的文件描述符放入链表,用户进程通过 epoll_wait() 检测到达链表的描述符,不需要轮询所有事件的文件描述符。

epoll又分两种模式:

  • LT,水平触发。当 epoll_wait() 检测到描述符事件到达时,会通知用户进程,进程可以不立即处理该事件,下次调用 epoll_wait() 会再次通知进程。是默认模式,同时支持 Blocking 和 No-Blocking。
  • ET,边缘触发。通知之后进程必须立即处理事件,下次再调用 epoll_wait() 时不会再得到事件到达的通知。效率比LT高,只支持 No-Blocking。

异步I/O

用户进程执行 aio_read 系统调用会立即返回,可以继续执行,不会被阻塞,内核会在I/O操作完成后向应用进程发送信号。

信号驱动I/O

用户进程使用 sigaction 系统调用后立即返回,可以继续执行,不会被阻塞,内核会在数据准备好后向应用进程发送信号。

用户进程收到信号后调用 recvfrom 将数据从内核复制到应用进程中。

参考

http://cyc2018.gitee.io/cs-notes/#/notes/Socket?id=poll

初步了解Unix系统的I/O模式的更多相关文章

  1. 《Linux/Unix系统编程手册》读书笔记1

    <Linux/Unix系统编程手册>读书笔记 目录 最近这一个月在看<Linux/Unix系统编程手册>,在学习关于Linux的系统编程.之前学习Linux的时候就打算写关于L ...

  2. Unix及类Unix系统文本编辑器的介绍

    概述 Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性.VIM是纯粹的自由软件. Vim普遍被推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来自Em ...

  3. Vi (Unix及Linux系统下标准的编辑器)VIM (Unix及类Unix系统文本编辑器)

    Vi是Unix及Linux系统下标准的编辑器.学会它后,您将在Linux的世界里畅行无阻.基本上vi可以分为三种状态,分别是命令模式.插入模式,和底行模式. vi编辑器是所有Unix及Linux系统下 ...

  4. Supervisor – 用于 Unix 系统的进程监控工具

    Supervisor 是一个客户端/服务端模式的系统,使用户能够监视和控制 UNIX 操作系统的进程.Supervisor 为你提供一个地方来启动,停止和监视进程.进程可以单独或成组的形式控制.您还可 ...

  5. 《Linux/Unix系统编程手册》读书笔记9(文件属性)

    <Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有 ...

  6. 最基本的Unix系统操作命令

    基本知识点: OSX 采用的Unix文件系统,所有文件都挂在跟目录 / 下面,所以不在要有Windows 下的盘符概念. 你在桌面上看到的硬盘都挂在 /Volumes 下. 比如接上个叫做 USBHD ...

  7. 《Linux/Unix系统编程手册》读书笔记2

    <Linux/Unix系统编程手册>读书笔记 目录 第5章: 主要介绍了文件I/O更深入的一些内容. 原子操作,将一个系统调用所要完成的所有动作作为一个不可中断的操作,一次性执行:这样可以 ...

  8. UNIX 系统上的文本操作简介

    http://www.oschina.net/question/129540_53561 UNIX 的基本哲学之一就是创建只做一件事并将这一件事做好的程序(或进程).这一哲学要求认真考虑接口以及结合这 ...

  9. Unix系统操作指令汇总

    一.目录及文件操作命令 1.1 ls 语法: ls [-RadCxmlnogrtucpFbqisf1] [目录或文件--] 说明: ls 命令列出指定目录下的文件,缺省目录为当前目录 ./,缺省输出顺 ...

随机推荐

  1. System Verilog设计例化和连接

  2. Step By Step(Lua表达式和语句)

    Step By Step(Lua表达式和语句) 一.表达式:    1. 算术操作符:    Lua支持常规算术操作符有:二元的"+"."-"."*& ...

  3. Mobileye高级驾驶辅助系统(ADAS)

    Mobileye高级驾驶辅助系统(ADAS) Mobileye is the global leader in the development of vision technology for Adv ...

  4. 硬件delay评估表

    硬件delay评估表 硬件延时评估表用于快速评估一个模型在特定硬件环境和推理引擎上的推理速度. Bw 主要用于定义PaddleSlim支持的硬件延时评估表的格式. 概述 硬件延时评估表中存放着所有可能 ...

  5. cuDNN概述

    cuDNN概述 NVIDIACUDA深度神经网络库(cuDNN)是GPU加速的用于深度神经网络的原语库.cuDNN为标准例程提供了高度优化的实现,例如向前和向后卷积,池化,规范化和激活层. 全球的深度 ...

  6. Recommenders with TensorRT

    Recommenders with TensorRT 推荐系统用于向社交网络.媒体内容消费和电子商务平台的用户提供产品或媒体推荐.基于MLP的神经协作滤波器(NCF)推荐器使用一组完全连接或矩阵乘法层 ...

  7. oracle表ddl审计

    ============= 表ddl 审计============== 1.table信息 SQL> select * from test; ID CUST_CREDIT_LIMIT TIME ...

  8. 密码学系列之:feistel cipher

    密码学系列之:feistel cipher 简介 feistel cipher也叫做Luby–Rackoff分组密码,是用来构建分组加密算法的对称结构.它是由德籍密码学家Horst Feistel在I ...

  9. Samba 服务基础

    配置SMB共享,跨平台的共享,Windows与Linux的共享 • Samba 软件项目 用途:为客户机提供共享使用的文件夹 协议:SMB(TCP 139).CIFS(TCP 445) • 所需软件包 ...

  10. Nginx 配置文件介绍

    目录 1.1 常用命令 1.2 Nginx的配置文件结构 1.3 Nginx的全局配置 1.4 HTTP服务器配置 1.5 HttpGzip配置 1.6 负载均衡配置 1.7 server虚拟主机配置 ...