Skip to content

宏观角度下的浏览器 #60

@YIngChenIt

Description

@YIngChenIt

线程和进程的概念

  • 进程是 CPU 资源分配的最小单位, 或者说一个进程就是一个程序的运行实例。详细解释就是,启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,我们把这样的一个运行环境叫进程。
  • 线程是 CPU 调度的最小单位

举个例子:

对于操作系统来说,一个任务就是一个进程,比如打开一个浏览器就是启动了一个浏览器进程,打开一个 Word 就启动了一个 Word 进程。有些进程同时不止做一件事,比如 Word,它同时可以进行打字、拼写检查、打印等事情。在一个进程内部,要同时做多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程。

线程和进程的关系

  • 进程中的任意一线程执行出错,都会导致整个进程的崩溃。
  • 线程之间共享进程中的数据。
  • 当一个进程关闭之后,操作系统会回收进程所占用的内存。
  • 进程之间的内容相互隔离。

浏览器的多进程架构

  • 浏览器进程: 主要负责界面显示、用户交互、子进程管理,同时提供存储等功能。
  • 渲染进程: 核心任务是将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,排版引擎 Blink 和 JavaScript 引擎 V8 都是运行在该进程中,默认情况下,Chrome 会为每个 Tab 标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下。
  • GPU 进程: GPU 的使用初衷是为了实现 3D CSS 的效果,只是随后网页、Chrome 的 UI 界面都选择采用 GPU 来绘制
  • 网络进程: 主要负责页面的网络资源加载。
  • 插件进程: 主要是负责插件的运行

在浏览器里,从输入 URL 到页面展示,这中间发生了什么?

1、【用户输入(浏览器进程处理的)】
当用户在地址栏中输入一个查询关键字时,地址栏会判断输入的关键字是搜索内容,还是请求的 URL。

  • 如果是搜索内容,地址栏会使用浏览器默认的搜索引擎,来合成新的带搜索关键字的 URL。
  • 如果判断输入内容符合 URL 规则,那么地址栏会根据规则,把这段内容加上协议,合成为完整的 URL。
  • 然后用户按下回车会发现,浏览器进入loading状态,但是页面并没有马上被替换,还是老的页面。

2、【URL 请求过程】

  • 浏览器进程会通过进程间通信(IPC)把 URL 请求发送至网络进程,网络进程接收到 URL 请求后,会在这里发起真正的 URL 请求流程。

  • 首先,网络进程会查找本地缓存是否缓存了该资源。如果有缓存资源,那么直接返回资源给浏览器进程;如果在缓存中没有查找到资源,那么直接进入网络请求流程。

  • 请求前的第一步是要进行 DNS 解析,以获取请求域名的服务器 IP 地址。

  • 如果请求协议是 HTTPS,那么还需要建立 TLS 连接。

  • IP 地址进行寻址排队,因为浏览器一次只能发送6个http请求。

  • 接下来就是利用 IP 地址和服务器建立 TCP 连接。

  • 然后发起http请求,等待服务器响应结果.

  • 如果浏览器返回301、302 这2个状态码,浏览器会跳转到新的地址继续导航。如果浏览器返回304,则去查询浏览器缓存进行返回。如果浏览器返回200,那么表示浏览器可以继续处理该请求。

  • 如果发现浏览器响应数据的 Content-Typetext/html,这个时候浏览器会将下载的资源交给渲染进程处理。

3、【准备渲染进程】

1、通常情况下,打开新的页面都会使用单独的渲染进程;

2、如果从 A 页面打开 B 页面,且 A 和 B 都属于同一站点的话,那么 B 页面复用 A 页面的渲染进程;如果是其他情况,浏览器进程则会为 B 创建一个新的渲染进程。

4、【提交文档】

之前说浏览器在用户敲回车的时候,还是老的界面,那是什么时候开始出现新的界面的加载呢?

这涉及到一个词叫 提交文档 。首先文档是指 URL 请求的响应体数据。

  • “提交文档”的消息是由浏览器进程发出的,渲染进程接收到“提交文档”的消息后,会和网络进程建立传输数据的“管道”。

  • 等文档数据传输完成之后,渲染进程会返回“确认提交”的消息给浏览器进程。

  • 浏览器进程在收到“确认提交”的消息后,会更新浏览器界面状态,包括了安全状态、地址栏的 URL、前进后退的历史状态,并更新 Web 页面。

5、【渲染阶段】

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions