内存映射文件

传统的文件 I/O 是通过用户进程发布 read( )write( )系统调用来传输数据的。为了在内核空间的文件系统页与用户空间的内存区之间移动数据,一次以上的拷贝操作几乎总是免不了的。这是因为,在文件系统页与用户缓冲区之间往往没有一一对应关系。但是,还有一种大多数操作系统都支持的特殊类型的 I/O 操作,允许用户进程最大限度地利用面向页的系统 I/O 特性,并完全摒弃缓冲区拷贝。这就是内存映射 I/O.内存映射 I/O 使用文件系统建立从用户空间直到可用文件系统页的虚拟内存映射。这样做有几个好处:

用户进程把文件数据当作内存,所以无需发布 read( )write( )系统调用。
当用户进程碰触到映射内存空间,页错误会自动产生,从而将文件数据从磁盘读进内存。如果用户修改了映射内存空间,相关页会自动标记为脏,随后刷新到磁盘,文件得到更新。
操作系统的虚拟内存子系统会对页进行智能高速缓存,自动根据系统负载进行内存管理。
数据总是按页对齐的,无需执行缓冲区拷贝。
大型文件使用映射,无需耗费大量内存,即可进行数据拷贝。
虚拟内存和磁盘 I/O 是紧密关联的,从很多方面看来,它们只是同一件事物的两面。在处理大量数据时,尤其要记得这一点。如果数据缓冲区是按页对齐的,且大小是内建页大小的倍数,那么,对大多数操作系统而言,其处理效率会大幅提升。

文件锁定

文件锁定机制允许一个进程阻止其他进程存取某文件,或限制其存取方式。通常的用途是控制共享信息的更新方式,或用于事务隔离。在控制多个实体并行访问共同资源方面,文件锁定是必不可少的。数据库等复杂应用严重信赖于文件锁定。
“文件锁定”从字面上看有锁定整个文件的意思(通常的确是那样),但锁定往往可以发生在更为细微的层面,锁定区域往往可以细致到单个字节。锁定与特定文件相关,开始于文件的某个特定字节地址,包含特定数量的连续字节。这对于协调多个进程互不影响地访问文件不同区域,是至关重要的。
文件锁定有两种方式:共享的和独占的。多个共享锁可同时对同一文件区域发生作用;独占锁则不同,它要求相关区域不能有其他锁定在起作用。
共享锁和独占锁的经典应用,是控制最初用于读取的共享文件的更新。某个进程要读取文件,会先取得该文件或该文件部分区域的共享锁。第二个希望读取相同文件区域的进程也会请求共享锁。两个进程可以并行读取,互不影响。但是,假如有第三个进程要更新该文件,它会请求独占锁。该进程会处于阻滞状态,直到既有锁定(共享的、独占的)全部解除。一旦给予独占锁,其他共享锁的读取进程会处于阻滞状态,直到独占锁解除。这样,更新进程可以更改文件,而其他读取进程不会因为文件的更改得到前后不一致的结果。

文件锁有建议使用和强制使用之分。建议型文件锁会向提出请求的进程提供当前锁定信息,但操作系统并不要求一定这样做,而是由相关进程进行协调并关注锁定信息。多数 Unix 和类 Unix 操作系统使用建议型锁,有些也使用强制型锁或兼而有之。强制型锁由操作系统或文件系统强行实施,不管进程对锁的存在知道与否,都会阻止其对文件锁定区域的访问。微软的操作系统往往使用的是强制型锁。假定所有文件锁均为建议型,并在访问共同资源的各个应用程序间使用一致的文件锁定,是明智之举,也是唯一可行的跨平台策略。依赖于强制文件锁定的应用程序,从根子上讲就是不可移植的。

流I/O

并非所有 I/O 都像前几节讲的是面向块的,也有流 I/O,其原理模仿了通道。 I/O 字节流必须顺序存取,常见的例子有 TTY(控制台)设备、打印机端口和网络连接。
流的传输一般(也不必然如此)比块设备慢,经常用于间歇性输入。多数操作系统允许把流置于非块模式,这样,进程可以查看流上是否有输入,即便当时没有也不影响它干别的。这样一种能力使得进程可以在有输入的时候进行处理, 输入流闲置的时候执行其他功能。比非块模式再进一步,就是就绪性选择。就绪性选择与非块模式类似(常常就是建立在非块模式之上),但是把查看流是否就绪的任务交给了操作系统。操作系统受命查看一系列流,并提醒进程哪些流已经就绪。这样,仅仅凭借操作系统返回的就绪信息,进程就可以使用相同代码和单一线程,实现多活动流的多路传输。这一技术广泛用于网络服务器领域,用来处理数量庞大的网络连接。就绪性选择在大容量缩放方面是必不可少的。

转载于:https://blog.51cto.com/jixiaochong/1765119

Java NIO 之 I/O基本概念(二)相关推荐

  1. Java NIO使用及原理分析(二)

    2019独角兽企业重金招聘Python工程师标准>>> 转载自:李会军•宁静致远 在第一篇中,我们介绍了NIO中的两个核心对象:缓冲区和通道,在谈到缓冲区时,我们说缓冲区对象本质上是 ...

  2. JAVA NIO学习一:NIO简介、NIOIO的主要区别

    在前面学习了IO之后,今天我们开始进入NIO学习环节,首先我们会NIO做一个简单的介绍,让大家认识NIO,然后会和IO进行一个对比认识进行区分.好了,下面我们就开始学习: 一.NIO简介 1.概述 从 ...

  3. Java NIO 系列教程 转

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

  4. Java NIO 系列教程

    Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.本系列教程将有助于你学习和理解Java NIO. Java NIO提供了与 ...

  5. Java NIO学习系列四:NIO和IO对比

    前面的一些文章中我总结了一些Java IO和NIO相关的主要知识点,也是管中窥豹,IO类库已经功能很强大了,但是Java 为什么又要引入NIO,这是我一直不是很清楚的?前面也只是简单提及了一下:因为性 ...

  6. Java NIO使用及原理分析

    http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一些Java方面的开发,其中最重要的一块 ...

  7. 精讲Java NIO

    Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.本文将有助于你学习和理解Java NIO. Java NIO提供了与标准I ...

  8. Java NIO概述(1)

    Java NIO是一个从Java 1.4开始就可以代替标准Java IO API的IO API,Java NIO提供了与标准IO不同的IO工作方式. Java NIO:通道和缓冲区(Channels ...

  9. java nio 如何使用_Java NIO 系列教程(转)

    原文中说了最重要的3个概念, Channel 通道 Buffer 缓冲区 Selector 选择器 其中Channel对应以前的流,Buffer不是什么新东西,Selector是因为nio可以使用异步 ...

  10. 【转载】Java NIO学习

    这篇文章介绍了NIO的基本概念: http://www.iteye.com/magazines/132-Java-NIO Java NIO提供了与标准IO不同的IO工作方式: Channels and ...

最新文章

  1. AndroidSDK结合SpringBoot实现支付宝支付功能
  2. Serverless对研发效能的变革和创新
  3. Star sky CodeForces - 835C
  4. day02-java关键字
  5. 蓝奏云外链批量下载软件
  6. kafka专题:kafka的总控制器Controller、消费者重分配策略等核心设计原理详解
  7. Python利用结巴模块统计《水浒传》词频
  8. Message Queue基本使用说明
  9. mac osx终端命令大全
  10. #博学谷it学习技术支持# Java学习心得
  11. java 电话呼叫中心_java呼叫中心系统
  12. 【F1C100S】编译启动所需的uboot,kernel,rootfs
  13. Cannot negotiate authentication mechanism svn: Unable to connect to a repository at URL 'svn://gite
  14. 计算机桌面上的微信图标不显示不出来的,电脑微信图标任务栏不见了怎么办
  15. 浙江大学14届计算机学院倩倩,胡倩倩(浙江大学副教授)_百度百科
  16. MySQL 是如何保证一致性、原子性和持久性的!
  17. 潜伏在前端巅峰 中同出来的前端秘笈
  18. 计算机大纲中的应用,计算机的应用论文提纲模板范本 计算机的应用论文大纲怎么写...
  19. 一,这份333页关于性能优化知识点的PDF你不能不看
  20. C++控制台程序(文字小游戏)

热门文章

  1. github 建立博客
  2. 【VS2010学习笔记】【函数学习】二(SetTimer()函数)
  3. hadoop ubantu环境搭建_创帆云大数据教程系列1-搭建基于docker的hadoop环境安装规划、容器通信及zookeeper...
  4. 实习成长之路——设计模式实战二:如何使用面向对象的思想设计一个功能需求?接口鉴权怎么用面向对象分析实现?
  5. JavaScript上传文件,不打断点就上传失败
  6. easyx按钮透明度特效_【素材】100组4K灰尘粒子烟雾特效
  7. 突发!甲骨文严查Java授权,很多公司连夜卸载了JDK,启用OpenJDK 替代....
  8. CTO@全体成员,未经允许和评审不让用反射,Java反射到底慢在哪?
  9. 干了四五年Android 开发了,如何突破成长中的技术瓶颈期?
  10. Python的学习必备基础知识总结