作为一名不懂基础,直接游荡在编程行业多年的老菜鸡,也深知基础不牢地动山摇的道理,可能再回过头反哺基础会有一些不一样的感觉吧
所以前段时间花了大约2周的时间,恶补了一下操作系统相关的知识
进程、线程
首先是对于 进程,线程的理解,再看完操作系统后,总算是明白了 用户态和内核态到底是个什么东东,也明白了大量的线程切换为什么会慢,也算是理解了,面试时那些回答死套路的答案为什么这么讲
同时在也理解了线程之间共享数据的底层实现方案
在进程方面,进程之间的数据同步包括什么缓冲、管道什么的,一眼就很熟悉-这不就是各种中间件Kafka mq 的老祖宗嘛,刚开始接触kafka 时,感觉哇中间件异步这玩意是谁研究的捏,其实这玩意在几十年前就有了原型
再到信号量、管程,曾经看过一个大佬优化过的美团leaf 源码,用的就是信号量代替的定时线程池,这个看起来很亲切
内存管理
后面内存、外存、交换区、高速缓存、寄存器等,也是深度理解了使用原理,如果不懂的可以带入redis 和 本地cache 做对比,一步比一步快,一步比一步成本高,还比较好理解
在内存寻址上 也对于位运算有了深刻理解,也见识到了运用场景,比如 p = a >> 12; w = a & (4096 - 1)
等,
同时也理解了当时见过的一段时间轮算法中的源码
int count = 0, base = 2 << 5;
for(;;){
int index = count++ & base - 1;
}
在内存结构上什么 页表、段表、段页表的设计也很哇塞,后续没准就能运用到实际开发中数据结构的设计上
在学到内存的页表对应物理内存页4k是,忽然联想到mysql 的b+tree, 虽然有些牵强,但也感觉看到了mysql 的影子,甚至一度怀疑这玩意也是mysql 索引存储结构的老祖宗
文件系统
至于文件系统,感触颇深的则是它对于文件管理存储的树形结构和属性表概念
IO管理
IO设备的话,终于理解了为什么在java 也好 mysql 也罢,io的开销为啥子慎之又慎,各种 通道表 设备控制表 设备表等等 都在去抢状态,虽然引入了缓冲池等技术优并行一些操作,但设备终究还是那几个抢不到的还就得等着
同时在io 缓存这一块,看似和Mq一样,其实使用的是它异步可并行的概念,同样保护的不是io 设备,而是解决cpu和io设备执行力不对等的问题,也算是使用异步向上保护
结语
总之,学完操作系统的收益是非常巨大的,现在技术迭代再快,也万变不离其宗。操作系统、组成原理、网络原理、数据结构和算法是永远的神,加油吧