昨天小组的同学一起吃饭回来路上讨论了一下I/O,希望能带不了解的同学入门

98 阅读4分钟

「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」。

I/O这个名词,所有的研发同学可太熟悉了,因为我们做的工程项目80%的时间都是在跟I/O打交道,存了读,读了存,就把各种需求给做了。I/O也是我们做工程项目优化的一个重要领域,深入的了解一下I/O,是我们做好系统和系统优化的基础。

先说操作系统层面及以下的I/O,这部分I/O主要涉及的是CPU通过南北桥代理走总线向各种I/O设备的驱动发出指令读写数据。各种硬件设备的驱动程序获得指令后,依据指令把指定的数据写入自己或把指令需要的数据向外输出。因为计算机的核心数据交换是发生在主存当中,所以基本上大概流程就是CPU告诉代理,代理通知A设备,你把数据写到x地址的主存里,写完之后通知我。

这里涉及到计算机组成原理里的一个重要概念“主频” 和 操作系统里的一个重要概念“中断”,主频决定了设备I/O的效率,多少个时钟时间才能做完数据读写,完事之后通过“中断”信号告诉CPU可以用了。

找了个图(图例里写的是磁盘,换成网卡键盘都差不多),大概就是这样子:

image.png

然后关键的来了,我们知道操作系统原理里有介绍,运行时是有两种状态的,“内核态”和“用户态”,我们写的工程项目是运行在用户态的一个进程/线程,刚才CPU控制下I/O到的数据是在内核态中,而应用程序在初始化之处,就会独立分配一块内存空间,所以应用程序想要用这部分数据,是要操作系统再copy给你的应用程序才行。 这也是为什么操作系统和很多Server服务工具提供“sendfile”配置,就是为了减少这次拷贝进而优化I/O效率。

至此,你写的程序才算真正的完成了读取操作,写操作也是类似的过程(有逆向的部分,比如操作系统先从应用程序进程内获取数据再去写目标设备的缓冲区等)。

可能读到这里的同学有问题了,了解这玩意儿有啥用呢?这不都是“八股文”吗?做为有丰富辅导经验的老程序员了,这点当然不会略过去,还是要说一下的。

1、知道了主频,你就知道了I/O设备的自身效率是有差异的,差异的点就在于一个I/O动作需要多少个时钟,他们之间可能是十倍百倍千倍的差异,这样你在设计工程实践的时候,有意的要用效率更高的I/O设备。

2、知道了操作系统I/O过程,你就知道了原本黑盒的数据流转,相对的就透明了,你能根据自身业务需求做更高效的I/O方案设计,减少I/O次数或不必要的流程等。

3、是你晋升技术专家的不二法门。你要知道你的系统瓶颈是什么,整个I/O流程中的各个环节,都可能是你要考虑打破瓶颈的点,但凡你能打破底层的性能瓶颈,那你基本上就是这个部分的技术专家了。

4、认知提升,从原理学习永远是最高效的方式,没有之一,因为太容易触类旁通举一反三了。

5、做事情没有黑盒部分,自己的掌控感更高,更自信,更从容,也会为了解了真相更开心。

#今日份十分钟#希望能带你了解I/O,同时不要对“八股文”再有那么大的反感情绪了,加油冲同学们!每天前进三十公里!