NIO

Posted gqymy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NIO相关的知识,希望对你有一定的参考价值。

·缓冲区操作
·内核空间与用户空间
·虚拟内存
·分页技术
·面向文件的I/O和流I/O
·多工I/O
 
缓冲区操作:
        进程执行I/O操作,也就是向操作系统发出请求,让它要么把缓冲区里的数据排干(写),要么用数据把缓冲区填满(读)。进程使用这一机制处理所有数据进出操作。操作系统内部处理这一任务的机制
        进程使用read()系统调用,要求其缓冲区被填满。内核随即向磁盘控制硬件发出命令,要求其从磁盘读取数据。磁盘你控制器把数据直接写入内核内存缓冲区,这一步通过DMA完成,无需主CPU协助。一旦磁盘控制器把缓冲区装满,内核即把数据从内核空间的临时缓存区拷贝到进程执行read()调用时指定的缓冲区
        用户空间是常规进程所在区域。JVM就是常规进程,驻守于用户空间。用户空间是非特权区域:在该区域执行的代码就不能直接访问硬件设备。
        内核空间是操作系统所在区域。内核代码有特别的权力:它能与设备控制器通讯,控制着用户所在区域进程的运行状态等等,所有I/O都直接或间接通过内核空间。
        当进程请求I/O操作的时候,它执行一个系统调用将控制权移交给内核,当内核被调用时就会找到进程所需数据,并把数据传送到用户空间内的指定缓冲区。内核试图对数据进行高速缓存或预读取,因此进程所需数据可能已经在内核空间里了。如果在内核空间,该数据只需要简单地拷贝出来即可;如果数据不在内核空间,则进程被挂起,内核着手把数据读进内存。
 
发散/汇聚:
        进程只需一个系统调用,就能把一连串缓冲区地址传递给操作系统。然后,内核就可以顺序填充或排干多个传冲去,读的时候就能把数据发散到多个用户空间缓冲区,写的时候再从多个缓冲区把数据汇聚起来。这样用户就不必多次执行系统调用,内核也可以优化数据的处理过程,因为它已掌握待传输数据的全部信息。如果系统配有多个CPU,甚至可以同时填充或排干多个缓冲区。
 
虚拟内存:
        虚拟内存意为使用虚假(或虚拟)地址取代物理内存地址,这样做的好处1是一个以上的虚拟地址可指向同一个物理内存地址;2是虚拟内存空间可大于实际可用的硬件内存
 
缓冲区基础:
        缓冲区是包在一个对象内的基本数据元素数组。Buffer类相比一个简单数组的优点是它将关于数据的数据内容和信息包含在一个单一的对象中。Buffer类以及它专有的子类定义了一个用于处理数据缓冲区的API
 
·属性
        所有的缓冲区都具有四个属性来提供关于其所包含的数据元素的信息,他们是
        容量:缓冲区能够容纳的数据元素的最大数量。这一容量在缓冲区创建时被设定,并且永远不能改变
        上界:缓冲区的第一个不能被读或写的元素。或者说缓冲区中现存元素的个数
        位置:下一个要被-

以上是关于NIO的主要内容,如果未能解决你的问题,请参考以下文章

Java NIO:IO与NIO的区别

IO 性能:Selector (NIO) vs AsynchronousChannel(NIO.2)

Java nio NonBlocking NIO

Java NIO:IO与NIO的区别

Java:NIO 和 NIO.2 到底有啥区别?

NIO 源码分析(03) 从 BIO 到 NIO