【转载】NIO基本概念

慢慢了解的过程中,觉得有必要重新回顾一下IO的基本概念,深入理解一下基础。

  • 缓冲区操作
以下内容摘自 《Java NIO》:缓冲区,以及缓冲区如何工作,是所有 I/O 的基础。 所谓“输入/输出”讲的无非就是把数据移进或移出缓冲区。进程执行 I/O 操作,归结起来,也就是向操作系统发出请求,让它要么把缓冲区里的数据排干(写),要么用数据把缓冲区填满(读)。进程使用这一机制处理所有数据进出操作。操作系统内部处理这一任务的机制,其复杂程度可能超乎想像,但就概念而言,却非常直白易懂。下图简单描述了数据从外部磁盘向运行中的进程的内存区域移动的过程。进程使用 read( )系统调用,要求其缓冲区被填满。内核随即向磁盘控制硬件发出命令,要求其从磁盘读取数据。磁盘控制器把数据直接写入内核内存缓冲区,这一步通过 DMA 完成,无需主 CPU 协助。一旦磁盘控制器把缓冲区装满,内核即把数据从内核空间的临时缓冲区拷贝到进程执行 read( )调用时指定的缓冲区。


 
  • 用户空间和内核空间
用户空间是常规进程所在区域,JVM就是常规进程,驻守用户空间。在用户空间执行的代码不能直接访问硬件设备。内核空间是操作系统所在的区域,拥有特权,能够与设备控制器进行通信,控制用户空间进程的状态。所有的I/O都直接或者间接的通过内核空间。 让磁盘控制器直接把数据送到用户空间缓冲区岂不是更好?答案是否定的,首先,硬件通常不能直接访问用户空间;其次,磁盘是基于块存储的硬件设备,其操作的是固定大小的数据块,而用户进程请求的可能是任意大小的或者非对其的数据块。因此需要内核空间来负责数据的分解和在组合工作,充当中间人的角色。


 
  • 虚拟内存
虚拟内存即使用虚拟地址取代物理内存地址,好处(1)一个以上的虚拟地址可以指向同一个物理内存地址。(2)虚拟内存空间可以大于实际可用的硬件内存。
设备控制器虽然不能通过DMA直接存储到用户空间,但是通过把内核空间地址与用户空间的虚拟地址映射到同一个屋里地址,这样DMA硬件就可以填充对内核和用户空间进程同时可见的缓冲区,省去了磁盘读数据到内核缓冲区,然后从内核缓冲区到用户空间缓冲区的操作。


  •  文件锁定
共享锁:多个共享锁可以多同一个文件进行操作;独占锁:不能有其他锁控制该区域。


  • 缓冲区和通道的关系
通道是I/O传输时通过的入口,缓冲区是这些数据传输的来源或者目标。

猜你喜欢

转载自ryanflyer.iteye.com/blog/1672154
今日推荐