Java IO底层原理

一万字讲解Java中的IO流——包含底层原理 最难不过坚持 阅读详情

转自:http://www.importnew.com/14111.html

目录

缓存处理和内核vs用户空间

缓冲与缓冲的处理方式,是所有I/O操作的基础。术语“输入、输出”只对数据移入和移出缓存有意义。任何时候都要把它记在心中。通常,进程执行操作系统的I/O请求包括数据从缓冲区排出(写操作)和数据填充缓冲区(读操作)。这就是I/O的整体概念。在操作系统内部执行这些传输操作的机制可以非常复杂,但从概念上讲非常简单。我们将在文中用一小部分来讨论它。


上图显示了一个简化的“逻辑”图,它表示块数据如何从外部源,例如一个磁盘,移动到进程的存储区域(例如RAM)中。首先,进程要求其缓冲通过read()系统调用填满。这个系统调用导致内核向磁盘控 制硬件发出一条命令要从磁盘获取数据。磁盘控制器通过DMA直接将数据写入内核的内存缓冲区,不需要主CPU进一步帮助。当请求read()操作时,一旦磁盘控制器完成了缓存的填 写,内核从内核空间的临时缓存拷贝数据到进程指定的缓存中。

有一点需要注意,在内核试图缓存及预取数据时,内核空间中进程请求的数据可能已经就绪了。如果这样,进程请求的数据会被拷贝出来。如果数据不可用,则进程被挂起。内核将把数据读入内存。

虚拟内存

你可能已经多次听说过虚拟内存了。让我再介绍一下。

所有现代操作系统都使用虚拟内存。虚拟内存意味着人工或者虚拟地址代替物理(硬件RAM)内存地址。虚拟地址有两个重要优势:

  1. 多个虚拟地址可以映射到相同的物理地址。
  2. 一个虚拟地址空间可以大于实际可用硬件内存。

在上面介绍中,从内核空间拷贝到最终用户缓存看起来增加了额外的工作。为什么不告诉磁盘控制器直接发送数据到用户空间的缓存呢?好吧,这是由虚拟内存实现的。用到了上面的优势1。

通过将内核空间地址映射到相同的物理地址作为一个用户空间的虚拟地址,DMA硬件(只能访问物理内存地址)可以填充缓存。这个缓存同时对内核和用户空间进程可见。


这就消除了内核和用户空间之间的拷贝,但是需要内核和用户缓冲区使用相同的页面对齐方式。缓冲区必须使用的块大小的倍数磁盘控制器(通常是512字节的磁盘扇区)。操作系统将其内存地址空间划分为页面,这是固定大小的字节组。这些内存页总是磁盘块大小的倍数和通常为2倍(简化寻址)。典型的内存页面大小是1024、2048和4096字节。虚拟和物理内存页面大小总是相同的。

内存分页

为了支持虚拟内存的第2个优势(拥有大于物理内 存的可寻址空间)需要进行虚拟内存分页(通常称为页交换)。这种机制凭借虚拟内存空间的页可以持久保存在外部磁盘存储,从而为其他虚拟页放入物理内存提供了空间。本质上讲,物理内存担当了分页区域的缓存。分页区是磁盘上的空间,内存页的内容被强迫交换出物理内存时会保存到这里。

调整内存页面大小为磁盘块大小的倍数,让内核可以直接发送指令到磁盘控制器硬件,将内存页写到磁盘或者在需要时重新加载。事实证明,所有的磁盘I/O操作都是在页面级别上完成的。这是数据在现代分页操作系统上在磁盘与物理内存之间移动的唯一方式。

现代CPU包含一个名为内存管理单元(MMU)的子系统。这 个设备逻辑上位于CPU与物理内存之间。它包含从虚拟地址向物理内存地址转化的映射信息。当CPU引用一个内存位置时,MMU决定哪些页需要驻留(通常通过移位或屏蔽地址的某些位)以及转化虚拟页号到物理页号(由硬件实现,速度奇快)。

面向文件、块I/O

文件I/O总是发生在文件系统的上下文切换中。文件系统跟磁盘是完全不同的事物。磁盘按段存储数据,每段512字节。它是硬件设备,对保存的文件语义一无所知。它们只是提供了一定数量的可以保存数据的插槽。从这方面来说,一个磁盘的段与 内存分页类似。它们都有统一的大小并且是个可寻址的大数组。

另一方面,文件系统是更高层抽象。文件系统是安排和翻译保存磁盘(或其它可随机访问,面向块的设备)数据的一种特殊方法。你写的代码几乎总是与文件系统交互,而不与磁盘直接交互。文件系统定义了文件名、路径、文件、文件属性等抽象。

一个文件系统组织(在硬盘中)了一系列均匀大小的数据块。有些块保存元信息,如空闲块的映射、目录、索引等。其它块包含实际的文件数据。单个文件的元信息描述哪些块包含文件数据、数据结束位置、最后更新时间等。当用户进程发送请求来读取文件数据时,文件系统实现准确定位数据在磁盘上的位置。然后采取行动将这些磁盘扇区放入内存中。

文件系统也有页的概念,它的大小可能与一个基本内存页面大小相同或者是它的倍数。典型的文件系统页面大小范围从2048到8192字节,并且总是一个基本内存页面大小的倍数。

分页文件系统执行I/O可以归结为以下逻辑步骤:

  1. 确定请求跨越了哪些文件系统分页(磁盘段的集合)。磁盘上的文件内容及元数据可能分布在多个文件系统页面上,这些页面可能是不连续的。
  2. 分配足够多的内核空间内存页面来保存相同的文件系统页面。
  3. 建立这些内存分页与磁盘上文件系统分页的映射。
  4. 对每一个内存分页产生分页错误。
  5. 虚拟内存系统陷入分页错误并且调度pagins(页面调入),通过从磁盘读取内容来验证这些页面。
  6. 一旦pageins完成,文件系统分解原始数据来提取请求的文件内容或属性信息。

需要注意的是,这个文件系统数据将像其它内存页一样被缓存起来。在随后的I/O请求中,一些数据或所有文件数据仍然保存在物理内存中,可以直接重用不需要从磁盘重读。

文件锁定

文件加锁是一种机制,一个进程可以阻止其它进程访问一个文件或限制其它进程访问该文件。虽然名为“文件锁定”,意味着锁定整个文件(经常做的)。锁定通常可以在一个更细粒度的水平。随着粒度下降到字节级,文件的区域通常会被锁定。锁与特定文件相关联,起始于文件的指定字节位置并运行到指定的字节范围。这一点很重要,因为它允许多个进程协作访问文件的特定区域而不妨碍别的进程在文件其它位置操作。

文件锁有两种形式:共享和独占。多个共享锁可以同时在相同的文件区域有效。另一方面,独占锁要求没有其它锁对请求的区域有效。

流I/O

并非所有的I/O是面向块的。还有流I/O,它是管道的原型,必须顺序访问I/O数据流的字节。常见的数据流有TTY(控制台)设备、打印端口和网络连接。

数据流通常但不一定比块设备慢,提供间歇性输入。大多数操作系统允许在非阻塞模式下工作。允许一个进程检查数据流的输入是否可用,不必在不可用时发生阻塞。这种管理允许进程在输入到达时进行处理,在输入流空闲时可以执行其他功能。

比非阻塞模式更进一步的是有条件的选择(readiness selection)。它类似于非阻塞模式(并且通常建立在非阻塞模式基础上),但是减轻了操作系统检查流是否就绪准的负担。操作系统可以被告知观察流集合,并向进程返回哪个流准备好的指令。这种能力允许进程通过利用操作系统返回 的准备信息,使用通用代码和单个线程复用多个活动流。这种方式被广泛用于网络服务器,以便处理大量的网络连接。准备选择对于大容量扩展是至关重要的。

到此为止,对这个非常复杂的话题有一大堆技术术语。


深入浅出零拷贝技术:高性能IO的底层原理与Java/Linux实战 零拷贝技术通过减少数据拷贝和上下文切换次数,成为高性能IO的基石。本文通过Java和Linux的实战示例,揭示了其底层原理和应用场景。掌握零拷贝,你将能够轻松应对高并发、大流量场景下的性能瓶颈!技术拓展:进一步学习Kafka的日志存储设计或Netty的FileRegion实现,深入理解零拷贝在开源框架中的应用。 阅读详情

相关推荐

更新3ds时和用读卡器读取传输文件操作不当导致的tf卡损坏无法读取需要格式化时出现的问题以及不想丢失文件并且修复的详细解决方法

前言: 不小心按了同意更新而且tf/sd卡损坏导致了3ds打开后都是出现 Anerror has occurred:(红色的) Failed to apply 1 FIRM patch(es). Press any button to shotdown 这样的画面,按了任意键后就关机,我找了很多资料和大佬的回答解决了这些问题,现在记录一下。 一.不小心按了更新导致上述的画面 原因:是因为系统升级了,但是里面的Luma3DS还没有更新,属于是更新了但没有完全更新的状态。 **修复方法** 1.首先请按

give_me_fish的博客 1万+

java的IO模型和IO多路复用的底层原理(select,poll,epoll)

IO多路复用的引入思路 首先针对于服务器而言,如果客户端有多个请求的解决方案? 方案1,最直接最简单的实现就是创建多个线程来对应多个请求,提高请求的处理速度,但是一些特定的场景下,由于多个线程之间来回的上下文切换,会导致系统开销加大 方案2,使用单线程,使用单线程来处理的话,可以避免多个线程之间来回的切换,如redis就是单线程的,底层是一个文件事件处理器,采用io多路复用模型,有多个socket来对请求进行监听,当有多个socket都有请求来的时候,需要判断哪些socket有请求,需要针对有请求的soc.

m0_56184347的博客 1919

fMRI原始数据分割的笔记

好记性不如烂笔头_fMRI小白入门笔记

ZY_brain的博客 2895

Java IO 底层原理

引言 一提到 IO,就绕不开对 page cache(页缓存)的讨论,页缓存是操作系统为了提升磁盘读写性能在应用进程与磁盘之间加设的提供预读和异步刷盘机制的内核缓冲区。java 的 IO 操作是建立在操作系统的 IO 之上的,从最基础的 read/write 系统调用,到具有零拷贝特性的 sendfile、mmap,在 java 中都能看到它们的身影。本文的主要目的是纵观全局,鸟瞰 java IO 体系,并指出每种 IO 方式的特点与使用场景。整篇文章会围绕下图作分步讲解,为了简单起见,这里主要以写操作为例

海为龙世界,云是鹤家乡 2956

RKNN3588——YOLOv8的PT模型转RKNN模型

1. 首先克隆rknn修改后的ultralytics版本项目到本地主要是修改了源码的ultralytics/nn/modules/head.py和ultralytics/engine/exporter.py两个文件。2. 使用修改后的ultralytics对pt模型进行模型转换,此处的format=rknn代表支持rknn后续的转换,而不是用onnx,一定要注意!!!

张飞飞的博客 7165

某盾blackBox逆向——纯算

某盾blackBox逆向——纯算

Lzyydsb的博客 5891

IO 基本概念

IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的...

qq_27061805的博客 731

交换芯片数据通路四大核心微架构深度解析

数据通路是交换芯片性能的物理根基,决定着低延迟、高吞吐与突发承载能力。其本质是在硅片约束下对带宽、时序、功耗与统计复用的系统性权衡。Crossbar提供确定性低延迟但受RC延迟与功耗制约;VOQ通过虚拟队列隔离输出争抢,却引入仲裁复杂度与内存开销;Shared Buffer依托统计复用提升缓存利用率,但面临碎片化与管理策略挑战;Cell Fabric以固定长度cell重构交换粒度,在AI与金融等小包敏感场景实现尾延迟稳定。这些架构并非替代关系,而是面向不同网络不确定性(如流量不对称性、突发强度、包长分布)的

weixin_32667955的博客 189

IO 的底层实现问题

底层IO操作涉及到的一些知识。

hapjin的专栏 6309

ROS2理论与实践_宇树机器人Go2开发指南(文字)

本文介绍了Unitree Go2机器人ROS2开发环境的安装与配置流程。主要内容包括:1)从GitHub克隆unitree_ros2仓库;2)安装ROS2 Foxy版本依赖项;3)编译特定版本的CycloneDDS(0.10.2);4)编译unitree_go和unitree_api功能包;5)网络配置,包括设置静态IP和修改环境变量脚本setup.sh以指定网络接口。文章还提供了本地回环测试的替代方案,并建议配置完成后重启电脑。整个流程涉及ROS2环境切换、网络适配和编译安装等多个技术环节。

Li_Dongyi的博客 4203

3、★☛基于STM32的手机通过wifi控LED灯√♠★

3、基于STM32的手机通过wifi控LED灯 文章目录3、基于STM32的手机通过wifi控LED灯1、Introduce介绍1.1、课题背景及其意义1.2、 国内外的研究状况2、方案的设计2.1、控制方案的确定2.2、控制方式的选择2.2.1、 单片机芯片的选择方案一方案二方案三方案四2.2.2、无线遥控模块的选择方案一方案二方案三3、硬件电路的设计3.1、系统的功能分析及体系结构设计3.1.1、系统功能分析3.1.2、系统总体结构3.2、模块电路的设计3.2.1、 STM32单片机核心电路设计3.2.

行走的皮卡丘 2959

java基础_IO底层原理

java基础_IO底层原理

dongkang123456的博客 393

一文搞懂 JavaScript 模块化规范:CommonJS、AMD、ES6 Module

在现代 JavaScript 开发中,模块化是提升代码组织性和可维护性的关键。本文深入解析三种主流的模块化规范——CommonJS、AMD 和 ES6 Module。

Allen- 3476

java io底层原理_IO的底层原理介绍

最近在看 JAVA NIO 的相关知识,了解一下IO的底层实现原理。IO涉及到的底层的概念大致如下:1) 缓冲区操作。2) 内核空间与用户空间。3) 虚拟内存。4) 分页技术。一,虚拟存储器虚拟存储器是硬件异常(缺页异常)、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。虚拟存储器的三大能力:①将主存看成是一个存储在磁盘上的地址空间的高速缓存。...

weixin_36364419的博客 431

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java io底层原理_彻底搞懂 IO 底层原理

武侠小说里有很多的“心法”和“招式”。计算机技术里的“心法”和“招式”呢,我们可以简称为“道”和“术”;“道”最基础的计算机理论,隐藏于表象之下,非常抽象、晦涩难懂,需要用具象化的事物加以理解;“术”具体的技艺,它有可能是一门语言,比如:python 出手见效快;我们今天要给大家讲的底层的IO就属于“道”的范畴,看上去简单,实则抽象。并且在它之上衍生出了语言层面用于实战的技术,比如我们熟悉的ja...

weixin_39843677的博客 277

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java中的流和IO操作及底层实现原理

Java中的流和IO操作的底层实现原理主要依赖于操作系统提供的API和JVM的内存管理机制,涉及到硬件、驱动程序、操作系统和JVM的多个层面。在实际开发中,我们可以根据具体的应用场景和需求选择合适的IO方式和优化策略,通过调用这些API和合理地使用JVM的内存,我们可以实现高效的数据传输和处理。以充分利用底层资源的性能优势。然后,当我们从输入流中读取数据或向输出流中写入数据时,JVM会根据流的类型(字节流或字符流)和缓冲区设置,调用操作系统的文件读取或写入函数,将数据从文件传输到内存,或从内存传输到文件。

编程小弟的博客 1221

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

java io底层原理_高并发io底层原理

一、io读写的基础原理用户程序的IO读写程序,在大多数情况下,并没有进行实际的IO操作,而是在进程缓冲区和内核缓冲区之间直接进行数据的交换。用户程序进行IO的读写,依赖与底层的IO,通过调用底层的read&write两大系统。read&write系统数据写入读取都是与缓冲区进行数据交换,操作系统中有许多的缓冲区,多是为了减少与设备之间的物理交换。外部设备的读写都涉及到操作系统的中断...

weixin_39958559的博客 193

Java IO操作底层原理

10分钟看懂, Java NIO 底层原理 - 疯狂创客圈 - 博客园

流苏打的博客 261

io操作是指什么_Java NIO--(1)高并发IO的底层原理及4种主要IO模型

Java NIO 系列文章高并发IO的底层原理及4种主要IO模型Buffer的4个属性及重要方法IO读写的原理大家知道,用户程序进行IO读写,依赖于操作系统底层的IO读写,基本上会用到底层的read&write两大系统调用。 这里涉及一个基础的知识:read系统调用,并不是直接从物理设备把数据读取到内存中,write系统调用,也不是把数据直接写入到物理设备上层应用无论是调用操作系统的rea...

weixin_39597262的博客 307

【IO专栏】Java IO 分析之高并发IO的底层原理【001】

大家都知道,用户程序进行IO的读写,依赖于底层的IO读写,基本上会用到底层的read&write两大系统调用。在不同操作系统中,IO读写的系统调用的名称可能完全不一样,但是基本功能是一样的。 这里涉及到一个基础的知识点:read系统调用,并不是直接从屋里设备把数据读取到内存中;write系统调用,也不是直接把数据写入到物理设备。上层应用无论是调用操作系统的rad,还是调用操作系统的wri...

x734400146的专栏 348

java io 底层_彻底搞懂 IO 底层原理

武侠小说里有很多的“心法”和“招式”。计算机技术里的“心法”和“招式”呢,我们可以简称为“道”和“术”;“道”最基础的计算机理论,隐藏于表象之下,非常抽象、晦涩难懂,需要用具象化的事物加以理解;“术”具体的技艺,它有可能是一门语言,比如:python 出手见效快;我们今天要给大家讲的底层的IO就属于“道”的范畴,看上去简单,实则抽象。并且在它之上衍生出了语言层面用于实战的技术,比如我们熟悉的ja...

weixin_35231842的博客 898

java控制底层io口_如何实现IO的底层原理问题

最近在看 JAVA NIO 的相关知识,了解一下IO的底层实现原理。IO涉及到的底层的概念大致如下:1) 缓冲区操作。2) 内核空间与用户空间。3) 虚拟内存。4) 分页技术。一,虚拟存储器虚拟存储器是硬件异常(缺页异常)、硬件地址翻译、主存、磁盘文件和内核软件的***交互,它为每个进程提供了一个大的、一致的和私有的地址空间。虚拟存储器的三大能力:①将主存看成是一个存储在磁盘上的地址空间的高速缓存...

weixin_42696271的博客 137

Java基础-12:Java IO深度解析与避坑指南:从底层原理到BIO NIO AIO实战

Java IO是Java处理数据输入输出的核心机制,通过流(Stream)抽象实现数据的读写操作。其核心思想是将数据源和目标(如文件、网络、内存等)统一抽象为流,通过流机制实现数据的传输

beata88的专栏 683

IO底层原理与Java NIO

IO流程示意图 客户端发送数据来到服务器,建立好sokcet连接再到应用程序拿到这个数据可以分为两个步骤 因为应用程序是没办法直接去网卡读取数据的,应用程序向OS内核发起read调用 1.数据准备(输入流从网卡来到OS内核空间) 2.数据拷贝(从内核空间拷贝到用户空间) 根据应用程序接收结果的通知方式分为 同步和异步。简单理解:同步就是应用程序发起read调用之后就一直等待结果,异步就是应用程序先去做其他事,等待内核程序 根据调用者(client)的影响分为 :阻塞和非阻塞。 两类情况总共组合出5种IO模

xsjzn的博客 187

java io底层原理_小师妹学JavaIO之:try with和它的底层原理

标签:mamicode使用hrefwaterlearndde资源ide遇到目录简介IO关闭的问题使用try with resourcetry with resource的原理自定义resource总结简介小师妹是个java初学者,最近正在学习使用java IO,作为大师兄的我自然要给她最给力的支持了。一起来看看她都遇到了什么问题和问题是怎么被解决的吧...

weixin_33613462的博客 82
上一篇: Java程序员的十个调试技巧
下一篇: Eclipse实用快捷键个人总结
CoderBruis
博客等级 码龄10年 4444粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值