因为很多朋友还是会咨询 Android 相关的内容,于是便花费了一些时间,把我总结的方法,一些系统代码的跟踪流程,做一个完整的梳理, 算是给自己职业生涯画个完美的句号。
虽然说后续写代码会相对少一些,但是还是会输出一些教程,将我的其他领域的学习过程,策略分享出来。
这是第三个专题,我们聊下操作系统,前两个专题是,安卓系统知识点学习策略,以及音视频学习方法(代码部分参考网络,串联知识体系),希望大家喜欢。
–写于 2021 年 11 月 1 号夜
作者:陆晓明
程序员高手必备技能
很多人有疑问,说为什么工作多年,还是没有长进?除了会一些 API,多记住了一些解决方
法,但是面对新的问题,还是一筹莫展?
原因在哪里,跟高手的区别在哪里?在我的培训课程里面,我喜欢讲的是原理,并且用例子
来剖析,从而让大家明白,知道它的来龙去脉。
那么,高手真正的本领是什么?
总结来讲分为几部分:
1 框架思维
2 迁移能力
3 学习能力
框架思维在我的训练营里,给大家会反复来讲。这里主要就是,你在面对新的问题,新的需
求的时候,是否先按照框架思考。
举个例子:蓝牙传输过程中经常会断开。
原因是什么,怎么解决?
第一步就是框架思维,一般牵扯到硬件的设备,主要就分为三部分,应用层,框架层,驱动
层。
那么这个就是一个框架,基于这个框架,我们随后就会去迁移。也就是迁移能力。迁移能力
是什么?
就是比如我是做通信模块的,我没有做过蓝牙模块,但是我是否可以通过我通信这块的经验,
去定位到蓝牙的相关代码呢?
这块就是迁移,把自己已知的技能,去跟未知的模块匹配,跟踪验证,调整,从而解决问题。
这个过程就是学习能力。
在我们请教高手的时候,有没发现一点,他们有一个能力,就是一个模型,可以通过询问,
从而初步推论出来,帮助你分析定位。
我们工作当中,实际要掌握的是这些本领。而在这个里面,学习哪块能够训练出来呢?最为
关键的就是操作系统了。
于是,在我的训练营中,操作系统这一环节,我讲的也比较多,也是不涉及代码,但是讲清
楚设计原理,逻辑,然后代码是我们遇见问题后,一起来看。
举例来说, 格式化是什么?
U 盘为什么要格式化才能用呢?
U 盘是一个存储设备,我们要管理这个存储设备,那么就需要一个映射关系,记录下来。这
个格式化过程,就是在硬盘的最前面,占用一段存储,里面用一组结构,将 U 盘的整个区
域管理起来。
说白了就是前面一部分区域,要记录几点,目录信息,文件信息,位置,起始位置,这些表
征完了,文件里面会对应一个起始 block ,然后 block 里面会有一个指向,如果文件很大,
就会指向下一个 block,从而把文件整个存储下来。
当我们刚开始使用 U 盘的时候,存储很快,因为 block 是连续的,当不断地删,改,最终后
面再存储的时候,block 就不是连续的了。所以系统会需要检索,查找下一个空闲 block。
于是,我们会查看碎片空间,进行磁盘整理的动作,目的就是把碎片化减小,方便后续存储,
这块最重要的就是硬盘,因为寻址是机械寻址,如果相邻那么就非常快。
举例来说,我们知道有个内存管理,管理系统内存的,比如我们的学生课程管理,是不是也
是一样,有个结构体。
所以整个总结起来就是,要对某个东西进行管理,就需要一个管理逻辑设计,这个逻辑设计
过程,就是约定的结构,这个结构里面能够表征后面的管理内容,完成管理的动作。
这个就是我们在编程里面常听到的,数据结构,而数据结构是表示一个信息,具体怎么判断,
存储,验证,这个就是设计的算法了。
程序= 数据结构+算法。
数据结构 =头+数据。
算法就是对这个头进行解析,获取数据的过程。
当我们理解到一切都是 数据结构+算法的时候,遇到一个协议,遇到一个设备,都会有个完
整的思路。
第一步,找数据结构,如何设计的。
第二步,找设计的算法,也就是调用的 API。
在应用的场景下,我们拿到 SDK,第一步看什么?
看 Demo,看 sample,熟悉基本用法,找的是 API。
应用场景下,默认将系统的算法当成黑盒,我们关注的是所谓的对外接口,这个是我们使用
的时候,需要调用的。
举例来讲,蓝牙模块。拿到 SDK,我们不去管它内部实现,只需要找到它的连接方式,测试
方式,以及使用手册。
这里就是典型的开发逻辑:对不关注的东西,进行黑盒思维。关注它的对外接口,流程即
可。
最小计算机系统
我们在聊这个之前,说一个比较朴素的概念。输入–控制–输出。对于这个的理解非常重要,
因为这个是所有计算机行为,乃至我们本身的行为都是遵循的。
这个概念用一句话来说就是 :我们把什么用什么做成什么。
设计都是想要的一个结果,依据这个做出的反映。
举例来讲,看电视。输入是什么?电视画面,控制是谁?我们的大脑,输出是,高兴,愤怒。
那么计算机系统,要完成最小化,就需要这几个部分,输入,控制,输出。
那么,计算机最小系统,就是由:
键盘
CPU
显示器
三部分组成。
键盘是输入源,CPU 是处理器,控制端,输出是显示器。
这是最简单的,也是最好理解的,在我们学习操作系统之前,先想明白这点,这块知识可以
通过看看单片机的知识,快速的掌握。
CPU 是个运算器,跟运算器直接相连的是叫做寄存器。
寄存器是运算器,控制器的直接对接入口,也就是外部的数据来了,都是交由寄存器,进入
运算器里面操作。
运算器直接连接的是寄存器,而里面的 PC 寄存器,则指向的是当前运算器运算的这条指令。
这块的知识,可以参考计算机组成原理来掌握。
依据我们之前说的,输入,控制,输出。而输入的数据,该如何被 CPU 拿到呢?这里就是
有了所谓的地址总线。
有地址总线,数据总线,控制总线。完成了,从什么地方,拿什么数据,干什么。
理解了这块,我们继续来说,对硬件进行管理,把它运行起来的这些代码,我们称之为驱动。
整个就是,硬件通过连接到外设上去,系统通过外设连接,对硬件进行寄存器操作,实现一
套对外设的操作方法,这部分就是驱动。
驱动程序一般不会直接让软件调用,因为驱动程序写的比较简单,缺少一些必要的判断逻辑,
所以在这个之外还需要一层包装,就是 API 访问接口。
软件通过调用这个 API,来完成对硬件的操作。
而当我们系统越来越复杂,硬件越来越多,驱动就需要更好的管理,并且软件之间也是需要
协作。
再说软件之前,我们说两个概念,第一个是,硬盘。第二个是内存。
我们写代码,编译成程序之后,是存放在硬盘的。硬盘是存储,掉电后还存在。我们常用的
就是 U 盘,把学习资料复制进去,需要的时候插入电脑,带个耳机就可以欣赏了。
而内存是什么?是掉电就没了。这个内存存在的原因是,硬盘存储介质的速度,远远低于
CPU 执行速度,而内存就是他两的桥梁,速度在这两之间。
所以,就需要将程序加载进入内存,然后执行。
于是我们的系统,现在就是,键盘和其他外设,比如硬盘,鼠标,CPU,内存,软件。
那么现在硬件一多,就需要一套机制,来讲驱动程序统一管理,方便写,以及对上面的软件,
能够做到统一调用。
这套机制里面,需要实现对外设的加载设计,对外设的打断做一个监测,对上层软件进行管
理。
我们把这套机制,叫做操作系统。