I/O管理部分
自古以来计算机的外围设备花样繁多,鸿蒙更是可以把万物加入作为它外设。外设本身各有物理机械电子。。。的特点,但是当它们接入计算机后,都有一个共同特征,就是都挂接在总线上,所以,如果从内存或者cpu的角度看,这些花样繁多的外设实际上就做一件事情:内存与外设之间来回搬运各种数据。
这些外设与内存间的数据搬运工作在方法上、粒度上、顺序上等等各有特征,比如,往显示器搬运的是字符单位,而往硬盘搬运的单位是块。如果这些具体的搬运工作全部交给应用程序的话,会增加不必要的应用层程序员负担,比如显示一行文字,程序A希望显示“hello world”,程序B希望显示“hello china”,程序C希望显示“hello school”,每个程序在显示前都要做好显示器光标位置定位调整、显示字符大小颜色调整,显示背景调整。。。。从社会分工来说,没必要,不如做一个封装,把这些调整工作都交给一个底层程序,应用程序只是告诉底层程序自己要显示什么就可以了。
因此显示某个句子就可能变成如下的封装函数:printf(“hello world”),我们看,这个封装不关心显示器的各种特性,只是说了两件事:1、显示;2、显示什么。
接着,程序A希望往硬盘写数据,程序B希望往打印机写数据,程序C希望往某usb设备写数据,虽然写的数据内容可能各不相同,但是从内存看,都是做一件事情:往外设写数据。那么如果把这些写数据也做个封装,应用程序就是注明往什么设备写、写什么 就可以了,剩下的交给这个封装程序,那么会节约一部分应用程序的成本,以更有效完成应用程序本身应该完成的任务,符合社会分工原则。
所以,从内存往外设写这件事情就可以被封装成这样的函数供应用程序调用:write(某设备/文件,“hello world”)。我们看到这里应用程序需要知道的就是三件事:1、往外写;2、写那个设备/文件;3、写什么。剩下的事情交个这个封装的函数去做,很像领导告诉秘书说,去,把。。。给我搞定。
以上这两个层次的封装,基本上就是操作系统IO部分做的大事情。
做个总结,第一节说的操作系统模型就演化成下面更具体的模型。