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

【io深层理解】

io深层理解

  • 1.内核态
  • 2.用户态
  • 3. select IO多路复用执行原理
  • 4. select io多路复用限制和不足

1.内核态

一个进程会涉及多文件的修改,比如说。那么在内核态就会维护一个表,这个表叫文件描述符bitmap,这个表会传递给内核态,当然肯定传递的是地址咯!

  • 用户态关心的文件,执行select,等待网络io回来。。。
  • 那么用户态将关心的fd_map 取地址传递给内核,内核扫描这个fd_map,当然select的是一个最大为1024的bit数组,这个fd_map,对应索引为fd_id的位置上,就会置为1,传递给内核后,内核空间会轮训这个map,判断是否有数据到来,并从网卡拷贝到了内核的数据缓存队列。

2.用户态

  • 用户态执行select之后,会阻塞,等待数据到来,注意此时进程内部的线程是挂起的,进程也会挂起,也就是说,目前的线程是服从操作系统的调度,可以干其他任务的。而当数据到来之后,操作系统恢复上下文,恢复寄存器变量等,继续执行业务代码。

图文说明:
在这里插入图片描述

3. select IO多路复用执行原理

  1. 将当前进程的所有文件描述符,一次性地从用户态拷贝到内核态
  2. 在内核中快速无差别地遍历每个id,判断是否有数据到来
  3. 将所有fd状态,从内核态拷贝到用户态,并返回已就绪的fd的个数
  4. 在用户态遍历判断具体哪个fd已就绪,然后进行相应的事件处理

4. select io多路复用限制和不足

  1. 文件描述符表为bitmap,有长度限制1024的限制
  2. fdset无法做到重用,每次循环必须重新创建
  3. 频繁的用户态和内核态的拷贝,性能开销很大
  4. 需要对文件描述符进行遍历,O(n)的轮训时间复杂度
http://www.lryc.cn/news/427533.html

相关文章:

  • 【懒人工具】指定新文件,替换全盘旧文件
  • React+Vis.js(02):设置节点样式
  • 3G网络要彻底没了
  • 如何配置ESXI主机的IP地址管理
  • 软件测试学习笔记丨测试用例设计方法
  • MinIO基本用法
  • MySQL windows版本安装
  • Python实现人脸轮廓提取
  • Prettier+Vscode setting提高前端开发效率
  • YOLOv10实时端到端目标检测
  • Java中的Annotation注解
  • 小五金加工:细节决定产品质量与性能
  • VS Code安装配置ssh服务结合内网穿透远程连接本地服务器详细步骤
  • 世界首位「AI科学家」问世!独立生成10篇学术论文! 横扫「顶会」?
  • 【高阶数据结构】图
  • 调研-音视频
  • 【数据结构】链式结构实现:二叉树
  • 20221元组
  • 艾瑞白皮书解读(三)丨剖析制造业、工程设计、创投数据治理痛点与典型方案
  • 如何在 Odoo 16 Studio 模块中自定义视图和报告
  • Redis的十大数据类型的常用命令(上)
  • 智慧服务管理平台小程序开发方案
  • 【轻松拿捏】Java中ArrayList 和 LinkedList 的区别是什么?
  • 【排序篇】快速排序的非递归实现与归并排序的实现
  • Java垃圾收集器工作原理
  • STM32CubeMX stm32不限长度使用DMA收发串口数据
  • Jmeter系列之作用域、执行顺序
  • 舜宇光学科技社招校招入职测评:商业推理测验真题汇总、答题要求、高分技巧
  • C语言——构造(结构体)
  • 京东2025届秋招 算法开发工程师 第2批笔试