NIO学习笔记(一)I/O缓冲区操作



  上图简单描述了数据从外部磁盘向运行中的进程的内存区域移动的过程。进程使用read()系统调用,要求其缓冲区被填满。内核随即想磁盘控制硬件发出命令,要求其从磁盘读取数据。磁盘控制器把数据直接写入内核内存缓冲区,这一步通过DMA完成,无需主CPU协助。一旦磁盘控制器把缓冲区填满,内核即把数据从内核空间的临时缓冲区拷贝到进程执行read()调用时制定的缓冲区。

  用户空间是常规进程所在区域。JVM就是常规进程,驻守于用户空间。用户空间是非特权区域:比如,在该区域执行的代码就不能直接访问硬件设备。内核空间是操作系统所在的区域。内核代码有特别权力:它能与设备控制器通讯,控制着用户区域进程的运行状态,等等。最重要的是,所有I/O都直接或间接通过内核空间。

  当进程请求I/O操作的时候,它执行一个系统调用将控制权转交给内核。C/C++程序员所熟知的底层函数open()、read()、write()、close()要做的无非就是i建立和执行适当的系统调用。当内核以这种方式被调用,它随即采取任何必要步骤,找到进程所需数据,并把数据传送到用户空间内的制定缓冲区。内核试图对数据进行高速缓存或预读取,因此进程所需数据可能已经在内核空间里了。如果是这样,该数据只需要简单的拷贝出来即可。如果数据不在内核空间,则进程被挂起,内核着手把数据读进内存。

猜你喜欢

转载自freewxy.iteye.com/blog/945597
今日推荐