zoukankan      html  css  js  c++  java
  • 浅谈IO概念与IO模型

    什么是IO

    众所周知,Linux系统继承了Unix系统的概念 - 一切皆文件,那么这里讲的文件到底是指是什么呢?这里通常指Linux系统中的VFS文件系统下的文件,VFS文件系统提供通用的接口对接各种类型的二进制流。
    如图所示:

    因此,不管socket、还是FIFO、管道、终端等,对于LInux来说、一切都是文件、一切都是流。
    在信息交换的过程中、我们都是对这些流进行数据的收发操作、简称为I/O操作(input and output)、往流中读出数据系统调用read、写入数据系统调用write。
    在计算机中有许许多多的流,因此在程序操作中,需要针对指定的流进行操作的时候,我们需要创建对应的文件描述符,即通常所说的fd(file descriptor),文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。
    因此对这个fd的操作、就是对这个文件(流)的操作,我们创建一个socket/读写一个文件,通过系统调用会返回一个文件描述符,那么接下来的操作就会转化为对这个描述符的操作,这就是IO操作。

    IO模型

    IO操作,指操作体(进程/线程/协程)与fd(文件、流)之间的通讯交互。因此IO模型是指该通讯交互的方式。主要有以下几种

    • 阻塞IO(同步)

    主要指操作体在系统完成指定流的数据读取拷贝前,持续处于阻塞状态。

    • 非阻塞IO(同步)

    主要指操作体在对应IO就绪之前不阻塞处于轮询状态,等待轮询返回就绪后,进入阻塞等待数据拷贝完成。

    • IO复用(同步)

    主要指可以通过select/poll/epoll发起系统调用,可以同时监听多个IO,只要其中一个IO就绪,系统就返回通知,并拷贝对应IO的数据,在此期间持续阻塞。

    • 信号驱动IO(同步IO)

    主要指操作体在发起系统调用后,不必处于阻塞状态,对应IO就绪后系统会通过信号量通知操作体可以发起操作。

    • 异步IO

    主要指操作体在发起系统调用后,无需阻塞等待,系统内核在IO就绪后完成数据拷贝,再调起操作体的对应函数(回调)。

  • 相关阅读:
    实现用户注册验证码
    自带的打印预览
    分页存储过程
    文章标题、内容、摘要的处理函数
    ASP常用函数收藏
    生活中的经典感人语句
    如何在某一数据库的所有表的所有列上搜索一个字符串?
    如何访问隐藏的列表 workflow history list
    Windows Server 2008下如果什么操作没能正常完成, 请尝试run as administrator
    Visual Studio Build Marcos
  • 原文地址:https://www.cnblogs.com/kirachen/p/12403760.html
Copyright © 2011-2022 走看看