I/O知识集--1 关于I/O的基础知识

本文详细解析了操作系统文件系统与I/O操作的基本概念,包括缓冲区操作、内核空间与用户空间、虚拟内存、分页技术、面向文件的I/O和流I/O、多工I/O及操作系统文件系统的层次结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近要研究一下“高并发,高性能,高可靠”的服务器开发。复习一下I/O相关的各种知识。先复习一下基本概念:

•    缓冲区操作

     缓冲区及其操作,是所有I/O 的基础。进程执行I/O操作,归结起来,也就是向操作系统发出请求,让它要么把缓冲区里的数据排干(写),要么用数据把缓冲区填满(读)。。进程使用 read(  )系统调用,要求其缓冲区被填满。内核随即向磁盘控制硬件发出命令,要求其从磁盘读取数据。磁盘控制器把数据直接写入内核内存缓冲区,这一步通过 DMA  完成,无需主 CPU  协助。一旦磁盘控制器把缓冲区装满,内核即把数据从内核空间的临时缓冲区拷贝到进程执行 read(  )调用时指定的缓冲区。 下面是vmstat在linux下查看结果,注意buff,bi,bo

[root@stu112 bin]# vmstat
procs -----------memory----------     ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache          si   so    bi    bo      in   cs        us sy id  wa st
 0  0      0 421880  40920 214084    0    0    13    13    78  419       1  1   97   1   0


•    内核空间与用户空间

     内核空间是操作系统所在区域。内核代码有特别的权力:它能与设备控制器通讯(比如各种I/O设备),控制着用户区域进程的运行状态等。

     用户空间是常规进程所在区域。JVM 进程 就是常规进程,驻守于用户空间。不能直接操作硬件。

•    虚拟内存

     操作系统都使用虚拟内存。虚拟内存意为使用虚拟地址取代物理内存(硬件RAM,还有linux的swap等)地址。内核空间地址与用户空间的虚拟地址映射到同一个物理地址。省去了内核与用户空间的往来拷贝,但前提条件是,内核与用户缓冲区必须使用相同的页对齐,缓冲区的大小还必须是磁盘控制器块大小(通常为  512  字节磁盘扇区)的倍
数。这就是内存页。
•    分页技术

     把内存页大小设定为磁盘块大小的倍数,这样内核就可直接向磁盘控制硬件发布命令,把内存页写入磁盘,在需要时再重新装入。结果是,所有磁盘 I/O 都在页层面完成。对于采用分页技术的现代操作系统而言,这也是数据在磁盘与物理内存之间往来的唯一方式。

     现代  CPU  包含一个称为内存管理单元(MMU)的子系统,逻辑上位于  CPU  与物理内存之间。该设备包含虚拟地址向物理内存地址转换时所需映射信息。当 CPU 引用某内存地址时,MMU负责确定该地址所在页(往往通过对地址值进行移位或屏蔽位操作实现),并将虚拟页号转换为物理页号(这一步由硬件完成,速度极快)。如果当前不存在与该虚拟页形成有效映射的物理内存页,MMU 会向 CPU 提交一个页错误。

     页错误随即产生一个陷阱(类似于系统调用),把控制权移交给内核,附带导致错误的虚拟地址信息,然后内核采取步骤验证页的有效性。内核会安排页面调入操作,把缺失的页内容读回物理内存。这往往导致别的页被移出物理内存,好给新来的页让地方。

      要分清主要页错误和次要页错误。另外,提一下:在对“内存消耗比较的大的系统”进行调优时,主要要减少“主要页错误”;可以增大页的大小,还有可以打开jvm的“大页支持”。这些主要是性能调优的内容,按下不表。
•    面向文件的 I/O 和流 I/O

     采用分页技术的操作系统执行 文件I/O 的全过程可总结为以下几步:

     1, 确定请求的数据分布在文件系统的哪些页(磁盘扇区组)。磁盘上的文件内容和元数据可能跨越多个文件系统页,而且这些页可能也不连续。

     2,  在内核空间分配足够数量的内存页,以容纳得到确定的文件系统页。

     3,  在内存页与磁盘上的文件系统页之间建立映射。

     4,  为每一个内存页产生页错误。

     5,   虚拟内存系统俘获页错误,安排页面调入,从磁盘上读取页内容,使页有效。

     6,  一旦页面调入操作完成,文件系统即对原始数据进行解析,取得所需文件内容或属性信息。

     文件内容的改变(通过  write(  ))将导致文件系统页变脏,随后通过页面调出,与磁盘上的文件内容保持同步。文件的创建方式是,先把文件映射到空闲文件系统页,在随后的写操作中,再将文件系统页刷新到磁盘。

 

     流 I/O,其原理模仿了通道。I/O 字节流必须顺序存取,常见的例子有 TTY(控制台)设备、打印机端口和网络连接。
•    多工 I/O(就绪性选择)

      就绪性选择是把查看流是否就绪的任务交给了操作系统。操作系统受命查看一系列流,并提醒进程哪些流已经就绪(没有就绪,可以干点别的)。这样,仅仅凭借操作系统返回的就绪信息,进程就可以使用相同代码和单一线程,实现多活动流的多路传输。这一技术广泛用于网络服务器领域,用来处理数量庞大的网络连接。就绪性选择在大容量伸缩方面是必不可少的。

 

•    操作系统文件系统的层次结构(linux)

 

 

 

 

 

注:本文大量引用JAVA NIO 中文版,感谢作者和译者!

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值