『阿男的工程世界』*让我们简单聊一下IO(01)*
在计算机的世界里,可能最复杂的不是计算,而是IO
。为什么这么讲?因为IO意味着和外部世界打交道,这就需要理解和处理外部世界的复杂。
CPU并不是纯计算单元,它要和内存打交道,要和各种外部设备打交道。这些外部的硬件,基本上没有在时钟频率,也就是速度上能跟得上CPU的。
此外,CPU很忙,不但要负责运算,还得负责处理各个外部设备发过来的信号,通过这些信号,去执行相关的handler
。
所有这些实际的问题,带来了硬件设计方面的复杂,和IO设计的复杂,当然还有操作系统的复杂。所有的设计都是平衡的结果,而并没有所谓完美的解决方案。
阿男有时候在想,如果不系统学习操作系统和CPU架构,以及引申出来的硬件系统组成,能真正把编程学好吗?阿男自己觉得是不行的,必须要系统全面地学习好基础知识,才能够对写代码这件事情有深入了解。
而且除非你只做不需要考虑任何和实际的操作系统本身打交道的工作,那么一定会接触到硬件接口层面的。
拿Java
举例吧,阿男手里这本Java NIO
:
开篇要求你的预备知识:
包括:Kernel vs. User Space
,Virtual Memory
,Paging
,Block IO vs. Stream IO
,Multiplexed IO
。这些全部是操作系统相关,如果你只会Java
,想学习NIO
,那就是废的。
当你的程序需要用到IO
的时候,就是你要学习操作系统和硬件架构的时候。考虑这一块的时候,我们可以想想在设计上面有什么要考虑的。