重回东软了,据说可能要做一个跟文件相关的项目,于是决定把Java NIO的内容再捡起来,看看。

为什么要使用NIO,其实在低连接数的情况下,NIO的性能是要低于IO的;但是在高并发的情况下,确实NIO性能好得多;因为IO是会为为每一个连接都分配一个线程/进程进行处理,NIO则只是使用一个线程/进程,通过系统地select机制进行轮询获取请求信息;

默认情况下,设备控制器不能实现DMA(directional Memory Access),去操作user space,但是经过虚拟内存,已经可以实现了;虚拟内存就是将内核空间地址到物理地址的映射(map),供user space使用;

IO的基本概念就是buffer的处理,所谓的input/outputqish1其实就是数据从buffer中放入移出;

进程使用的是user space,发送一个read命令到内核,通过buffer(内存空间)将命令以及命令数据发送到kenal space,kenal space将命令进行处理,从硬盘中去读数据,硬盘通过DMA(不需要经过CPU)直接将数据写入到kernal memory,kernal space再将数据进行重新组装(因为从设备过来的数据data-block,需要kernal space进行处理拆包打包后封装成byte buffer),并拷贝到临时的buffer中发送到user space中;

在现代操作系统中引入了虚拟内存(Virtual Memory)的概念,VM的好处两点:多个虚拟地址空间可以映射到同一个物理内存(比如user space以及kernal space都可以访问物理的内存空间);虚拟空间可以大于物理内存空间(超出的可以放置到硬盘的交换区);这样,作为内存,他的定位就是(沦为)物理硬盘的一个缓存,根据需要的内容置换到内存中去;

有了虚拟内存之后,上面介绍的操作中"并拷贝到临时的buffer中发送到user space中"的步骤就可以省略了,因为虚拟地址可以让user space和kernal space共享相同的物理内存地址,只要他们都是访问虚拟地址;userspace也可以访问到kernalspace组装好的bytebuffer;但是因为这样意味着user space可以直接读取设备(比如硬盘)设置的内存空间,所以这意味着需要对于内存进行分页(物理内存以及虚拟内存,一般两者分页大小一样);通常情况下,每页的大小是block的倍数,每个物理扇片的大小是521btye,内存分页大小为1024,2048以及4096;

在CPU和内存之间其实还有一个组件,称之为MMU,Memory Management Unit,专门用于将虚拟地址转换定位到物理地址,他负责定位对应"页";当需要的页并不在当前内存中,就会触发一个fault page,如果请求的虚拟地址是在物理硬盘正存放的,那么需要把所需的页从硬盘中取出来放入到内存中;如果请求的地址并不存在,那么,这个进程将会被杀死(kill);在这个过程中,可能是需要进行置换(stole)一部分当前内存的页到物理硬盘中,这个时候就需要对这些页进行复制然后传入到硬盘中;

其实所谓的"虚拟空间可以大于物理内存空间"是指虚拟空间他自己另外造了一套体系,实现虚拟空间和内存,虚拟空间和硬盘通过页的映射;所以已经不再仅仅局限于物理内存的概念了;物理内存空间的角色更像是虚拟空间的一个物理缓存;

并不是所有的设备都是采用block方式进行传输,比如CD机,打印机端口,网络端口等设备就是采用流(stream)的方式;stream的方式其实速度是比block方式要慢,一般用于间歇性通信情况;对于stream的接受有两种方式,一种是nonblock方式,这种方式是让进程去监听是否有可用的流准备好了(没有,进程可以释放做别的事情,有,进程则专职处理流);还有一种方式就是readiness selection,操作系统将会被通知,告知有流准备好了,前者是进程主动监控是否有可用流;后者则是通知机制(草莓园与园丁模式);

MappedByteBuffer使用:

FileInputStream fis = new FileInputStream(sourcePath);

FileOutputStream fos = new FileOutputStream(targetPath);

FileChannel fc = fis.getChannel();

FileChannel out = fos.getChannel();

MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());

out.write(mbb);

out.close();

,limit就是本来长度;如果你使用flip之后,将会导致limit=position=0;到最后ByteBuffer的塌陷;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Java NIO回炉的更多相关文章

  1. 源码分析netty服务器创建过程vs java nio服务器创建

    1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...

  2. 支撑Java NIO 与 NodeJS的底层技术

    支撑Java NIO 与 NodeJS的底层技术 众所周知在近几个版本的Java中增加了一些对Java NIO.NIO2的支持,与此同时NodeJS技术栈中最为人称道的优势之一就是其高性能IO,那么我 ...

  3. JAVA NIO学习笔记1 - 架构简介

    最近项目中遇到不少NIO相关知识,之前对这块接触得较少,算是我的一个盲区,打算花点时间学习,简单做一点个人学习总结. 简介 NIO(New IO)是JDK1.4以后推出的全新IO API,相比传统IO ...

  4. Java NIO概述

    Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然 Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Se ...

  5. JAVA NIO Socket通道

      DatagramChannel和SocketChannel都实现定义读写功能,ServerSocketChannel不实现,只负责监听传入的连接,并建立新的SocketChannel,本身不传输数 ...

  6. JAVA NIO FileChannel 内存映射文件

      文件通道总是阻塞式的. 文件通道不能创建,只能通过(RandomAccessFile.FileInputStream.FileOutputStream)getChannel()获得,具有与File ...

  7. java nio系列文章

    java nio系列教程 基于NIO的Client/Server程序实践 (推荐) java nio与并发编程相关电子书籍   (访问密码 48dd) 理解NIO nio学习记录 图解ByteBuff ...

  8. Java NIO (转)

    Java NIO提供了与标准IO不同的IO工作方式: Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(B ...

  9. Java NIO使用及原理分析(1-4)(转)

    转载的原文章也找不到!从以下博客中找到http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一 ...

随机推荐

  1. Linux系列:Ubuntu虚拟机设置固定IP上网(配置IP、网关、DNS、防止resolv.conf被重写)

    虚拟机里设置上网方式为NAT最方便,因为无需手动设置即可上网,但是NAT的上网方式默认是DHCP动态分配IP的,这意味着你每次重启虚拟机都 有不一样的IP地址,这对一般用户没任何问题.但是如果你的机子 ...

  2. [Javascript] The Array forEach method

    Most JavaScript developers are familiar with the for loop. One of the most common uses of the for lo ...

  3. iOS开发中一些常用的方法

    1.压缩图片 #pragma mark 处理图片 - (void)useImage:(UIImage *)image { NSLog(@"with-----%f heught-----%f& ...

  4. java验证码(采用struts2实现)转

    第一步:编写验证码的Action package com; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; ...

  5. RHCA学习笔记:RH442-Unit9内核定时与进程延时

      Unit 9 Kernel Timing and Process Latency 内核定时与进程延时 学习目标: A.了解CPU 是怎样追踪时间的 B.调整CPU的访问次数 C.调整调度延时 D. ...

  6. android使用模拟机测试时,若要联网IP地址该怎么写?

    android使用模拟机测试时,如果服务器也是本机,那么IP地址如果写为localhost或者127.0.0.1,这样其实是不能访问到本机上部署的服务端,那么该怎么写呢?很简单,把IP地址改为10.0 ...

  7. js函数、表单验证

    惊天bug!!!在script里面只要有一点点错误,就都不执行了!!!所以每写一个方法,就跑一下,因为这个书写疏忽导致的bug不可估量!!! [笑哭,所以我才这么讨厌js么,后来真心的是一点都不想再看 ...

  8. nyoj349 poj1094 Sorting It All Out(拓扑排序)

    nyoj349   http://acm.nyist.net/JudgeOnline/problem.php?pid=349poj1094   http://poj.org/problem?id=10 ...

  9. Spring MVC 3.0 返回JSON数据的方法

    Spring MVC 3.0 返回JSON数据的方法1. 直接 PrintWriter 输出2. 使用 JSP 视图3. 使用Spring内置的支持// Spring MVC 配置<bean c ...

  10. Apache配置命令

    Apache的主配置文件: 1.DocumentRoot——指定网站的根目录 提示:该目录必须存在.目录上不能有汉字或空格. 2.DirectoryIndex (1)描述:设置网站的默认首页文件.访问 ...