跳至主要內容

Java IO 模型常见面试题总结

Siona大约 2 分钟

Java IO 模型常见面试题总结

面试中经常喜欢问的一个问题,因为通过这个问题,面试官可以顺便了解一下你的操作系统的水平。 IO 模型这块确实挺难理解的,需要太多计算机底层知识。

一、前言

二、何为 I/O ?

I/O(Input/Output)即输入/输出。

1. 从计算机结构的角度解读 I/O

根据模型。计算机结构分为 5 大部分:运算器、控制器、存储器、输入设备、输出设备。

冯·诺依曼 模型.png
冯·诺依曼 模型.png

输入设备(比如键盘)和输出设备(比如显示屏)都属于外部设备。网卡、硬盘这种既可以属于输入设备,也可以属于输出设备。

输入设备向计算机输入数据,输出设备接收计算机输出的数据。

2. 从应用程序的角度解读 I/O

根据大学里学到的操作系统相关的知识:为了保证操作系统的稳定性和安全性,一个进程的地址空间划分为用户空间(User space)和 内核空间(Kernel space)。

像我们平常运行的应用程序都是运行在用户空间,只有内核空间才能进行系统态级别的资源有关的操作,比如文件管理、进程通信、内存管理等等。 也就是说,我们想要进行 IO 操作,一定要依赖内核空间的能力。

并且,用户空间的程序不能直接访问内核空间。

当想要执行 IO 操作时,由于没有执行这些操作的权限,只能发起系统调用请求操作系统帮忙完成。

因此,用户进程想要执行 IO 操作的话,必须通过 系统调用 来间接访问内核空间。

我们在平常开发过程中接触最多的就是 磁盘 IO (读写文件)和 网络 IO(网络请求和响应)。

从应用程序的角度来看,我们的应用程序对操作系统的内核发起 IO 调用(系统调用),操作系统负责的内核执行具体的 IO 操作。 也就是说,我们的应用程序实际上只是发起了 IO 操作的调用而已,具体 IO 的执行是由操作系统的内核来完成。

当应用程序发起 IO 调用后,会经历两个步骤:

(1)内核等待 IO 设备准备好数据 (2)内核将数据从内核空间拷贝到用户空间