宏观层面理解Java IO
什么是IO
简单来说就是输入和输出,体现了数据的流动。从不同的视角来看,IO有不同的解释
直观层面
在日常生活中,键盘鼠标,显示器音响打印机,这些就属于IO设备,人机交互的过程中,需要我们对计算机输入指令,计算机给我们输出内容,声音文字视频等等。
计算机视角
在计算机视角,任何涉及到CPU与内存进行数据交换的,都属于IO,比如磁盘IO,将数据从磁盘里读出来,处理后再写入磁盘;从互联网上获取数据,再吐给互联网,这叫网络IO
程序员编程视角
这里关注的实际上是我们编写的应用程序,也就是进程。为了保证系统的稳定性,进程的地址空间分为用户空间和系统空间,我们平时的程序都是在用户空间,是没办法需求操作系统空间的内容的。所以进程只能向操作系统发起IO调用,IO执行是操作系统的工作。
当应用发起IO调用的时候,会经历两个阶段:
- 内核等待IO设备准备好数据
- 将准备好的数据拷贝到用户空间
上述这个看似简单的过程,可以引申出以下问题:
阻塞还是非阻塞
阻塞的话,就是进程发起IO调用,在内核或者系统准备数据直到将数据准备好拷贝给用户的这段时间里,进程一直等待着,啥事儿也不干。
非阻塞的话,就是发起IO调用之后,进程去做自己的事情,不用一直等待。