高性能网络IO编程模型

一、I/O模型简介

在一个 linux 操作系统中,一般分为用户空间和内核空间。

用户空间一般就是我们进行应用程序编程的地方。

内核空间就是 linux 操作系统自己运行的一些系统,比如内存系统,文件系统,进程调度,硬件驱动程序等等,都是操作系统内核进行控制。

处于 2 个不同的空间,那应用程序怎么对内核进行一些操作呢?

应用程序运行在用户空间,是不具备直接操作系统功能的权限。应用程序要访问内核系统的一些功能,需要通过系统调用(System Call)来完成。

具体就是操作系统内核为应用程序提供了一些接口 API(封装的函数),供应用程序使用,来访问操作内核的一些功能。

Linux 中的 I/O 模型是什么?

在用户空间的应用程序与在内核空间的内核系统怎么进行数据交换,交换的方式有哪些?

在《unix网络编程》中总结了 5 种 I/O 模型。

二、5 种IO模型

在 《unix网络编程第1卷》中介绍了 5 种 IO 模型:

  • 阻塞 I/O - Blocking I/O
  • 非阻塞 I/O - Non-Blocking I/O
  • I/O 复用(select,poll和epoll)- I/O Multiplexin
  • 信号驱动 I/O - Signal Driven I/O
  • 异步 I/O(aio_ 系列函数)- Asynchronous I/O

1.阻塞IO模型

应用程序进程发起 IO 系统调用,这里是 recvfrom 函数。这个进程一直阻塞在 recvfrom 调用,直到内核把数据准备好,然后从内核空间拷贝数据到用户空间缓冲区,最后返回数据。

这里进程阻塞的整段时间是指调用 recvfrom 开始到系统返回成功指示,应用进程开始处理数据。

​ (来自《unix网络编程第1卷》第6章)

2.非阻塞IO模型

把套接字接口设置成非阻塞方式,就是告诉内核,请求I/O操作没有数据时,不要使进程阻塞(进程睡眠),而是返回一个错误。

等到内核把数据准备好,被拷贝到应用程序缓冲区,程序返回成功。

​ (来自《unix网络编程第1卷》第6章)

3.IO多路复用模型

把多个接收的 socket FD 注册到 select(多路复用器)上,然后使用一个进程监听 select。只要有一个 socket 上准备好,就返回该 socket 数据。

多路复用函数有select,poll,epoll。

​ (来自《unix网络编程第1卷》第6章)

4.信号驱动IO模型

信号驱动就是内核在 FD(文件描述符)准备好时用信号 SIGIO 通知应用程序。

首先,套接字接口允许信号驱动I/O,通过系统调用 sigacton 安装一个信号处理。此系统调用立即返回,进程继续工作,它是非阻塞的。当

内核数据报准备好时,就为该进程生成一个 SIGIO 信号,给进程发信号。可以立即在信号处理程序中调用 recvfrom 程序读取数据报,

​ (来自《unix网络编程第1卷》第6章)

5.异步IO模型

异步IO是Posix.1的一个扩展,让内核来操作整个数据过程,在内核把数据准备完成后,从内核拷贝到应用进程缓冲区,然后通知应用进程。

接口函数一般以 aio_ 开头。

​ (来自《unix网络编程第1卷》第6章)

三、5种IO模型区别

从上面5种模型可以看出,各个模型都有 2 个阶段。

第一阶段:等待内核准备好数据。

第二阶段:将数据从内核拷贝到用户空间(应用进程缓冲区)

前面4种模型当数据从内核拷贝到应用进程缓冲区时,进程都会阻塞在 recvfrom 的调用。

最后第5种异步IO模型两阶段处理都不同于前面4种IO模型。

​ (来自《unix网络编程第1卷》第6章)

四、参考

linux和unix中的IO模型总结的更多相关文章

  1. Linux设备驱动中的IO模型---阻塞和非阻塞IO【转】

    在前面学习网络编程时,曾经学过I/O模型 Linux 系统应用编程——网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用. 回顾一下在Unix/Linux下共有五种I/O模型,分别是: ...

  2. Linux 下的五种 IO 模型

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

  3. Java NIO学习系列六:Java中的IO模型

    前文中我们总结了linux系统中的5中IO模型,并且着重介绍了其中的4种IO模型: 阻塞I/O(blocking IO) 非阻塞I/O(nonblocking IO) I/O多路复用(IO multi ...

  4. 深入理解JAVA I/O系列六:Linux中的IO模型

    IO模型 linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大致描述了数据从外部磁盘向运行中程序的内存中移动的过程. 用户空间.内核空间 现在操作系统都是采用虚拟存储器, ...

  5. 深入理解JAVA I/O系列六:Linux中的IO模型(转载的文章非常值得学习)

    From:http://www.cnblogs.com/dongguacai/p/5770287.html IO模型 linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大 ...

  6. 浅谈计算机中的IO模型

    IO模型一共有5种: blocking IO #阻塞IO nonblocking IO #非阻塞IO IO myltiplexing #IO多路复用 signal driven IO #信号驱动IO ...

  7. IO调度 | Linux块设备中的IO路径及调度策略

    当文件系统通过submit_bio提交IO之后,请求就进入了通用块层.通用块层会对IO进行一些预处理的动作,其目的是为了保证请求能够更加合理的发送到底层的磁盘设备,尽量保证性能最佳.这里面比较重要的就 ...

  8. [转载] Linux五种IO模型

      转载:http://blog.csdn.net/jay900323/article/details/18141217     Linux五种IO模型性能分析   目录(?)[-] 概念理解 Lin ...

  9. (转载) Linux五种IO模型

    转载:http://blog.csdn.net/jay900323/article/details/18141217     Linux五种IO模型及分析   目录(?)[-] 概念理解 Linux下 ...

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

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

随机推荐

  1. [转帖]decimal,float和double的区别是什么?

    https://zhuanlan.zhihu.com/p/352503879 今天复习mysql理论知识,在看常用数据类型的时候发现float和decimal类型都是表示小数,就展开搜索学习了一下区别 ...

  2. [转帖]THE OSWATCHER ANALYZER USER'S GUIDE

    oswbba THE OSWATCHER ANALYZER USER'S GUIDE Carl DavisMay 7, 2019 To see how to use this tool and it' ...

  3. 【转帖】磁盘IOPS的计算

    计算磁盘IOPS的三个因素: 1.RAID类型的读写比 不同RAID类型的IOPS计算公式: RAID类型 公式 RAID5.RAID3 Drive IOPS=Read IOPS + 4*Write ...

  4. [转帖]linux块I/O总体概括

    直接先上重点,linux中IO栈的完全图如下: 系统中能够随机访问固定大小数据片的硬件设备称作块设备.固定大小的数据片称为块.常见的块设备就是硬盘了.不能随机访问的就是字符设备了,管理块设备比字符设备 ...

  5. buildkit ctr 与 k3s的简单学习

    摘要 前面一部分学习了 buildkit的简单搭建 也学习会了如果build images的简单处理 但是搭建镜像只是万里长征第一步. 如何进行微服务部署,才是关键的第二步. 公司最近使用基于K3S的 ...

  6. 一次OOM事故的学习过程

    事故过程 周二下午得到消息, 希望帮忙分析dump文件. 告知dump大小为42G大小. 一般机器没这么大的内存进行处理. 建议现场上传到百度云盘, 然后我这边进行下载. 时间进度为: 11.57创建 ...

  7. 浅浅的源码剖析grpc-go(一)

    最近在学习 rpc 相关的知识,如果让我去从头设计一个 rpc,我从使用者的角度出发,究竟需要去做一下什么工作? 第一,RPC 本质上就是一个远程调用,那肯定就需要通过网络来传输数据.虽然传输协议可以 ...

  8. uni-app事件冒泡 如何解决事件冒泡 推荐tap事件

    冒泡事件## 冒泡事件 <view class="max-box" @tap="waimian"> 外面 <view class=" ...

  9. 从零开始配置vim(31)——git 配置

    很抱歉又拖更了这么久了,在这个新公司我想快速度过试用期,所以大部分的精力主要花在日常工作上面.但是这个系列还是得更新下去,平时只能抽有限的业余时间来准备.这就导致我写这些文章就慢了一些. 废话不多说, ...

  10. 从零开始匹配vim(0)——vimscript 简介

    通过之前一系列的文章,相信各位小伙伴应该已经对vim产生了浓厚的兴趣,可能不少小伙伴通过慢慢的使用变的跟我一样,离开vim就不会写代码了.如果你希望继续长时间使用vim,甚至将vim作为主要的代码编辑 ...