Java 文件读写原理和虚拟内存,面试阿里
| --- | :-- |
| 用户空间 | 是非特权区域,在该区域执行的代码不能直接访问硬件设备,常规进程就在本区域执行,JVM 就是常规进程,所以 JVM 进程驻守在用户空间 |
| 内核空间 | 是操作系统所在区域,有特别的权利:能与设备控制器通讯,控制着用户区域进程的运行状态等等,最重要的是,所有 I/O 都直接或间接的通过内核空间 |
[](()2.普通 IO 操作
======================================================================
了解了用户空间和内核空间的概念和作用后我们来看下普通 IO 的执行原理。
根据上图,当进程请求一个 I/O 操作,它会执行一个系统(open() , read() , writer() , close())调用将控制权移交给内核。当内核以这种方式被调用,它随即采取任何必要步骤,找到进程所需数据,并把数据传送到用户空间内指定的缓冲区中,这时常规进程就可以对缓冲区中的数据处理操作了,而内核试图对数据进行高速缓存或预读取,因此进程所需数据可能已经在内核空间里了,如果是这样,该数据只需 Java 开源项目【ali1024.coding.net/public/P7/Java/git】 简单地拷贝出来即可,如果数据不在内核空间,则进程被挂起,内核着手把数据读进内场。
[](()问题
数据从内核空间拷贝到用户空间似乎多余,为什么不直接让磁盘把数据送到用户空间的缓冲区呢?
硬盘通常不能直接访问用户空间
磁盘基于块存储的硬件设备操作的固定大小的数据块,用户进程请求的可能是任意大小或者非对齐的数据块,在这两者数据交互过程中内核负责数据的分解、再组合工作,起到一个中间人的角色。
[](()3.虚拟内存
====================================================================
通过上面的介绍,我们知道当应用程序需要读取文件的时候,内核首先通过 DMA 技术将文件内容从磁盘读入内核中的 buffer,然后 Java 应用进程再从内核的 buffer 将数据读取到应用程序的 buffer。也就是有两次的文件复制,为了提升 I/O 效率和处理能力,操作系统采用虚拟内存的机制。虚拟内存意为使用虚假(或虚拟)地址取代物理(硬件 RAM)内存地址。这样做好处颇多,总结起来可分为两大类:
一个以上的虚拟地址可指向同一个物理内存地址。
虚拟内存空间可大于实际可用的硬件内存
这样做的好处是省去了内核与用户空间的往来拷贝。
[](()3.1 一个以上的虚拟地址可指向同一个物理内存地址
总结
我个人认为,如果你想靠着背面试题来获得心仪的 offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。
这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。
大家可以把 Java 基础,JVM,并发编程,MySQL,Redis,Spring,Spring cloud 等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:
希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的 offer,加油,打工人!
评论