码迷,mamicode.com
首页 > 编程语言 > 详细

Java Nio学习总结(一)

时间:2018-01-28 12:50:57      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:.com   分享   pac   cpu   markdown   必须   大量数据   osi   因此   

在学习操作系统时,我们都知道DMA(直接内存读取)的作用,以前I/O是调用一次系统中断去告诉cpu我搬来4k的数据块让cpu来计算,
如此循环往复,这样cpu与I/O的交互次数就变得非常多,而DMA是将以大块数据块(远大于4k)全部传输完再去调用中断让cpu工作。
因此在DMA传输任务完成之前,cpu是有大把的事件快活。
我们再来看看java虚拟机,传统的java I/O类 喜欢读取小块字节数据,这时候获取了DMA提供的大块缓冲区,此时java的流数据类就会把
他拆成很多小块。这样效率就大大降低了,因此java推出了 NIO(ByteBuffer对象)。
传统的I/O模型其实也可以移动大量数据,RandomAccessFile持使用基于数组的read( )和write( )方法,这些方法和系统调用相当接近,但
他必须至少保存一份缓冲区拷贝。

I/O


技术分享图片
用户空间就是我们常说的目态(非特权区域,不能直接调用系统权利例如读取硬件设备),内核空间就是管态(特权区域,为操作系统所
持)

为什么不能直接从磁盘读取数据到用户空间呢?


因为磁盘上的操作的数据块是固定大小的而用户进程请求的可能是任意大小,甚至是边界不对齐的数据块,这时候需要第三者(内核)来负
责数据分块、组合工作,然后进行转发。

基础概念


进入NIO正题:缓冲区(Buffer)
下面这张图介绍了缓冲区家族成员
技术分享图片

缓冲区的属性:容量,上界,位置,标记。
容量(CapCapacity):缓冲区可以容纳数据的最大数量。
上界(Limit):缓冲区第一个不能读/写的元素。即,当前缓冲区存在元素的个数。
位置(Position):

Java Nio学习总结(一)

标签:.com   分享   pac   cpu   markdown   必须   大量数据   osi   因此   

原文地址:https://www.cnblogs.com/shuoli/p/8370676.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!