进程&线程理解

160 阅读4分钟

抽象解释

进程: 进程是cpu资源分配的最小单位(是能拥有资源和独立运行的最小单位)

线程: 线程是cpu调度的最小单位(线程是建立在进程的基础上的一次程序运行单位,一个进程中可以有多个线程)

官方对进程和线程的描述比较抽象,不易理解

形象解释

计算机的核心CPU是一座工厂;

进程就是工厂里的车间;

线程就是车间里的工人;一个进程可以包括多个线程(一个车间里有多个工人)。

浏览器是多进程的

我所有的分析都是基于 Chrome 浏览器的。那么多浏览器,为什么偏偏选择 Chrome 浏览器呢?因为 Chrome、微软的 Edge 以及国内的大部分主流浏览器,都是基于 Chromium 二次开发而来;而 Chrome 是 Google 的官方发行版,特性和 Chromium 基本一样,只存在一些产品层面差异;再加上 Chrome 是目前世界上使用率最高的浏览器,所以 Chrome 最具代表性。

  • 以前:的浏览器架构是单进程的,所有功能模块都是运行在同一个进程中,就导致浏览器不稳定不流畅不安全
  • 现在:多进程浏览器,浏览器主进程渲染进程插件进程GPU进程
  • 未来:面向服务的架构(SOA)

浏览器进程:主要负责界面显示、用户交互、子进程管理,同时提供存储等功能。

渲染进程。核心任务是将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,排版引擎 Blink 和 JavaScript 引擎 V8 都是运行在该进程中,默认情况下,Chrome 会为每个 Tab 标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下。

GPU 进程。其实,Chrome 刚开始发布的时候是没有 GPU 进程的。而 GPU 的使用初衷是为了实现 3D CSS 的效果,只是随后网页、Chrome 的 UI 界面都选择采用 GPU 来绘制,这使得 GPU 成为浏览器普遍的需求。最后,Chrome 在其多进程架构上也引入了 GPU 进程。

网络进程。主要负责页面的网络资源加载,之前是作为一个模块运行在浏览器进程里面的,直至最近才独立出来,成为一个单独的进程。

插件进程。主要是负责插件的运行,因插件易崩溃,所以需要通过插件进程来隔离,以保证插件进程崩溃不会对浏览器和页面造成影响。

js是单线程语言

假设如果js同时有两个线程,同时对同一个DOM进行操作,这时浏览器应该听哪个线程的,如何判断优先级?

为了避免这种问题,js必须是一门单线程语言,并且在未来这个特点也不会改变。

有人会说Worker线程改变了JavaScript是单线程的本质, 接下来就讲讲web worker线程。

  • Worker线程: 为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程是完 全受主线程控制的,而且不得操作DOM

Web Worker

Web Worker 是 HTML5 标准的一部分,这一规范定义了一套 API,它允许一段 JavaScript 程序运行在主线程之外的另外一个线程中。Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。

在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。等到 Worker 线程完成计算任务,再把结果返回给主线程。这样的好处是,可以在独立线程中处理一些计算密集型或高延迟的任务,从而允许主线程(通常是 UI 线程)不会因此被阻塞或拖慢。(关于worker线程的详细内容以后再整理😁)