文章插图
进程与线程?(Process vs. Thread?)
面试官(正襟危坐中):给我说说“线程”与“进程”吧 。
我(总是不太聪明的样子):“限乘?”、“进什么城(程)?”
面试官:“操作系统中的进程与线程,你回去了解一下 。门在左边,记得关门 。”
当翻译过来后,这两个概念都带了个“程”字,但进程的英文:Process,而线程的英文:Thread,好像并没有什么联系 。
大多数初学者一开始都会被这两个概念弄的晕头转向,包括我本人 。
进程和线程基础(理论概念)
1. 定义
看了下面的定义,可能会有点晕,但我还是要把他写下来(为了严谨) 。
进程是资源(CPU、内存等)分配的基本单位,具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位 。线程是进程的一个实体,是独立运行和独立调度的基本单位(CPU上真正运行的是线程) 。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源 。2.区别
进程是资源分配的基本单位;线程是程序执行的基本单位 。
进程拥有自己的资源空间,没启动一个进程,系统就会为它分配地址空间;而线程与CPU资源分配无关,多个线程共享同一进程内的资源,使用相同的地址空间 。
一个进程可以包含若干个线程 。
3. 优劣
正是因为这二者有区别,所以带来的各自的优劣
线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(Inter Process Communication,IPC)进行 。不过如何处理好同步与互斥是编写多线程程序的难点 。
线程的调度与切换比进程快很多,同时创建一个线程的开销也比进程要小很多 。
但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间 。
除此之外,推荐看一下阮一峰的一篇博客:进程与线程的一个简单解释,用图解释十分生动形象 。
为什么这个问题是面试高频?
既然这个问题是面试当中会被经常问到的,所以我去网上找一个答案,背出来不就好了 。
但是,真的背答案就可以了吗?
我们来分析一下为什么众多面试官老是问这个问题,他应该并不是想听到一个对书本上概念的重复 。
那么,他究竟想考什么?
侧重点一:面试官想要了解面试者对这一知识点的理解程度(因为这是操作系统中不得不提的一个概念) 。如果这个概念回答不上来,意味着面试者对操作系统的学习并不深 。侧重点二:面试官可以对你的回答作进一步展开,通过你的回答某个侧重点方向来进一步提问你对你自己回答的理解 。(这个高频问题的价值所在) 。比如:
- 当你回答到:进程与线程的内存结构不同 。进程与进程之间不能共享内存,而线程可以 。那么面试官就可以就内存这一点深入提问——内存如何寻址?
- 当你回答:线程之间通信很方便,进程与进程通信不方便 。那么问题就又来了,你给我说一下进程之间怎么通信?进程之间通信方法有哪些?不同通信方法有哪些优劣点?
一个更满意的答案?
如何作答,才能展示一个让面试官更满意的答案?
这里就不得不用张三丰教给张无忌的太极拳的那一招——忘掉 。。。
对就是把上面的概念全都忘掉 。只留一个目的:“把敌人打败” 。
最后用自己的一招一式(理解)来回答 。
再谈“进程”与“线程”(口语表述)
进程的本质:正在执行的一个程序,可以进程比作一个容器或者工厂
文章插图
通过上图,方便我们了解并记忆:
- 进程与进程之间相对独立
- 进程可以包括几个或者上百个线程在运行 。
- 内存(逻辑内存)包括在进程里面,每个进程的内存都是互相独立的,但从一个更高的层次上看,不同的进程也共享着一个巨大的空间,这个空间就是整个计算机 。
- 进程共有文件/网络句柄(handle),这样可以打开同一个文件,抢同一个网络端口 。
文章插图
线程的本质:真正运行的是一个一个的线程
文章插图
同理,上图我们知道线程包含:
- 栈(堆栈):主线程的main函数、进行函数调用的参数和返回地址、局部变量等内容都会被压入栈内
- PC(Program Couner):程序计数器,PC的指针指向代码所在的内存地址 。
- TLS(Thread local storage):分配内存,存放变量
1. 如何通信(沟通)的内容
通信是人的基本需求,进程与进程之间是相互独立的,也有通信需求 。根据这一问题就可以展开内容提问:
- 进程/线程如何通信
- 通信方式的差异,比如进程间共享内存和消息队列有何异同?
一旦有了通信,人与人之间就会产生矛盾,进程也一样 。这些矛盾就会体现在如何同步上 。
- 在单个CPU下,实际上在任何时刻只能有一个进程处于执行状态 。而其他进程则处于非执行状态 。我们是如何确定在任意时刻到底由哪个进程执行,哪些不执行呢?进而又可以引出锁的概念?(如何进行进程调度?)
- 线程之间的关系是合作关系 。既然是合作,那就得有某种约定的规则,否则合作就会出问题 。(如何进行线程同步?)
进程要分配内存,所以开销很大,进程只需要分配栈,分配一个PC就好,内存开销小 。
这一块就可以问到了操作系统中的内存原理相关的内容 。
总结
总之,如果上述内容你都了解,那肯定是不怕被问到(大佬,请收下我的膝盖);如果看了此篇文章之后,你能答出个大概,我相信面试官也会放过你,毕竟,我们也真的不是背书机器 。所以,我们在回答过程中,尽量别给自己挖坑,用自己理解的知识点进行回答 。
推荐阅读
- 小苏打和醋混合后能去污吗? 小苏打是什么
- 电脑投屏怎么设置
- 咱们相爱吧蔡春妮决定和老公离婚是哪一集
- 干事和助理的区别 部队机关里面的干事助理有什么不同
- 牛奶可以和鸡蛋一起煮着吃吗
- 秦始皇的奶奶是谁,夏姬和秦始皇什么关系
- 路飞和汉库克的结局是什么呢? 两人会在一起吗
- 中国联通的文档里有专业名词叫含内容整合和不含内容整合这是什么意思
- 重本和一本有什么区别
- 冯森和米振东有什么仇 米振东和冯森有何恩怨?黄雨虹是祸首