-
地址空间:
-
进程:
进程包含独立的地址空间。 -
线程:
线程没有自己独立的地址空间,它共享所属进程的空间。 -
开销:
-
进程:
进程之间的切换会有较大的开销。 -
线程:
线程之间的切换的开销比较小。 -
资源:
-
进程:
系统在运行的时候会为每个进程分配资源,而不会为线程分配资源。 -
线程:
线程所使用的资源来自其所属进程的资源。 -
通信:
-
线程之间通信比进程之间通信更方便。
-
包含关系:
-
线程是一个轻量级进程,是进程的一部分。
2、进程和线程分别适用于什么场景呢?
🌸
👨💼面试官:那么两者的分别适用于什么场景呢?
🙍♂️小宝:
进程适用的场景:需要安全稳定的场景。
线程适用的场景
-
频繁创建和销毁的场景。
-
计算量大,切换频繁的场景。
-
需要速度的场景。
3、进程切换为什么比线程更消耗资源?
🌸
👨💼面试官:进程切换为什么比线程更消耗资源?
🙍♂️小宝: 进程切换时需要刷新TLB并获取新的地址空间,然后切换硬件上下文和内核栈;线程切换时只需要切换硬件上下文和内核栈。
TLB补充: 英文:Translation Lookaside Buffer。通过翻译:旁路转换缓冲。TLB 就是负责将虚拟内存地址翻译成实际的物理内 存地址,而 CPU 寻址时会优先在 TLB 中进行寻址。处理器的性能就和寻址的命中率有很大的关系。
上下文补充: 在一个程序运行起来时
进程
会有很多中状态,状态包括存放在内存中的程序的代码和数据,它的栈、通用目的寄存器的内容、程序计数器、环境变量以及打开的文件描述符的集合,这个状态叫做上下文(Context)。
上下文切换:
- 进程: 进程是由
内核
管理和调度的,所以说进程切换只能发生再内核态
。
- 线程: 当两个
线程
不是属于同一个进程时,则和进程
的上下文切换是一样的;当两个线程
是属于同一个进程
时,因为虚拟机内存是共享的,所以再切换时,虚拟内存这些资源就会保持不变,只需要切换线程的私有数据,寄存器等不共享的数据。
线程存在于进程中,一个进程可以有一个或多个线程。线程是运行在进程上下文中的逻辑流,这个线程可以独立完成一项任务。同样线程有自己的上下文,包括唯一的整数线程ID, 栈、栈指针、程序计数器、通用目的寄存器和条件码。可以理解为线程上下文是进程上下文的子集。
由于保存线程的上下文明显比进程的上下文小,因此系统切换线程时,必然开销更小。
所以这个只是线程比进程消耗资源小的其中一个方面。
4、发生进程上下文切换有哪些场景?
🌸
👨💼面试官:发生进程上下文切换有哪些场景?
🙍♂️小宝:进程上下文的切换场景有:
-
例如某个进程时间片耗光,然后从 运行状态 转化为 就绪状态 然后调度程序就再从 就绪队列 中选取新的进程到运行状态。
-
资源不足,进程会被挂起。
-
通过睡眠函数 sleep 将自己挂起,自然也会有重新调度。
-
来了高优先级的
进程
时,当前进程
被挂起。 -
硬件中断时,CPU 上的进程会被中断挂起,转而执行内核的中断服务程序;
1、有了解进程的一些状态吗?
🌸
👨💼面试官:有了解进程的一些状态吗?
🙍♂️小宝:知道一些的面试官。
首先 进程 有三个最基本的状态 —— 就绪状态、运行状态和阻塞状态
。当然除了这三个还有两个基本的状态——创建状态和结束状态
。
我们再来说一下基本状态的作用。
-
创建状态: 是一个
进程
的创建。 -
就绪状态: 是进程等待到 CPU也就是 运行状态 的前一个状态,进程调度器 也就是在这里选择
进程
到 运行状态。简的来说:可运⾏,由于其他进程处于运⾏状态⽽暂时停⽌运⾏;
-
运行状态: 代表在 运行状态 的
进程
占用 CPU进行一些操作。 -
阻塞状态: 因为一些操作(如IO)让
进程
暂停运行。这时CPU给他控制权,他也无法运行! -
结束状态: 表示该
进程
任务完成或出错时,需要从系统中消失。
🌸下面是小宝画的流程图(有点手残希望大家别建议)
流程图:
2、知道挂起状态吗?
🌸
👨💼面试官:回答挺不错的,那你知道挂起状态吗?
🙍♂️小宝:
挂起状态: 因为如果在上述中有很多的 阻塞状态 则进程
就会占用物理空间,这是非常浪费资源的。所以我们会把这些 阻塞状态 的进程 转移到外存(硬盘)中。当再次运行时则会把该进程
从外存转入到 物理内存。
挂起状态还分为:
-
就绪挂起状态
:进程在外盘中,进入内存立即运行。 -
阻塞挂起状态
:进程在外盘中,并等待某个事件的出现。
流程图:(手残党来啦)