什么是进程?
进程是cpu资源分配的最小单位。
什么是线程?
线程是cpu调度的最小单位。
CPU 资源分配?CPU 调度?感觉还是不太懂。。
大概可以理解为:
– 进程可以理解为正在运行的程序实例
– 线程是进程内的一个程序运行单位
– 一个进程可以有一个或多个线程
– 不同进程间的数据难以共享,但同一进程下不同线程的数据共享很容易
– 进程比线程更消耗计算机资源
– 进程间相互不影响
操作系统中的进程与线程
现代的操作系统都是支持多任务的操作系统,如Mac OS,Windows,Linux等。
多任务:操作系统可以同时运行多个任务
单核CPU执行多任务(伪并行)
在这之前先要了解一下任务调度:大部分的操作系统都是采用时间片轮转的抢占式调度方式。比如CPU执行任务A就只能执行一小段时间,如果分配给它的时间片用完了就强制暂停执行下一个任务B,任务A只能等下一次CPU的临幸。
CPU在进程间快速切换对各个任务交替执行,每个程序运行几十或几百毫秒,由于CPU的执行速度很快,让我们产生并行的错觉,这才是多任务同时运行的本质。
注:
严格来说,在某一个瞬间,CPU只能运行一个进程!
多核CPU执行多任务(真并行)
现在大多都是多核CPU,真正的并行执行多任务只能在多核CPU上实现,但任务数量远远超过CPU核数量,操作系统会把任务轮流调度到不同核上执行。
例子
对于操作系统来说一个任务就是一个进程,比如打开word就启动了一个进程,但在word中不止做一件事,他需要同时做打字,打印等不同的子任务,在进程中这些子任务就被称为线程,一个进程中至少有一个线程,像word这种就是多线程的,他的原理和单核CPU执行多任务是一样的,由操作系统控制进行交替执行这些子任务。
? 了解了操作系统中的进程与线程,让我们来看看天天打交道的浏览器~
浏览器中的线程与进程
浏览器是多进程的,每打开一个tab标签,实际上是新创建了一个浏览器进程。
浏览器为什么是多进程的?
早期网页非常简单,每个网页的资源占有率很低,一个进程处理多个网页是可行的。而如今,网页变得日益复杂,浏览器面临响应速度,安全性,健壮性等方面的挑战。如果一个tab页崩溃会导致浏览器的崩溃,再加上现在大多计算机都是多核的,多进程也能充分利用多核,所以浏览器大多是多进程的。
浏览器中的进程组成
- 主进程:只有一个,负责协调,管理
- 第三方插件进程:仅使用插件时才创建
- GPU进程:最多一个,用于3D绘制
渲染进程(浏览器内核):内部是多线程的,负责渲染页面,执行脚本,事件处理等
浏览器内核有哪些线程组成
- GUI渲染线程:渲染页面,重绘,回流
- JS引擎线程(JS内核):处理Js脚本程序(解析脚本,执行代码)
- 事件触发线程:控制事件循环,将事件存放到队列中等待Js引擎处理
- 定时器触发线程:由于JS是单线程,处于阻塞状态会影响计时的准确性,需要单独开线程进行计时,计时完后加入事件队列等Js引擎处理(setInterval,setTimeout)
- 异步请求线程:检测状态变更将其加入事件队列中等Js引擎处理
GUI渲染线程与JS引擎线程是互斥的
由于Js是可操作DOM的,如果同时修改元素和渲染界面,会导致渲染线程前后获得的元素数据不一致,出现不可预期的结果。所以当JS引擎执行时GUI线程会暂停,其更新被暂时存放到一个队列中直到JS引擎空闲时立即执行。
如果JS执行时间过长,会阻塞页面的渲染,导致较差的用户体验怎么办呢?
可以用HTML5 web worker:Js引擎向浏览器开子线程(浏览器开的)
– wasm
– Long task