为什么校招面试中总被问“线程与进程的区别”?我该如何回答?

作者 | 宇宙之一粟

责编 | 徐威龙

出品 | AI 科技大本营(rgznai100)

进程与线程?(Process vs. Thread?)

面试官(正襟危坐中):给我说说“线程”与“进程”吧。

我(总是不太聪明的样子):“限乘?”、“进什么城(程)?”

面试官:“操作系统中的进程与线程,你回去了解一下。门在左边,记得关门。”

当翻译过来后,这两个概念都带了个“程”字,但进程的英文:Process,而线程的英文:Thread,好像并没有什么联系。

大多数初学者一开始都会被这两个概念弄的晕头转向,包括我本人。

当你看完这篇文章,可能你就有了新的理解。

不信,你接着往下看看。

进程和线程基础(理论概念)

1. 定义

看了下面的定义,可能会有点晕,但我还是要把他写下来(为了严谨)。

进程是资源(CPU、内存等)分配的基本单位,具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。

线程是进程的一个实体,是独立运行和独立调度的基本单位(CPU上真正运行的是线程)。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

2.区别

进程是资源分配的基本单位;线程是程序执行的基本单位。

进程拥有自己的资源空间,没启动一个进程,系统就会为它分配地址空间;而线程与CPU资源分配无关,多个线程共享同一进程内的资源,使用相同的地址空间。

一个进程可以包含若干个线程。

3. 优劣

正是因为这二者有区别,所以带来的各自的优劣

线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(Inter Process Communication,IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。

线程的调度与切换比进程快很多,同时创建一个线程的开销也比进程要小很多。

但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

除此之外,推荐看一下阮一峰的一篇博客:进程与线程的一个简单解释,用图解释十分生动形象。

为什么这个问题是面试高频?

既然这个问题是面试当中会被经常问到的,所以我去网上找一个答案,背出来不就好了。

但是,真的背答案就可以了吗?

我们来分析一下为什么众多面试官老是问这个问题,他应该并不是想听到一个对书本上概念的重复。

那么,他究竟想考什么?

侧重点一:面试官想要了解面试者对这一知识点的理解程度(因为这是操作系统中不得不提的一个概念)。如果这个概念回答不上来,意味着面试者对操作系统的学习并不深。

侧重点二:面试官可以对你的回答作进一步展开,通过你的回答某个侧重点方向来进一步提问你对你自己回答的理解。(这个高频问题的价值所在)。

比如:

  • 当你回答到:进程与线程的内存结构不同。进程与进程之间不能共享内存,而线程可以。那么面试官就可以就内存这一点深入提问——内存如何寻址?

  • 当你回答:线程之间通信很方便,进程与进程通信不方便。那么问题就又来了,你给我说一下进程之间怎么通信?进程之间通信方法有哪些?不同通信方法有哪些优劣点?

一个更满意的答案?

如何作答,才能展示一个让面试官更满意的答案?

这里就不得不用张三丰教给张无忌的太极拳的那一招——忘掉。。。

对就是把上面的概念全都忘掉。只留一个目的:“把敌人打败”。

最后用自己的一招一式(理解)来回答。

再谈“进程”与“线程”(口语表述)

进程的本质:正在执行的一个程序,可以进程比作一个容器或者工厂


通过上图,方便我们了解并记忆:

  1. 进程与进程之间相对独立

  2. 进程可以包括几个或者上百个线程在运行。

  3. 内存(逻辑内存)包括在进程里面,每个进程的内存都是互相独立的,但从一个更高的层次上看,不同的进程也共享着一个巨大的空间,这个空间就是整个计算机。

  4. 进程共有文件/网络句柄(handle),这样可以打开同一个文件,抢同一个网络端口。

从不同的视角来看进程:

线程的本质:真正运行的是一个一个的线程

同理,上图我们知道线程包含:

  1. 栈(堆栈):主线程的main函数、进行函数调用的参数和返回地址、局部变量等内容都会被压入栈内

  2. PC(Program Couner):程序计数器,PC的指针指向代码所在的内存地址。

  3. TLS(Thread local storage):分配内存,存放变量

当有了上面的问题做引子后,面试官就可以借此引出更多话题:

1. 如何通信(沟通)的内容

通信是人的基本需求,进程与进程之间是相互独立的,也有通信需求。根据这一问题就可以展开内容提问:

  • 进程/线程如何通信

答:进程可以通过管道、套接字、信号交互、共享内存、消息队列等等进行通信;而线程本身就会共享内存,指针指向同一个内容,交互很容易。

  • 通信方式的差异,比如进程间共享内存和消息队列有何异同?

2. 如何同步(协调)的内容

一旦有了通信,人与人之间就会产生矛盾,进程也一样。这些矛盾就会体现在如何同步上。

  • 在单个CPU下,实际上在任何时刻只能有一个进程处于执行状态。而其他进程则处于非执行状态。我们是如何确定在任意时刻到底由哪个进程执行,哪些不执行呢?进而又可以引出锁的概念?(如何进行进程调度?)

  • 线程之间的关系是合作关系。既然是合作,那就得有某种约定的规则,否则合作就会出问题。(如何进行线程同步?)

3. 关于内存原理相关问题

进程要分配内存,所以开销很大,进程只需要分配栈,分配一个PC就好,内存开销小。

这一块就可以问到了操作系统中的内存原理相关的内容。

总结

总之,如果上述内容你都了解,那肯定是不怕被问到(大佬,请收下我的膝盖);如果看了此篇文章之后,你能答出个大概,我相信面试官也会放过你,毕竟,我们也真的不是背书机器。所以,我们在回答过程中,尽量别给自己挖坑,用自己理解的知识点进行回答。

切忌背书式的回答,模棱两可,因为这样面试官几个连环炮就容易暴露问题了。

如果你能看到这,能否给我点个关注,点个赞让我也收到鼓励。如果觉得我写的内容有误,也欢迎评论指出。

注意,要敲黑板啦。

  • 进程是什么?它指的是一个运动中的程序。从名字上看,进程表示的就是进展中的程序。一个程序一旦在计算机里运行起来,它就成为一个进程。进程与进程之间可以通信、同步、竞争,并在一定情况下可能形成死锁。

  • 那么线程是什么?我们知道,进程是运转的程序,是为了在CPU上实现多道编程而发明的一个概念。但是进程在一个时间只能干一件事情。如果想同时干两件事,办法就是线程。线程是进程里面的一个执行上下文或者执行序列。

最后,祝大家答的愉快!面试过!过!过!

本文首发于 CSDN博客,原文链接:

https://blog.csdn.net/yuzhou_1shu/article/details/105326063

推荐阅读

    你点的每个“在看”,我都认真当成了AI

展开阅读全文

Git 实用技巧

11-24
这几年越来越多的开发团队使用了Git,掌握Git的使用已经越来越重要,已经是一个开发者必备的一项技能;但很多人在刚开始学习Git的时候会遇到很多疑,比如之前使用过SVN的开发者想不通Git提交代码为什么需要先commit然后再去push,而不是一条命令一次性搞定; 更多的开发者对Git已经入门,不过在遇到一些代码冲突、需要恢复Git代码时候就不知所措,这个时候哪些对 Git掌握得比较好的少数人,就像团队的神一样,在队友遇到 Git 相关的题的时候用各种流利的操作来帮助队友于水火。 我去年刚加入新团队,发现一些同事对Git的常规操作没太大题,但对Git的理解还是比较生疏,比如说分支和分支之间的关联关系、合并代码时候的冲突解决、提交代码前未拉取新代码导致冲突题的处理等,我在协助处理这些题的时候也记录各种题的解决办法,希望整理后通过教程帮助到更多对Git操作进阶的开发者。 本期教程学习方法分为“掌握基础——稳步进阶——熟悉协作”三个层次。从掌握基础的 Git的推送和拉取开始,以案例进行演示,分析每一个步骤的操作方式和原理,从理解Git 工具的操作到学会代码存储结构、演示不同场景下Git遇到题的不同处理方案。循序渐进让同学们掌握Git工具在团队协作的整体协作流程。 在教程会通过大量案例进行分析,案例会模拟在工作遇到的题,从最基础的代码提交和拉取、代码冲突解决、代码仓库的数据维护、Git服务端搭建等。为了让同学们容易理解,对Git简单易懂,文章详细记录了详细的操作步骤,提供大量演示截图和解析。在教程的最后部分,会从提升团队整体效率的角度对Git工具进行讲解,包括规范操作、Gitlab的搭建、钩子事件的应用等。 为了让同学们可以利用碎片化时间来灵活学习,在教程文章大程度降低了上下文的依赖,让大家可以在工作之余进行学习与实战,并同时掌握里面涉及的Git不常见操作的相关知识,理解Git工具在工作遇到的题解决思路和方法,相信一定会对大家的前端技能进阶大有帮助。
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值