输入输出系统一文中介绍了系统内核操作IO设备的机制。 我们了解到内核可以直接访问IO设备, 用户进程无法IO设备。

就是说IO操作需要分为两个过程, 内核从IO设备读取数据保存到内核空间, 将数据由内核空间拷贝到用户空间。

IO调用可以分为同步调用和异步调用。同步调用要求主线程采用轮询等机制主动检查IO状态; 异步调用下主线程发出IO调用并立即返回, 在IO完成后通过回调函数等通知机制通知主线程.

阻塞IO与非阻塞IO的区别在于等待内核从外部设备读取数据时主线程是否阻塞。

由此可见, 同步和异步调用关心的是消息通信机制,阻塞和非阻塞IO关心的是IO操作过程中主线程的状态。

Linux的IO模型中Non-Blocking, Multiplexing IO, Signal Driven IO通过同步调用实现了非阻塞调用.

Blocking IO

应用程序执行一次IO调用, 导致应用程序阻塞, 直到内核准备好数据报并完成拷贝后返回.

是最容易理解的一种IO模型.

Non-Blocking IO

主线程执行IO调用, 内核开始准备数据, 用户通过轮询检查数据是否就绪. 若未就绪则继续立即返回继续执行主线程, 若就绪则开始进行拷贝, 拷贝过程中用户线程被堵塞.

主线程在执行轮询后立即返回,说明这是非阻塞IO。但需要主线程主动轮询获得IO操作状态, 所以仍属于同步IO。

Multiplexing IO

select和epoll即是此IO模型的典型实现,一次IO操作中包含两次调用两次返回

多路IO复用可以实现对多个IO端口的监听, 内核一旦发现主线程指定的一个或者多个IO数据拷贝就绪, 它就通知主线程将数据拷贝到用户空间.

该模型中select或epoll等系统调用在内核态轮询IO状态。

Signal Driven IO (SIGIO)

信号驱动IO在等待数据阶段采用了不同的等待方式.

Asynchronous IO

Linux的IO模型的更多相关文章

  1. Socket-IO 系列(一)Linux 网络 IO 模型

    Socket-IO 系列(一)Linux 网络 IO 模型 一.基本概念 在正式开始讲 Linux IO 模型前,先介绍 5 个基本概念. 1.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器, ...

  2. LINUX五中IO模型

    阻塞IO模型 用户空间调用recvfrom命令 直到数据包到达且被复制到应用进程的缓冲区或发生错误时才返回,这个过程中 进程亦或线程一直处于等待阻塞状态. 2.非阻塞IO模型 用户空间调用内核指令re ...

  3. Linux网络IO模型

    同步和异步,阻塞和非阻塞 同步和异步 关注的是结果消息的通信机制 同步:同步的意思就是调用方需要主动等待结果的返回 异步:异步的意思就是不需要主动等待结果的返回,而是通过其他手段比如,状态通知,回调函 ...

  4. Unix/Linux 网络 IO 模型简介

    概述 Linux内核将所有外部设备都看做一个文件来操作.对该文件的读写操作会调用内核提供的系统命令, 返回一个fd(file descriptor)文件描述符.而对一个socket的读写也有相应的描述 ...

  5. Linux 服务器IO模型 epoll

    epoll模型 #include <unistd.h> #include <sys/types.h> /* basic system data types */ #includ ...

  6. 7层网络以及5种Linux IO模型以及相应IO基础

    一.七层网络模型 OSI是Open System Interconnection的缩写,意为开放式系统互联.国际标准化组织(ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,它是一个七层的. ...

  7. 从 Linux 操作系统谈谈 IO 模型(终)

    Linux 为什么要区分内核空间与用户空间? Linux 操作系统的 IO 模型有哪几种?有啥区别? 常说的阻塞现象,到底是咋回事? 网络编程研发时,那块到底耗时最多,代码是否还有优化空间? 前几期的 ...

  8. Linux 网络编程的5种IO模型:异步IO模型

    Linux 网络编程的5种IO模型:异步IO模型 资料已经整理好,但是还有未竟之业:复习多路复用epoll 阅读例程, 异步IO 函数实现 背景 上一讲< Linux 网络编程的5种IO模型:信 ...

  9. 从养孩子谈谈 IO 模型(一)

    同步/异步.阻塞/非阻塞 说的是一回事儿吗? 同步/异步.阻塞/非阻塞 你能通俗易懂的讲清楚吗? Java 中的 BIO.NIO.AIO 你了解吗? Socket 编程你还会吗? Linux 操作系统 ...

随机推荐

  1. AngularJS 杂项知识点

    1.要用ngChange要同时使用ngModel,下拉选择获取当前选中值. 2.打包代替动态加载(js文件) requirejs真正的价值在于模块化,不是动态加载,angularjs本身有模块化机制, ...

  2. [javascript]jsonp-function 代码段

    (function($1454395832823,arr_infoList /**/) { $1454395832823.push(' '); for(var i in arr_infoList) { ...

  3. r test

    rt <-read.table("C:/Users/Ju/Desktop/anova/anova.txt",head=TRUE) lm.sol <-lm(Y~X1+X2 ...

  4. Flask restful API如何解决跨站请求问题

    如果像下面这样只是在return的response添加header是不行的: response = make_response(jsonify(response=get_articles(ARTICL ...

  5. Hive Bug修复:ORC表中array数据类型长度超过1024报异常

    目前HVIE里查询如下语句报错: select * from dw.ticket_user_mtime limit 10; 错误如下: 17/07/06 16:45:38 [main]: DEBUG ...

  6. Python 学习第二章

    本章内容 数据类型 数据运算 表达式 if ...else 语句 表达式 for 循环 表达式 while 循环 一.数据类型 在内存中存储的数据可以有多种类型. 在 Python 有五个标准的数据类 ...

  7. netcore的Session使用小记

    之前说过,core需要什么功能就添加并使用什么中间件 照例,在Startup.cs的ConfigureServices方法中添加services.AddSession();再在Configure方法中 ...

  8. ASP.Net MVC OA项目笔记<一>

    1.1.1 新建空白解决方案CZBK.ItcastOA 1.2.1 添加类库 1.2.2 同上添加多个类库 生成的 class1.cs先不用删除,删了的后,后面可能没办法直接点引用 1.3.1 添加表 ...

  9. DS-博客作业03--栈和队列

    1.本周学习总结 第三章主要介绍栈和队列的基本概念,存储结构,基本运算算法设计和应用实例.从组成元素的逻辑关系来看,栈和队列都属于线性结构.栈和队列与线性表的不同之处就在于他们的相关运算具有一些特殊性 ...

  10. python常用代码片段

    目录 Python3常用 文件处理 json处理 log日志 argparse使用 INIparser Python3常用 文件处理 class BaseMethod: @staticmethod d ...