首页 > 系统相关 >Linux I/O模型

Linux I/O模型

时间:2022-10-31 20:45:18浏览次数:31  
标签:请求 模型 阻塞 用户 内核 Linux 进程 调用者

I/O:指的是计算机的input和output

Linux 的 I/O

  • 磁盘I/O

  • 网络I/O : 一切皆文件,本质为对socket文件的读写

磁盘 I/O

image

  • 进程向内核发起系统调用,请求磁盘上的某个资源比如是html文件或者图片,

  • 然后内核通过相应的驱动程序将目标文件加载到内核的内存空间,

  • 加载完成之后把数据从内核内存再复制给进程内存,如果是比较大的数据也需要等待时间。

网络 I/O

网络通信就是网络协议栈到用户空间进程的IO就是网络IO
image

  • 1.用户发送http请求报文到达web服务器网卡

  • 2.网卡将收到的请求报文复制到内核空间

  • 3.内核空间再把请求复制到用户空间的应用程序

  • 4.应用程序分析请求并把请求发送给内核

  • 5-6.内核将磁盘上的文件加载到内核空间,

  • 7.内核空间将数据复制到用户空间

  • 8.用户空间封装响应报文发送给内核空间

  • 9.内核空间再通过网卡将响应报文发送出去。

I/O 模型

I/O 模型相关概念:

同步和异步:

关注的是消息的通知机制(调用者和被调用者之间的消息通知关系)

同步:sync
被调用者不提供事件的处理结果。需要调用者主动讯问
A安排B干一件事,B干完了A不问,B就不说

异步:async
被调用者通过状态通知机制主动告诉被调用者自己的状态。
A安排B干一件事,B干完了A不问,B也要主动说。

阻塞和非阻塞:

阻塞:blocking
结果返回前,干不了别的的事。
A找B干活,B没做完之前,A不能做别的事。

非阻塞:noblocking
A找B干活,B没做完,A就去做别的事。

网络 I/O 模型

阻塞型、非阻塞型、复用型、信号驱动型、异步

阻塞型(同步阻塞):

进程向内核请求数据,如果内核没准备好数据,就会去磁盘找数据,找到数据后再给进程。

程序向内核发送I/O请求后一直等待内核响应,如果内核处理请求的IO操作不能立即返回,则进程将一直等待并不再接受新的请求

非阻塞型 I/O 模型:

用户线程发起IO请求时立即返回。但并未读取到任何数据,用户线程需要不断地发起IO请求,直到数据 到达后,才真正读取到数据,继续执行

问题:
即 “轮询”机制会大量消耗CPU资源

多路复用 I/O 型:

通过一个代理程序,用户将这些请求交给代理程序,代理程序集中用户的请求后,统一交给系统内核处理,用户只需要等待代理程序返回结果就行。

三种代理程序:select,poll,epoll

优点:可以基于一个阻塞对象,同时在多个描述符上等待就绪,而不是使用多个线程

缺点:当连接数较少时效率相比多线程+阻塞 I/O 模型效率较低,可能延迟更大,因为单个连接处
理需要2次系统调用,占用时间会有增加

信号驱动式 I/O 模型:

用户进程不轮询,也不傻等着内核准备数据。让内核在数据就绪时(内核空间数据准备好了,准备拷到用户空间的内存中),发送信号通知进程

优点:此模型的优势在于等待数据报到达期间进程不被阻塞。用户主程序可以继续执行,只要等待来自信号处理函数的通知。

缺点:信号 I/O 在大量 IO 操作时可能会因为信号队列溢出导致没法通知

异步 I/O 模型:

异步I/O 与 信号驱动I/O最大区别在于:

信号驱动是内核通知用户进程何时开始一个I/O操作,

而异步I/O是由内核通知用户进程I/O操作何时完成数据的准备(内核空间数据准备好了,也将数据拷贝到用户进程了),两者有本质区别,相当于不用去饭店场吃饭,直接点个外卖,把等待上菜的时间也给省了

标签:请求,模型,阻塞,用户,内核,Linux,进程,调用者
From: https://www.cnblogs.com/heyongshen/p/16845703.html

相关文章

  • [单片机框架][driver层][ioctl] MCU模拟Linux注册驱动
    概念ioctl是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设ioctl()命......
  • Linux finger 命令
    Linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与......
  • Linux源码安装MySQL
    在Linux中源码安装MySQL​​A、必备条件​​​​a>CMake​​​​b>Boost​​​​c>Mysql​​​​B、安装详情​​​​a>添加mysql用户​​​​b>配置mysql预编译参数​​​......
  • Linux如何在history命令时,查看命令执行时间
    效果如下实现过程直接在/etc/profile文件的末尾,加上:exportHISTTIMEFORMAT="%Y-%m-%d%H:%M:%S"注意:在末尾的“引号”与“S”之间,加入一位空格,将日期时间和历史命令用空格......
  • linux快速后台启动进程与退出进程脚本
    linux快速后台启动进程与退出进程脚本文盲青年于2022-06-2218:50:26发布278收藏分类专栏:linux文章标签:linux运维服务器版权linux专栏收录该内容68篇文章0订......
  • Linux findfs 命令
    Linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与......
  • R语言用贝叶斯线性回归、贝叶斯模型平均 (BMA)来预测工人工资|附代码数据
    ​ 全文链接:http://tecdat.cn/?p=24141 在本文中,贝叶斯模型提供了变量选择技术,确保变量选择的可靠性。对社会经济因素如何影响收入和工资的研究为应用这些技术提供了......
  • 命令行如何连接Linux?
    虚拟机安装linux,如何远程连接到它?用securecrt可以,也可以用windows的终端或者命令行,方法如下打开windows终端在命令行中输入ssh​​[email protected].*** 回车,如果是第一次......
  • RHEL入门-Linux基础命令
    1、命令的语法规则结构:命令选项参数命令,选项,参数之间用空格隔开选项与选项之间,参数与参数之间用空格隔开命令必须有,选项参数可有可无选项的格式,​​-`​​短格式......
  • Linux文件系统组成和基本操作
    1、文件系统的组成Linux文件系统的结构:Linux单根倒树状严格区分大小写windows多根多树状(多根指的是分区)不区分大小写文件系统从根目录开始,表示为一个单独的​​'/'​......