彻底理解 IO 多路复用实现机制
文章插图
本文作者:何建辉(公众号:org_yijiaoqian)
点赞再看 , 养成习惯 , 微信搜一搜【一角钱技术】关注更多原创技术文章 。 本文 GitHub org_hejianhui/JavaStudy已收录 , 有我的系列文章 。
前言
- BIO 、NIO 、AIO 总结
- Unix网络编程中的五种IO模型
概念说明IO 多路复用有三种实现 , 在介绍select、poll、epoll之前 , 首先介绍一下Linux操作系统中基础的概念:
- 用户空间和内核空间
- 进程切换
- 进程的阻塞
- 文件描述符
- 缓存 I/O
针对linux操作系统而言 , 将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF) , 供内核使用 , 称为内核空间 , 而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF) , 供各个进程使用 , 称为用户空间 。
进程切换为了控制进程的执行 , 内核必须有能力挂起正在CPU上运行的进程 , 并恢复以前挂起的某个进程的执行 。 这种行为被称为进程切换 。 因此可以说 , 任何进程都是在操作系统内核的支持下运行的 , 是与内核紧密相关的 , 并且进程切换是非常耗费资源的 。
从一个进程的运行转到另一个进程上运行 , 这个过程中经过下面这些变化:
- 保存处理机上下文 , 包括程序计数器和其他寄存器 。
- 更新PCB信息 。
- 把进程的PCB移入相应的队列 , 如就绪、在某事件阻塞等队列 。
- 选择另一个进程执行 , 并更新其PCB 。
- 更新内存管理的数据结构 。
- 恢复处理机上下文 。
文件描述符文件描述符(File descriptor)是计算机科学中的一个术语 , 是一个用于表述指向文件的引用的抽象化概念 。文件描述符在形式上是一个非负整数 。 实际上 , 它是一个索引值 , 指向内核为每一个进程所维护的该进程打开文件的记录表 。 当程序打开一个现有文件或者创建一个新文件时 , 内核向进程返回一个文件描述符 。 在程序设计中 , 一些涉及底层的程序编写往往会围绕着文件描述符展开 。 但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统 。
缓存I/O缓存I/O又称为标准I/O , 大多数文件系统的默认I/O操作都是缓存I/O 。 在Linux的缓存I/O机制中 , 操作系统会将I/O的数据缓存在文件系统的页缓存中 , 即数据会先被拷贝到操作系统内核的缓冲区中 , 然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间 。
推荐阅读
- 曾被京东物流效仿,让雷军花1亿拯救,如今欠7000万彻底出局
- 线下市场彻底“乱了”!小米宣布新规!华为捆绑加价行为迎争议
- 一波未平一波又起,我买个菜就欠了一笔贷款?美团这次彻底没话说
- 微软|外媒:微软将对Windows 10界面进行彻底改进 已招兵买马
- 华为P50真机图曝光:外形变化很彻底
- 京东7FRESH迎来彻底变革
- Windows 10等软件全部封杀 Flash彻底说再见
- 数据|新基建时代,高大全的数据管理解决方案是怎样“炼”成的?
- 尼康相机将于2021年底前彻底告别“日本产”
- 微信的一项更新,彻底让用户“反感”,这是要开启直播时代?