`
ryanflyer
  • 浏览: 102392 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

【转载】NIO基本概念

 
阅读更多

慢慢了解的过程中,觉得有必要重新回顾一下IO的基本概念,深入理解一下基础。

 

  • 缓冲区操作
以下内容摘自《Java NIO》:缓冲区,以及缓冲区如何工作,是所有 I/O 的基础。所谓“输入/输出”讲的无非就是把数据移进或移出缓冲区。进程执行 I/O 操作,归结起来,也就是向操作系统发出请求,让它要么把缓冲区里的数据排干(写),要么用数据把缓冲区填满(读)。进程使用这一机制处理所有数据进出操作。操作系统内部处理这一任务的机制,其复杂程度可能超乎想像,但就概念而言,却非常直白易懂。下图简单描述了数据从外部磁盘向运行中的进程的内存区域移动的过程。进程使用 read( )系统调用,要求其缓冲区被填满。内核随即向磁盘控制硬件发出命令,要求其从磁盘读取数据。磁盘控制器把数据直接写入内核内存缓冲区,这一步通过 DMA 完成,无需主 CPU 协助。一旦磁盘控制器把缓冲区装满,内核即把数据从内核空间的临时缓冲区拷贝到进程执行 read( )调用时指定的缓冲区。


 

 

  • 用户空间和内核空间
用户空间是常规进程所在区域,JVM就是常规进程,驻守用户空间。在用户空间执行的代码不能直接访问硬件设备。内核空间是操作系统所在的区域,拥有特权,能够与设备控制器进行通信,控制用户空间进程的状态。所有的I/O都直接或者间接的通过内核空间。让磁盘控制器直接把数据送到用户空间缓冲区岂不是更好?答案是否定的,首先,硬件通常不能直接访问用户空间;其次,磁盘是基于块存储的硬件设备,其操作的是固定大小的数据块,而用户进程请求的可能是任意大小的或者非对其的数据块。因此需要内核空间来负责数据的分解和在组合工作,充当中间人的角色。


 

 

  • 虚拟内存
虚拟内存即使用虚拟地址取代物理内存地址,好处(1)一个以上的虚拟地址可以指向同一个物理内存地址。(2)虚拟内存空间可以大于实际可用的硬件内存。
设备控制器虽然不能通过DMA直接存储到用户空间,但是通过把内核空间地址与用户空间的虚拟地址映射到同一个屋里地址,这样DMA硬件就可以填充对内核和用户空间进程同时可见的缓冲区,省去了磁盘读数据到内核缓冲区,然后从内核缓冲区到用户空间缓冲区的操作。


  •  文件锁定
共享锁:多个共享锁可以多同一个文件进行操作;独占锁:不能有其他锁控制该区域。


 

  • 缓冲区和通道的关系
通道是I/O传输时通过的入口,缓冲区是这些数据传输的来源或者目标。

 

  • 大小: 9.2 KB
  • 大小: 12.4 KB
  • 大小: 12.6 KB
  • 大小: 9.7 KB
分享到:
评论

相关推荐

    Java NIO核心概念总结篇

    - **基本概念**:缓冲区是指在内存中预先分配的一段连续的空间,用于暂时存储输入/输出数据。 - **作用**:缓冲区作为 I/O 操作的数据中转站,提高了数据处理效率。 - **类型**:根据数据类型的不同,Java 提供了...

    NIO学习系列:核心概念及基本读写

    本篇内容将深入讲解NIO的核心概念以及基本的读写操作。 ### NIO核心概念 1. **通道(Channel)**:通道是NIO中的关键组件,它连接到I/O设备(如文件、网络套接字等)。通道可以读取或写入数据,且是双向的。例如,...

    Java NIO Socket基本

    Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的 Blocking I/O(同步阻塞I/O)相对。NIO在Java 1.4版本引入,其设计目标是提供一种更高效、更灵活的I/O操作方式,特别适合处理大量并发连接...

    java NIO.zip

    NIO的核心在于通道(Channels)和缓冲区(Buffers)的概念,与传统的流(Streams)有所不同。 1. **通道(Channels)**: 通道是NIO中的核心概念之一,它提供了从一个数据源(如文件、套接字)到另一个数据源的...

    Java.NIO资源下载资源下载

    - **Buffer 基础**:介绍了 Buffer 的基本概念,包括如何创建 Buffer、复制 Buffer 以及 ByteBuffer 的具体用法。 - **创建 Buffer**:讨论了多种创建 Buffer 的方法。 - **复制 Buffer**:探讨了 Buffer 的复制机制...

    javaNiO.doc

    本文将深入探讨传统I/O模型的问题,并详细介绍NIO的概念、优势以及其实现机制。 #### 2. 传统I/O模型及其局限性 传统I/O模型基于字节流或字符流,主要通过`InputStream`、`OutputStream`、`Reader`和`Writer`等类...

    基于nio实现的多文件上传源码

    首先,理解NIO的基本概念是必要的。NIO中的“非阻塞”意味着当数据不可用时,读写操作不会被挂起,而是立即返回,这极大地提高了程序的效率。NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择器...

    nio入门 IBM教材,pdf格式

    - **关键特性**:NIO 支持缓冲区(Buffer)、通道(Channel)等核心概念,以及异步 I/O 和直接缓冲区等特性,这些都是原始 I/O 包无法提供的功能。 #### 二、NIO 的基础概念 - **缓冲区(Buffer)**:缓冲区是 NIO 中的...

    Java NIO系列教程(一) Java NIO 概述

    ### Java NIO 系列教程(一):Java NIO 概述 #### 一、引言 Java NIO(New IO)是Java SE 1.4版本引入的一个新的I/O处理框架,它...在未来的学习过程中,继续深入理解这些概念将有助于您更好地掌握Java NIO技术。

    NIO 入门.chm,NIO 入门.chm

    NIO的核心概念主要包括通道(Channel)、缓冲区(Buffer)、选择器(Selector)等。 1. **通道(Channel)**:通道是数据传输的途径,它类似于流,但不同于流只能单向流动,通道可以进行双向数据传输。常见的通道有...

    Java NIO英文高清原版

    NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。以下是对这些核心概念的详细解释: 1. **通道(Channel)**:在NIO中,数据是通过通道进行传输的。通道是一种连接到I/O设备(如文件、套...

    java NIO实例

    Java NIO,全称为Non-Blocking Input/...以上就是Java NIO的基本概念和工作流程,以及结合文件名推测的`NIOServer.java`和`NIOClient.java`可能实现的功能。学习和理解NIO,对于开发高并发、高性能的Java应用至关重要。

    JavaNIO chm帮助文档

    Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...

    深入浅出NIO

    《深入浅出NIO》 在Java编程领域,NIO(New Input/Output)是一种用于替代标准IO模型的机制,其核心在于非阻塞的I/O操作和通道(Channel)...通过理解NIO的基本概念和机制,我们可以构建出更高效、可扩展的应用程序。

    nio demo for nio学习笔记(体系结构以及模块介绍)

    在学习NIO时,首先需要理解Channel、Buffer、Selector的基本概念和使用方法,然后通过实例来熟悉它们的交互过程。例如,可以通过创建一个简单的服务器,使用ServerSocketChannel监听连接,SocketChannel处理客户端...

    Java IO NIO and NIO 2 无水印pdf

    Java IO NIO and NIO 2 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn...

    《NIO与Socket编程技术指南》_高洪岩

    1. NIO基础:介绍NIO的基本概念,如通道、缓冲区、选择器以及它们之间的交互。 2. 文件操作:讲解如何使用NIO进行文件的读写操作,包括文件通道和MappedByteBuffer的使用。 3. 非阻塞I/O:对比NIO和BIO,解释非阻塞I...

    Java IO, NIO and NIO.2

    NIO基于缓冲区(Buffers)、通道(Channels)、选择器(Selectors)等概念。 缓冲区是NIO中一个核心概念,它是一个对象,用于在I/O服务之间存储数据。缓冲区具有以下四个属性: 1. Capacity(容量):表示缓冲区的...

Global site tag (gtag.js) - Google Analytics