最近要研究一下“高并发,高性能,高可靠”的服务器开发。复习一下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 中文版,感谢作者和译者!