当前位置: 首页 > news >正文

9.6 Linux_I/O_IO模型

基本概念

I/O执行过程与分类:

用户进程中的一个完整I/O分为 "用户进程空间->内核空间->设备空间(磁盘、网卡)" 这两个阶段。

I/O可以分为内存I/O、网络I/O、磁盘I/O

同步和异步是什么:

1、对于线程的请求调用,同步与异步区别在于是否要等这个请求出最终结果

比如read函数,它就是只有读完了数据,存入到了buf中,才会执行下一步,这就是同步

比如aio_read函数,它就是只发送请求数据,不论是否读完,它都会执行下一步,这就是异步。

2、对于多线程,同步与异步区别在于是否要一致、是否要协调

比如生产者与消费者模型,消费者需要等待生产者生产之后再消费,需要一致,这就是同步。

比如两个线程,各干各的事,这两个事情完全没有联系,这就不需要一致,这就是异步。

3、线程内现后两个函数的调用也是一种同步

现后两个函数的调用的意思是第一个函数执行结束,第二个函数才执行。正常的程序都有这种同步

4、异步就是一个请求返回时一定不知道结果,还需要通过其他机制获取结果。

其他机制主要有主动轮询、被动通知这两种。

阻塞与非阻塞是什么:

阻塞、非阻塞与等待消息通知时线程的状态有关。阻塞的侧重点是等待时的状态,同步的侧重点是数据通知机制。

进程生存周期的五个状态:

新建、就绪、运行、阻塞、死亡

进程进入阻塞态的原因:

1、调用sleep休眠

2、调用一个在I/O上被阻塞的操作

3、获取不到锁时

4、等待触发条件

socket中可能进入阻塞的操作:

输入、输出、接收连接accept、外出连接connect

I/O模型

五种I/O模型:

阻塞I/O、非阻塞I/O、多路复用I/O、信号驱动式I/O、异步I/O

阻塞I/O模型:

以recvfrom函数为例。当进程调用recvfrom函数之后,会进入内核空间,在内核空间中去等待数据,这时是死等,直到数据到达并拷贝完成后,才会返回应用进程,此时应用进程解除阻塞。

注意:阻塞I/O的阻塞点主要指的是等待数据到来时是阻塞的。

非阻塞I/O模型:

以recvfrom函数为例。当进程调用recvfrom函数之后,会进入内核空间:当没有数据时,并不会死等而是返回一个错误信息;当有数据时,会将数据拷贝完成,之后返回应用进程(拷贝为死等)。

注意:非阻塞I/O的非阻塞点主要指的是不去等待数据到来,而拷贝数据时依旧有短暂阻塞。

多路复用I/O模型:

以select-recvfrom为例,多路复用I/O分为 "等待多路数据" 和 "拷贝指定路的数据" 两步。

等待多路数据:当应用进程调用select函数后,进入内核空间,这时select根据所配置的参数可能为阻塞等待,也可能是非阻塞等待数据。当多个通道中,有数据存在时, 会返回一个可读条件,这个条件指定了哪一路的数据是存在的。

拷贝指定路的数据:当recvfrom收到select返回的可读条件后,就会去指定的通道拷贝数据。同样在拷贝数据的过程中有短暂阻塞。拷贝数据结束后返回应用进程。

信号驱动式I/O模型:

以sigaction-recvfrom为例,信号驱动式I/O可以分为 "注册信号" 和 "拷贝数据" 这两步。

注册信号:当应用进程调用sigaction函数后,进入内核空间,将信号处理函数注册到内核中,之后返回到应用空间中。此时进程继续正常执行,直到信号产生,内核会向进程发送信号处理的请求。

拷贝数据:当应用进程接收到信号处理请求后,会调用信号处理函数。假设信号处理函数中有一个recvfrom,这是就会进入内核去拷贝数据,短暂阻塞并拷贝完成后返回应用进程。

注意:信号驱动式I/O是同步的,这是因为在拷贝数据过程中是同步的。即:真正发起I/O操作的过程是同步的。

异步I/O模型:

以aio_read为例,当应用进程调用aio_read后,会向内核发送一个读请求,之后就从内核返回到应用进程。这之后,应用进程正常运行,当有数据时,会在内核中自动拷贝。拷贝结束后,内核向应用进程发起信号,应用进程直接使用拷贝好的数据。

注意:异步I/O异步的点是,真正的I/O操作过程,是内核完成的,于此同时应用进程并没有等待它完成,而是异步的做另一件事情。

http://www.lryc.cn/news/462756.html

相关文章:

  • React 探秘(一):fiber 架构
  • poi通过在word中写入了表格,通过libreoffice转换成PDF后,word中刚才画的表格宽度无限拉伸问题的解决。
  • 尚硅谷rabbitmq2024 集群篇仲裁队列 第52节 答疑
  • 《Spring Cloud 微服务:构建高效、灵活的分布式系统》
  • OpenFeign 入门与实战:快速搭建 Spring Cloud 微服务客户端
  • 上门按摩系统开发方案源码搭建
  • 【数据结构】宜宾大学-计院-实验四
  • selenium的IDE插件进行录制和回放并导出为python/java脚本(10)
  • 从0到1封装一个image/pdf预览组件
  • Android build子系统(02)Ninja语法与复杂依赖构建解读
  • JavaScript的第三天
  • 初识git · 有关模型
  • 基于SpringBoot+Vue+uniapp的海产品加工销售一体化管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
  • 解锁机器人视觉与人工智能的潜力,从“盲人机器”改造成有视觉能力的机器人(下)
  • CORS预检请求配置流程图 srpingboot和uniapp
  • 用Spring AI 做智能客服,基于私有知识库和RAG技术
  • TemporalBench:一个专注于细粒度时间理解的多模态视频理解的新基准。
  • 网友提问:网上申请流量卡不通过怎么办?
  • JavaWeb 22.Node.js_简介和安装
  • APIJSON的使用
  • 简单三步完成 Telegram 生态的 Web3 冷启动
  • Go Wails 学习笔记:创建第一个项目
  • Postman使用-基础篇
  • LeetCode 202.快乐数
  • Redis-03 持久化(RDB, AOF,混合持久化)及原理
  • TikTok账号策略:IP和网络环境的要求分析
  • vue后台管理系统从0到1(5)
  • OpenAI的新功能Canvas,效果还不错
  • 了解一些常用的Javascript对象方法
  • 【知识科普】GraphQL一个强大的API查询语言