这个问题是看面试内容引起的,很多总结都提到“大厂”特别是后端开发的面试以三大块内容为主:操作系统、网络和数据结构与算法。

操作系统的内容我觉得可以粗略总结成两种:一种是对操作系统涉及的基本概念和实现原理的了解,比如进程间通信、任务调度、内存管理、避免锁死等;另一种是对特定操作系统及上面脚本语言的了解,主要是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

    NTL01 前辈们如何看操作系统知识在软件开发和运维中的作用

    不是什么大佬也不是前辈。

    记忆里有两次印象深刻的直接感受,一次是被标准库的缓存坑完,然后去读了一遍APUE的stdio部分的章节。还有就是读别人的开源代码的时候。大概是写一个配置文件或者数据文件之类的,他是先写入到一个temp文件中然后再rename来做一个原子性的写。

    不是大佬也不是什么前辈+1

    我觉得操作系统的学习主要还是从【抽象】的角度去看,计算机是个一层一层抽象下形成的体系。人们希望用计算机做更多更复杂的事情,但这样的复杂度无法由个人有限的认知和精力完全覆盖,所以需要用抽象的手段去建立边界,在层与层之间约定操作的协议和接口。

    从最基本的“计算”开始看,晶体管和数字电路提供了二进制的状态转换功能,把它们集成在一起,就有了集成电路、CPU 这一抽象。有了这一层抽象以后,电路设计交给半导体等硬件厂商,作为使用者的我们就不用关心具体的电路设计,可以把精力放在怎么使用厂商提供的操作指令。这些机器指令的约定合起来,就有了“指令集”,比如说 x86、x86-64、ARM。

    直接使用指令集一样也很复杂,且很不直观。为了方便描述,就有了“汇编语言”这一层抽象,设计了汇编语言的语法(两大流派:AT&T / Intel)。通过汇编器把写出的汇编代码转换为匹配对应硬件指令集的机器指令。

    为描述现实业务而写下的汇编语言本身同样还是不够直观,而且写下的代码对特定机器的依赖性很强。许多领域需要解决的问题转换成汇编的成本非常高,人类模糊的认知去做这样的抽象转换也容易带来BUG。然后就有了“高级编程语言”的抽象(比如 C 语言、Java 等等),高级语言设计了更多的语言特性,增强了表达力。人们借助 “编译” 的手段实现高级语言向汇编语言再到机器码的转换。

    然后我们可以发现,不管什么编程语言,本质上都属于对应某运行环境的操作指令,可移植性不强。而且,若我们直接操作机器,机器一次只能完成一件事情,随着机器性能的提高,多任务的需求也越来越迫切,操作系统便是为了解决这类问题而存在的。

    从移植性的角度,可以说操作系统是一种在硬件之上的抽象层。应用层程序也是基于这个抽象进行的,操作系统把各种硬件封装了起来,为程序指定了各种各样的输入输出(IO)。比如:

    1. 面向字符终端的 标准输入输出 (stdio)
    2. 面向图形设备的 图形用户界面 GUI(X Window、Windows、macOS 的桌面、Android、iOS 的界面之类的)
    3. 面向磁盘的 文件系统
    4. 面向声卡的 音频接口(ALSA、Windows 的 UAA)
    5. 面向网卡的 网络套接字接口(Socket)
    6. ......

    为实现多任务,操作系统还提供了进程这一种隔离的机制,就衍生出了进程通信、任务调度、虚拟地址空间之类的概念。

    所以学习操作系统的话,目标就是,了解操作系统这一层抽象究竟隐藏了什么,它们又对应给了我们什么样的功能接口(API),在大脑中建立清晰的概念。操作系统开放的 API,可以参考 Win32 APIPOSIX

    在应用层上这样的概念也挺明显的,比如说 Web 开发(包括微信小程序),浏览器把一些构建界面的能力(DOM、CSS)抽象出来,我们只管开发网页,底层和操作系统的交互则由浏览器一手包办,浏览器提供了 JavaScript 和 WebAssembly 的语言支持,还有浏览器开放的 Web API(要深入掌握的话,还是和各种基础知识息息相关)。

      0x0001 我看过一本COM+的书,讲如何开发Windows桌面程序,包括MFC有什么、怎么在VisualStudio里写DLL之类的,增加了对Windows的操作系统框架了解,但它出版于2000年左右,(后来貌似没有类似内容的新书了?)谈的程序大多非常简单:单线程、不涉及或只涉及基本的网络、同质化(而非大量多媒体)以呈现为主,比如做一个简单的记账软件,关键记录还可以附一张图片「在当年已经是很先进的了」。

      POSIX的教程也找到过一些,但全是跟Windows桌面开发有关的,而且没有以代码做案例具体讲解各种原理实现的。CORBA的教程也是如此。「还全都特别老」

      请问了解Web API有什么推荐吗?我今天发现这两篇文章很有趣,不知是否相关:
      C# 跨设备前后端开发探索 https://blog.walterlv.com/post/april-event-everything-can-be-done-using-csharp.html
      HTML5和桌面软件开发的碰撞 https://zhuanlan.zhihu.com/p/20499326

      越来越发现Web开发非常广大甚至深奥了,Javascript系统已经发展得跟微软/Java系统一样庞大了,一开始就是个前端工具后来变成全家桶了。比如这个:物联网Nodejs全栈技术实施 https://zhuanlan.zhihu.com/p/36152168

        NTL01 上面的链接的 MDN 就是一个比较完整的文档站点,还有学习路径之类的。

        MDN Web 文档

        Web 开发更新太快了,很多书很快就过时了,最好的学习材料也是开放更新的文档。

        深入地了解的话,可以参考“现代 Web 开发魔法全书”:
        dexteryy/spellbook-of-modern-webdev: A Big Picture, Thesaurus, and Taxonomy of Modern JavaScript Web Development

        在这个帖子有提到:
        现代 Web 开发的现状与未来(JSDC 2019 演讲全文) - 0xFFFF

        3 年 后

        © 2018-2025 0xFFFF