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

简介: 为什么校招面试中“线程与进程的区别”老是被问到?我该如何回答?


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

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

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

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

image.png

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

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

image.png

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

不信,你接着往下看看(不过在这之前,点个赞或关注好不好?)。

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

1. 定义

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

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

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

2.区别

  1. 进程是资源分配的基本单位;线程是程序执行的基本单位。
  2. 进程拥有自己的资源空间,没启动一个进程,系统就会为它分配地址空间;而线程与CPU资源分配无关,多个线程共享同一进程内的资源,使用相同的地址空间。
  3. 一个进程可以包含若干个线程。

3. 优劣

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

  1. 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(Inter Process Communication,IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
  2. 线程的调度与切换比进程快很多,同时创建一个线程的开销也比进程要小很多。
  3. 但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

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

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

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

image.png

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

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

那么,他究竟想考什么?

  1. 侧重点一:面试官想要了解面试者对这一知识点的理解程度(因为这是操作系统中不得不提的一个概念)。如果这个概念回答不上来,意味着面试者对操作系统的学习并不深。
  2. 侧重点二:面试官可以对你的回答作进一步展开,通过你的回答某个侧重点方向来进一步提问你对你自己回答的理解。(这个高频问题的价值所在)。

比如:

  • 当你回答到:进程与线程的内存结构不同。进程与进程之间不能共享内存,而线程可以。那么面试官就可以就内存这一点深入提问——内存如何寻址?
  • 当你回答:线程之间通信很方便,进程与进程通信不方便。那么问题就又来了,你给我说一下进程之间怎么通信?进程之间通信方法有哪些?不同通信方法有哪些优劣点?

一个更满意的答案?

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

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

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

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

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

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

image.png

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

  1. 进程与进程之间相对独立
  2. 进程可以包括几个或者上百个线程在运行。
  3. 内存(逻辑内存)包括在进程里面,每个进程的内存都是互相独立的,但从一个更高的层次上看,不同的进程也共享着一个巨大的空间,这个空间就是整个计算机。
  4. 进程共有文件/网络句柄(handle),这样可以打开同一个文件,抢同一个网络端口。

从不同的视角来看进程:

image.png

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

image.png

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

  1. 栈(堆栈):主线程的main函数、进行函数调用的参数和返回地址、局部变量等内容都会被压入栈内
  2. PC(Program Couner):程序计数器,PC的指针指向代码所在的内存地址。
  3. TLS(Thread local storage):分配内存,存放变量

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

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

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

  • 进程/线程如何通信
    答:进程可以通过管道、套接字、信号交互、共享内存、消息队列等等进行通信;而线程本身就会共享内存,指针指向同一个内容,交互很容易。
  • 通信方式的差异,比如进程间共享内存和消息队列有何异同?

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

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

  • 在单个CPU下,实际上在任何时刻只能有一个进程处于执行状态。而其他进程则处于非执行状态。我们是如何确定在任意时刻到底由哪个进程执行,哪些不执行呢?进而又可以引出锁的概念?(如何进行进程调度?)
  • 线程之间的关系是合作关系。既然是合作,那就得有某种约定的规则,否则合作就会出问题。(如何进行线程同步?)

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

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

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

总结

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

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

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

注意,要敲黑板啦。

image.png

  • 进程是什么?它指的是一个运动中的程序。从名字上看,进程表示的就是进展中的程序。一个程序一旦在计算机里运行起来,它就成为一个进程。进程与进程之间可以通信、同步、竞争,并在一定情况下可能形成死锁。
  • 那么线程是什么?我们知道,进程是运转的程序,是为了在CPU上实现多道编程而发明的一个概念。但是进程在一个时间只能干一件事情。如果想同时干两件事,办法就是线程。线程是进程里面的一个执行上下文或者执行序列。

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

参考资料:

  1. 《现代操作系统(第3版)》
  2. 《操作系统之哲学原理(第2版)》

相关文章
|
30天前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
2月前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
82 14
|
30天前
|
消息中间件 Unix Linux
【C语言】进程和线程详解
在现代操作系统中,进程和线程是实现并发执行的两种主要方式。理解它们的区别和各自的应用场景对于编写高效的并发程序至关重要。
55 6
|
30天前
|
调度 开发者
深入理解:进程与线程的本质差异
在操作系统和计算机编程领域,进程和线程是两个核心概念。它们在程序执行和资源管理中扮演着至关重要的角色。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
58 5
|
1月前
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
|
28天前
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
|
30天前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
56 4
|
2月前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
2月前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
30 1
|
2月前
|
监控 JavaScript 前端开发
python中的线程和进程(一文带你了解)
欢迎来到瑞雨溪的博客,这里是一位热爱JavaScript和Vue的大一学生分享技术心得的地方。如果你从我的文章中有所收获,欢迎关注我,我将持续更新更多优质内容,你的支持是我前进的动力!🎉🎉🎉
28 0

相关实验场景

更多