Appearance
进程和线程
面试题 1:进程、线程和协程的定义
1、何为进程?
程序运行需要有它自己专属的内存空间,这个空间就是进程。
每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。
2、何为线程?
一个进程 至少
有一个线程,所以在进程开启后会自动创建一个线程来运行代码,该线程称之为 主线程
。主线程结束,整个程序也就结束了。
有了进程后,就可以运行程序的代码了,运行代码的「人」称之为「线程」。
如果程序需要同时执行多块代码,主线程就会启动更多的线程来并发执行代码,所以一个进程中可以包含多个线程。
3、何为协程?
协程也被叫做微线程,是一种比线程更加轻量级的并发编程方式。协程不是由操作系统内核管理,而是完全由程序控制。协程可以在一个线程中实现多个任务的并发执行。
应用场景:适用于高并发的网络编程场景,如处理大量的网络连接、HTTP 请求等。
4、协程和线程的区别?
线程和协程都是在编程中用于实现并发的概念
调度方式
- 线程:线程的调度由操作系统内核负责。内核根据一定的调度算法(如时间片轮转、优先级调度等)来决定哪个线程在何时获得 CPU 时间片执行。线程的上下文切换需要涉及到用户态和内核态的切换,开销相对较大。
- 协程:协程的调度由程序自身控制。协程在执行过程中可以主动让出执行权,将控制权交给其他协程,这种切换是在用户态下完成的,不需要操作系统内核的干预,因此上下文切换的开销非常小。
并发性
- 线程:多个线程可以在多核 CPU 上实现真正的并行执行,即多个线程可以同时在不同的 CPU 核心上运行。不过,在单核 CPU 上,线程的并发是通过时间片轮转实现的,实际上同一时刻只有一个线程在执行。
- 协程:协程是在一个线程内实现并发,它通过在不同协程之间快速切换来模拟并发执行。由于协程的切换是由程序控制的,所以在单核或多核 CPU 上,协程都无法实现真正的并行,只能实现并发。
资源消耗
- 线程:线程的创建和销毁需要操作系统内核的参与,因此会消耗较多的系统资源,例如内存、CPU 时间等。每个线程都有自己独立的栈空间,这也会占用一定的内存。
- 协程:协程的创建和销毁开销非常小,因为它不需要操作系统内核的干预。协程共享同一个线程的栈空间,所以占用的内存资源也很少。
面试题 2:并行和并发的区别?
并行:指多个任务在同一时刻同时执行。这意味着有多个处理器或处理核心同时工作,每个处理器或核心分别处理不同的任务,就像多个工人同时在不同的工作台上工作一样,彼此之间互不干扰,可以同时完成不同的任务。
在多核 CPU 中,每个核心都可以独立地执行指令,多个核心可以同时运行不同的线程或进程,从而实现真正的并行处理。
并发:指多个任务在同一时间段内交替执行。这些任务在宏观上看似同时运行,但在单核处理器环境下,实际上是通过快速交替切换来实现的(多个任务在同一时间段内交替执行);在多核处理器环境下,则既包括不同核心上任务的真正同时执行,也包括在同一核心上任务的交替执行。
在单核 CPU 中,由于只有一个处理核心,无法同时执行多个任务。操作系统会通过时间片轮转的方式,将 CPU 的时间分成很小的时间片,轮流分配给不同的任务,让每个任务都能在一段时间内得到执行。
应用场景:
- 并行:适用于处理大量的独立任务,这些任务可以被分解并分配到不同的处理器上同时进行处理,以提高处理速度和效率,如大规模数据处理、科学计算中的并行计算等。
- 并发:常用于处理多个相互独立但又可能会有一些资源竞争的任务,如网络服务器处理多个客户端的请求、图形用户界面中同时处理多个用户操作等。
面试题 3:浏览器包含的进程
brower进程
:浏览器主进程、负责界面显示、用户交互,创建和销毁的进程,网络资源下载gpu进程
:用于 3d 绘制第三方插件
:管理插件的进程浏览器渲染进程
:由浏览器内核提供,默认是多线程,负责页面渲染,脚本执行,事件处理gui线程
:- 渲染页面,解析 html 生成 DOM、css 生成 CSSOM,DOM 和 CSSOM 生成渲染树,布局和绘制页面
- 重绘和回流时该线程执行
- 与 js 引擎相互排斥,js 执行时,gui 进入阻塞状态,直到 js 执行完毕,才回到 gui 线程继续执行
js(引擎)线程
:- 执行 js 代码,包括 dom 操作
- 一直处于等待状态,直到 gui 线程执行完毕,才回到 js 线程继续执行(有 js 脚本优先执行,所以 js 会阻塞渲染)
事件触发线程
:- 用于控制事件循环
定时器线程
:- 用于控制定时器
异步请求线程
:- 用于控制异步请求
面试题 4:浏览器渲染进程
由浏览器内核提供,默认是多线程,负责页面渲染,脚本执行,事件处理
gui线程
:- 渲染页面,解析 html 生成 DOM、css 生成 CSSOM,DOM 和 CSSOM 生成渲染树,布局和绘制页面
- 重绘和回流时该线程执行
- 与 js 引擎相互排斥,js 执行时,gui 进入阻塞状态,直到 js 执行完毕,才回到 gui 线程继续执行
js(引擎)线程
:- 执行 js 代码,包括 dom 操作
- 一直处于等待状态,直到 gui 线程执行完毕,才回到 js 线程继续执行(有 js 脚本优先执行,所以 js 会阻塞渲染)
事件触发线程
:- 用于控制事件循环
定时器线程
:- 用于控制定时器
异步请求线程
:- 用于控制异步请求