操作系统真的在工作中能用到吗?能!一文讲清

2019-10-15 03:56栏目:程序开发
TAG:

  其实我之前也就这个问题进行过讨论,但仅仅停留在概念上,很多朋友还是不理解,所以今天我就拿我工作中遇到的实际问题来举例,希望让大家明白——

  一些朋友说操作系统无用,大概率是因为他用不到。但是对工程开发这个岗位来说,如果对偏底层的操作系统知识毫无了解,写程序就会浮于表面。

  做个不恰当的比喻,如果把编程比喻成武功,那么编程语言的语法、软件的使用技巧就是外功,而计算机原理、设计模式等知识就是内功心法。

  说句可能会引起争议的话,目前很多培训班的培训内容多停留于“外功”层面,对内功层面的知识很难涉及。这其实也不怪他们,因为

  计算机系统原理等内功并非短时间内可以学会的,而出于商业化的目的,培训外功是最容易见效的,所以大多数培训班都选择了可以速成的外功。话说回来,是不是不懂计算机系统知识就没救了?其实并不是,很多开发岗位是用不到特别复杂的底层知识的,所以,只学习外功也可以完全胜任这类岗位,

  甚至 BAT 很多开发工作几乎用不到比较底层或者比较难的原理知识。不知道大家有没有听说过“外包”这个岗位,BAT 等公司内部其实有请大量的外包同学来参与项目开发。我先解释下“外包”和正式员工有什么区别,比如大家都在腾讯办公,正式员工是和腾讯签合同,而外包同学是和第三方公司签合同,然后到腾讯驻场开发。总体来说,外包同学的基础可能相对薄弱,多是做一些简单的开发工作。

  我们部门也有很多外包同学从事一些比较基础的开发工作,如业务逻辑编写基本都会找外包同学帮忙。而一些比较难的工作,如涉及核心功能的开发等都由自己完成。所以大多数外包同学做的工作几乎是不涉及底层原理的。

  我个人做的业务是后端开发,平时会用到 C++、PHP、Python,偶尔会用到Go。很多时候我自己做的工作也就是简单业务,并没有什么技术含量。但是,有些对性能有要求的项目,可能就会涉及底层了。

  总得来说,平时写业务代码的同学,或者尚未工作的同学会觉得操作系统等原理知识是没什么用的。

  如果一直停留在写业务代码的层面,拿一份不错的工资是完全没问题的,只是后续的职业发展会有瓶颈,很容易被替代。brpc

  下面说说我在实际工作中用到操作系统知识的场景。先给大家介绍一款百度开源的 Rpc 框架:brpc,下图是它的 github 首页截图。

  我在工作中常常使用到 brpc,用 C++ 语言描述,在某些场景下就需要用到线程模型了。

  brpc 在描述线程方面写得过于专业,不是特别容易理解,我就写写我的个人理解吧:

  现在常见的编程语言或者说框架都有自己的线程模型,下面给几个术语,我就不写概念了,用一种通俗的语言去解释,所以可能不那么严谨。

  ,这里的四核八线程指的是,同一时间点可以同时有八个线程在运行,是真正意义上的并行,这里我们可以称其为物理线程。Pthread:我们用 Pthread 来描述物理线程。

  。我们平时讲的多线程,应该是逻辑线程,比如一个程序开了 40 个线 个核,怎么实现并发这么多线程呢?其实这里的逻辑线程并不是在同一个时间点执行,而是逻辑线程在物理核之间快速切换,给我们的感觉是它们在同时执行,但这只是感觉上的并发。所以,

  并行是指真正意义的同时执行,而并发是指逻辑上的同时执行。在 brpc 中,我们称逻辑线程为

  ,也叫用户线程。讲完 Pthread 和 Bthread,我们就可以学学线程模型了。

  指的是 1 个线程整个生命周期都跑在一个物理核上,优点是缓存读写快速,缺点是容易阻塞。N:1

  指的是所有线程都跑在一个物理核上,优点是线程缓存读写快速,缺点是所有压力都加到一个核上,其他核却空闲。M:N

  是 brpc 结合上述两种模型给出的解决方案,M 个逻辑线程跑在 N 个物理核上,其中 M 大于等于 N,其中内部有自己的负载策略,尽量保证同一个逻辑线程落在同一个物理核上。这样既可以保证并发,又可以保证读写线程缓存快速。当然,线程模型的选择并不是这么简单的事,我们可能还要考虑 threadLocal、同步、异步,篇幅有限,就不多阐述了。当一个框架把很多能力都开放给开发者,开发者就可以写出更灵活更高效的程序,但是这对开发者的开发能力要求更高了,因为对于不同的场景需要选择不同的方案。比如 brpc 文档中给出了同步、异步和 Bthread 的选择策略,以下是文档截图:

  。当然,除了线程模型,还有进程模型。对于一些不是特别支持多线程并发的语言,会有一些框架来支持其并行执行的能力,比如 php 框架 swoole,它就是一个多进程框架,多进程跑在多个核上是再自然不过的事情,其缺点就是进程间通信比线程间通信麻烦得多。

  学习操作系统还有一个好处:很多调度系统的底层思路都引用了操作系统进程调度的思想,学习调度模型一劳多得。

  我在工作中会遇到这样的需求,自己实现一套任务调度系统去运行一些任务,如果我们很清晰地了解操作系统的任务调度策略、进程状态转换等过程,项目就不是那么难了。本文来源:公众号 @逆袭的二胖,作者二胖,一个文章被知乎日报转载n次,收藏量超过100k的原创作者。除了技术文章,公众号还常常发表与职场、互联网及生活有关的文章,欢迎关注。

  声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。