进程和线程
进程:程序运行的独立专属内存空间,每个应用都至少有一个进程,进程之间相互独立,即使要通信也需要双方同意。
线程:进程的一个执行任务(控制单元)负责当前进程中程序的执行,每一个进程都至少有一个线程,所以进程开启后会自动创建一个线程来运行代码,该线程称之为主线程。一个进程中可以包含多个线程
根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位
影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
浏览器有哪些进程和线程?
浏览器,是一种多进程多线程的应用程序,在浏览器中打开一个网页相当于新起了一个进程,当然,浏览器也有它自己的优化机制,比方说有五个空白页,这五个空白页会合并成同一个进程。
主要进程:
- 浏览器进程: 主要负责界面显示,用户交互,子进程管理等,浏览器进程内部会启动多个线程处理不同的任务。
- 网络进程:负责加载网络资源。
- 渲染进程:渲染进程启动后会开启一个渲染主线程,主线程负责执行HTML、css、js代码。(前端代码都是在渲染进程执行的)
- GPU进程:仅有一个,用于3D绘制。
- 第三方插件进程:每一种插件都有一个进程,只有在插件运行时才启动。
浏览器多进程优势
- 避免单个页面崩溃造成整个浏览器的卡顿.
- 避免第三方插件崩溃影响整个浏览器
- 多进程充分利用多核优势
浏览器渲染进程有哪些线程:
- GUI渲染线程:- 负责渲染浏览器界面,解析HTML,CSS,构建DOM树和RenderObject树,布局和绘制等。 GUI渲染线程与JS引擎线程是互斥的 ,当JS引擎执行时GUI线程会被挂起,GUI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。
- JS引擎线程:也称为JS内核,负责处理Javascript脚本程序,JS引擎一直等待着任务队列中任务的到来,然后加以处理
- 事件触发线程:用来控制事件循环。
- 定时触发器线程:
setInterval
与setTimeout
所在线程,浏览器定时计数器并不是由JavaScript引擎计数的,(因为JavaScript引擎是单线程的, 如果处于阻塞线程状态就会影响记计时的准确) - 异步http请求线程:在XMLHttpRequest在连接后是通过浏览器新开一个线程请求
从Event Loop谈JS的运行机制
- JS分为同步任务和异步任务
- 异步任务可以分为宏任务(macrotask)和微任务(microtask)
- 同步任务都在主线程上执行,形成一个
执行栈
- 事件触发线程 管理着两个
任务队列
,分别为宏任务队列和微任务队列。
事件循环的流程:在事件循环中,每进行一次循环操作称为 tick,关键步骤如下:
- 执行栈执行同步任务
- 同步任务执行完后,会询问微任务队列是否有任务,如果有就就执行微任务队列直到清空。
- 当微任务队列执行完后,GUI渲染进程会经行渲染。
- 执行栈会去宏任务队列查询是否有任务等待,如果有继续上面的流程。