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

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


进程与线程?(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版)》

相关文章
|
2月前
|
Java 测试技术 API
【JUC】(1)带你重新认识进程与线程!!让你深层次了解线程运行的睡眠与打断!!
JUC是什么?你可以说它就是研究Java方面的并发过程。本篇是JUC专栏的第一章!带你了解并行与并发、线程与程序、线程的启动与休眠、打断和等待!全是干货!快快快!
463 2
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
170 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
196 1
|
6月前
|
算法 Java 关系型数据库
校招 Java 面试基础题目解析及学习指南含新技术实操要点
本指南聚焦校招Java面试,涵盖Java 8+新特性、多线程与并发、集合与泛型改进及实操项目。内容包括Lambda表达式、Stream API、Optional类、CompletableFuture异步编程、ReentrantLock与Condition、局部变量类型推断(var)、文本块、模块化系统等。通过在线书店系统项目,实践Java核心技术,如书籍管理、用户管理和订单管理,结合Lambda、Stream、CompletableFuture等特性。附带资源链接,助你掌握最新技术,应对面试挑战。
148 2
|
6月前
|
SQL Java 数据库连接
阿里腾讯互联网公司校招 Java 面试题总结及答案解析
本文总结了阿里巴巴和腾讯等互联网大厂的Java校招面试题及答案,涵盖Java基础、多线程、集合框架、数据库、Spring与MyBatis框架等内容。从数据类型、面向对象特性到异常处理,从线程安全到SQL优化,再到IOC原理与MyBatis结果封装,全面梳理常见考点。通过详细解析,帮助求职者系统掌握Java核心知识,为校招做好充分准备。资源链接:[点击下载](https://pan.quark.cn/s/14fcf913bae6)。
194 2
|
6月前
|
调度 开发工具 Android开发
【HarmonyOS Next】鸿蒙应用进程和线程详解
进程的定义: 进程是系统进行资源分配的基本单位,是操作系统结构的基础。 在鸿蒙系统中,一个应用下会有三类进程:
213 0
|
6月前
|
存储 算法 Java
校招 java 面试基础题目及解析
本文围绕Java校招面试基础题目展开,涵盖平台无关性、面向对象特性(封装、继承、多态)、数据类型、关键字(static、final)、方法相关(重载与覆盖)、流程控制语句、数组与集合、异常处理等核心知识点。通过概念阐述和代码示例,帮助求职者深入理解并掌握Java基础知识,为校招面试做好充分准备。文末还提供了专项练习建议及资源链接,助力提升实战能力。
154 0
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!