这个问题是看面试内容引起的,很多总结都提到“大厂”特别是后端开发的面试以三大块内容为主:操作系统、网络和数据结构与算法。
操作系统的内容我觉得可以粗略总结成两种:一种是对操作系统涉及的基本概念和实现原理的了解,比如进程间通信、任务调度、内存管理、避免锁死等;另一种是对特定操作系统及上面脚本语言的了解,主要是Linux/Unix类的。
揣度一下“操作系统”重要性吧,前一方面的知识可以迁移或直接对接到软件开发,因为软件开发很大一部分是对接硬件和广义的“资源”问题的,Java虚拟机与内存部分的密切关系。参考
当你设计一个: 业务复杂 OR 数据量大 OR 访问量大 OR 响应时间短的系统,你会发现你就是在设计一个操作系统。
为什么要学操作系统? - 软件园的猪的回答 - 知乎
https://www.zhihu.com/question/26709017/answer/33804584
等回答,操作系统在这方面的意义是跟网络对接的,我在浏览Abraham Silberschatz的Operating System Concepts时候就有感觉:很多说的是不是都是计算机网络上的事情?
而后一方面知识可能是对接开发过程中使用操作系统的需要,比如服务器的操作系统多是Unix类的操作系统,一般公司都要求开发人员技能范围广,搞前端的也应该了解服务器端发生的事情以便于交互,安卓更是基于Linux
。
学操作系统的针对性确定在软件开发上。
如果上面的猜测没有错误,那我觉得目前流行的教程普遍都与实践有较大距离。一个问题是很多教程中硬件原理部分仍然篇幅大,而且基于特定硬件特征,但目前容器技术得到很大发展,一些“系统资源调度”的问题已经脱离了(尤其是单机的)硬件底层「不对的话请指正」。第二个问题是太理论化,缺少通过编程掌握核心思想的机会;有一些教程特意提供了相关问题的编程练习,但设想的情形非常复杂,缺少面试习题的那种输入-输出一贯的格式。
我们现在处于无时无刻不互联的时代,鉴于操作系统与网络系统的密切联系我探讨这样一个观点:操作系统学习理想的情况下是以学操作系统原理「辅以编程练习」为主,Linux的操作之类的放到网络部分作为应用层的东西一起学习避免跟网络其他部分脱节。之前单机/原生app向移动端转移的趋势如此明显「几个公司还在招开发windows桌面程序的了?」参考[2]以及刚才提到的容器化趋势,操作系统的学习内容应该集中于“操作系统发展过程中形成的对软件开发运维通用的设计原理和算法”。
在这种情况下选择合适的学习方法并不容易。
大家看这个经典的文曲星,现在还有卖的[3],我今天早晨突然想到能不能通过设计一个微型的虚拟机「确切说可能是容器」在Java上运行,做一个比最后一张图(学习—数码—工具,学习:背单词、宋词。。。)还简单的软件,包括GUI和建立在Java虚拟机上的后台程序,通过这个全面领会操作系统的原理呢?
前辈们如何看操作系统知识在软件开发和运维中的作用?以及如何学习?
ps 写完之后查了一下发现早已有从操作系统角度分析浏览器,在Chromebook产生前就有人讨论[4][5],从前端和交互的角度探索操作系统原理看起来更有趣一些。[6]
参考
[1] 为什么要学操作系统?https://www.zhihu.com/question/26709017
[2] 浅谈物联网操作系统选择,浏览器比安卓更合适 https://moore.live/news/201021/detail/
[3] 电子词典E928 http://www.ggv.com.cn/cn/pro_intro.php?bid=223&pid=63
[4] https://www.zhihu.com/question/27155445
[5] https://www.techdirt.com/articles/20080530/0022021266.shtml
[6] 前端入门操作系统知识,这一篇就够啦 https://juejin.im/post/5e52924e51882549274a51e3