专栏名称: SegmentFault思否
SegmentFault (www.sf.gg)开发者社区,是中国年轻开发者喜爱的极客社区,我们为开发者提供最纯粹的技术交流和分享平台。
目录
相关文章推荐
程序员的那些事  ·  清华大学:DeepSeek + ... ·  2 天前  
程序员的那些事  ·  印度把 DeepSeek ... ·  2 天前  
OSC开源社区  ·  2024: 大模型背景下知识图谱的理性回归 ·  3 天前  
OSC开源社区  ·  升级到Svelte ... ·  4 天前  
程序员小灰  ·  DeepSeek做AI代写,彻底爆了! ·  4 天前  
51好读  ›  专栏  ›  SegmentFault思否

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

SegmentFault思否  · 公众号  · 程序员  · 2019-08-28 12:00

正文

作者 l 二胖
来源 l 逆袭的二胖 (公众号ID: fighting_erpang
转载请关注公众号后留言联系授权



很多人一直苦恼一个问题:“我们学操作系统、学网络到底有啥用?”


其实我之前也就这个问题进行过讨论,但仅仅停留在概念上,很多朋友还是不理解,所以今天我就拿我工作中遇到的实际问题来举例,希望让大家明白—— 对于开发的同学而言,操作系统、网络、数据库原理都是很有用的


到底是谁在说操作系统无用?


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


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


说句可能会引起争议的话,目前很多培训班的培训内容多停留于“外功”层面,对内功层面的知识很难涉及。这其实也不怪他们,因为 计算机系统原理等内功并非短时间内可以学会的,而出于商业化的目的,培训外功是最容易见效的,所以大多数培训班都选择了可以速成的外功


话说回来,是不是不懂计算机系统知识就没救了?其实并不是,很多开发岗位是用不到特别复杂的底层知识的,所以,只学习外功也可以完全胜任这类岗位, 甚至 BAT 很多开发工作几乎用不到比较底层或者比较难的原理知识


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


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


当然,我举这个例子并不是说外包同学技术不好,只是阐述一下这种现象。


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


总得来说,平时写业务代码的同学,或者尚未工作的同学会觉得操作系统等原理知识是没什么用的。 如果一直停留在写业务代码的层面,拿一份不错的工资是完全没问题的,只是后续的职业发展会有瓶颈,很容易被替代


brpc


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



如果你现阶段不知道什么是 rpc,没关系,你可以把它理解为一个“远程调用”框架,或者 Web 框架都行,它支持很多种编程语言。


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


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


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


我们知道,计算机一般是多核的,比如个人 PC 机多为 “四核八线程” ,这里的四核八线程指的是,同一时间点可以同时有八个线程在运行,是真正意义上的 并行 ,这里我们可以称其为 物理线程


Pthread:我们用 Pthread 来描述物理线程。


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


所以, 在操作系统中有两个概念,并行和并发。 并行是指真正意义的同时执行,而并发是指逻辑上的同时执行


在 brpc 中,我们称逻辑线程为 Bthread ,也叫 用户线程


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


常见的线程模型有 3 种,分别是 1:1、N:1、M:N。
1:1 指的是 1 个线程整个生命周期都跑在一个物理核上,优点是缓存读写快速,缺点是容易阻塞。


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


M:N 是 brpc 结合上述两种模型给出的解决方案,M 个逻辑线程跑在 N 个物理核上,其中 M 大于等于 N,其中内部有自己的负载策略,尽量保证同一个逻辑线程落在同一个物理核上。这样既可以保证并发,又可以保证读写线程缓存快速。


当然,线程模型的选择并不是这么简单的事,我们可能还要考虑 threadLocal、同步、异步,篇幅有限,就不多阐述了。当一个框架把很多能力都开放给开发者,开发者就可以写出更灵活更高效的程序,但是这对开发者的开发能力要求更高了,因为对于不同的场景需要选择不同的方案。比如 brpc 文档中给出了同步、异步和 Bthread 的选择策略,以下是文档截图:






请到「今天看啥」查看全文