1、基本概念
进程
cpu资源分配的最小单位(能拥有资源和独立运行的最小单位)
线程
cpu调度的最小单位(建立在进程的基础上的一次程序运行单位,一个进程可以有多个线程)
CPU
其实就是电脑的一块芯片,但发挥着巨大作用,主要是控制计算机的运行,是电脑的中央处理器。能够串行地处理一个接一个的任务,相当于人类的大脑,有着不可替代的位置。
GPU
是附属型的处理器,主要处理图形相关的工作,将数据呈现在显示器中。与硬件加速相关。能够并行的处理任务,处理的数据量较大。
2、三层基础架构
当我们电脑打开一个app应用的时候,其实背后是GPU和CPU在支撑着应用的运行。当app创建一个进程时,操作系统级就会为这个进程开辟一片私人空间,里面存储着这个进程所有的数据和状态。当这个进程被关闭时,进程所对应的空间也会被操作系统释放掉。同时,操作系统的运行也离不开计算机硬件的支持。
计算机系统由于计算机硬件和计算机软件组成。计算机硬件包括CPU芯片,输入输出设备,存储器等等。计算机软件包括操作系统,工具软件,系统软件等。
3、进程和线程是如何工作的呢?
浏览器有两种架构,单进程架构和多进程架构。
单进程架构
启动一个进程,这个进程里面有多个线程工作。只有IE7以下和早期的火狐是单进程架构,其他浏览器几乎是多进程架构。
缺点:
不稳定,不流畅,不安全
- 不流畅
如果浏览器只有一个进程,当这个进程执行的程序比较复杂时,就容易导致整个浏览器崩溃。比如当程序正在执行3d动画时,突然CPU被某个插件抢去执行那个插件的任务,那么3d动画的任务就会被阻塞,当插件任务执行完将cpu还给3d动画时,中间已经停留了一段时间,这段时间呈现给用户的视觉就是很卡顿。
- 不稳定
在单进程架构中,如果某一段程序陷入死循环,又或者某个插件崩溃,那么将导致整个浏览器崩溃,所以是非常不稳定的。
- 不安全
因为在一个进程中,可以有多个线程。这个进程中的所有资源对于在这个进程中的所有线程是共享的。所以一旦某个恶意插件通过某个线程入侵的话,这个恶意插件就能获取这个进程中的所有资源信息,这里面就有可能有用户的账号和密码以及其他私密信息,后果可想而知是非常可怕的。
优点
节约资源
因为浏览器每创建一个进程,操作系统都会为这个进程开辟一块空间,所以创建的进程越多,操作系统分配的资源越多。如果只创建一个进程,就只会开辟一块空间。
多进程架构
启动多个进程,每个进程可以有多个线程,不同进程通过IPC机制进行通信。
缺点:
比较复杂,资源耗费较多
优点
保持用户界面高响应度。保证UI线程不被其他费时的操作阻碍从而影响对用户的操作响应。
4、多进程的线程分工
browser进程
管理和调配子进程,负责浏览器页面的展示,标签的管理,负责其他进程的创建和销毁工作。
renderer进程
负责页面的渲染,脚本执行,时间处理,主要有一下几个线程
- GUI渲染线程
主要负责网页的渲染工作
- js引擎线程
主要负责解析和处理js脚本
- 事件触发线程
控制轮询事件的执行。当事件达到触发条件时,事件就会被放进js引擎的执行任务队列中,等待被执行。
- 定时器触发线程
定时器的计时工作不是由js引擎执行的,是事件触发线程去计时的 。计时完成后,事件触发线程会将定时器的回调事件放入js引擎的执行任务队列中,等待被执行。
- 异步http请求线程
当请求完成后 ,如果有回调函数,事件触发线程就会将事件放入js引擎的执行任务队列中,等待被执行
插件进程
加载插件,比如众所周知的flash插件
GPU进程
最多只有一个,只有当GPU硬件加速被打开的时候进程才会被创建,主要用于3D绘图。
网络进程
发起网络请求(早期在browswer进程中)
5、实例分析
当浏览器收到用户的操作请求时,浏览器进程的UI线程就会将任务进行解释然后传递给IO线程。Browser进程的任务经过IO线程传递给Renderder进程的IO线程。renderer进程的IO线程收到任务,然后进行简单的解释再继续交给渲染进程,然后渲染进程就开始渲染。这其中可能会有获取资源的操作,也有可能需要执行3d动画 ,所以在渲染的过程中 ,需要Browser进程和GPU进程的协助才能顺利完成渲染。最后renderer进程将渲染完的结果经IO线程传递给Browser进程,Browser进程收到结果后将结果展示在浏览器页面上,整个过程就这样。