Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

浏览器架构 #15

Open
su-Pro opened this issue Apr 29, 2020 · 0 comments
Open

浏览器架构 #15

su-Pro opened this issue Apr 29, 2020 · 0 comments

Comments

@su-Pro
Copy link
Owner

su-Pro commented Apr 29, 2020

chrome浏览器

讨论的是基于Chromium内核开发的浏览器,但其他的像FireFox 内核Quantum 其实也差不多。

市面上占有率比较高,基本上都是基于Chromium 或者特性相同

进程和线程

概念:

  • 线程是不能单独存在的,由进程来启动和管理的
  • 一个进程就是一个程序的运行实例;启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,我们把这样的一个运行环境叫进程

2585610E-C9E0-472E-B9FA-E98E274FCE76

关系:

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

单进程浏览器时代

单进程浏览器是指浏览器的所有功能模块都是运行在同一个进程里,这些模块包含了网络、插件、JavaScript 运行环境、渲染引擎等。

322520CD-DB28-46A2-AB74-3C7AF136E686

功能模块运行在一个进程里,是导致单进程浏览器不稳定不流畅不安全

不稳定


  • 插件是最容易出问题的模块,并且还运行在浏览器进程之中,所以一个插件的意外崩溃会引起整个浏览器的崩溃。
  • 渲染引擎模块也是不稳定的,通常一些复杂的 JavaScript 代码就有可能引起渲染引擎模块的崩溃。

不流畅

“单进程浏览器架构示意图”可以看出,所有页面的渲染模块、JavaScript 执行环境以及插件都是运行在同一个线程中的,这就意味着同一时刻只能有一个模块可以执行。

不安全

  • 插件可以使用 C/C++ 等代码编写,通过插件可以获取到操作系统的任意资源,当你在页面运行一个插件时也就意味着这个插件能完全操作你的电脑。
  • 页面js脚本,它可以通过浏览器的漏洞来获取系统权限

多进程时代

未知

  • 浏览器进程。主要负责界面显示、用户交互、子进程管理,同时提供存储等功能。
  • 渲染进程。核心任务是将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,排版引擎 Blink 和 JavaScript 引擎 V8 都是运行在该进程中,默认情况下,Chrome 会为每个 Tab 标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下。
  • GPU 进程。其实,Chrome 刚开始发布的时候是没有 GPU 进程的。而 GPU 的使用初衷是为了实现 3D CSS 的效果,只是随后网页、Chrome 的 UI 界面都选择采用 GPU 来绘制,这使得 GPU 成为浏览器普遍的需求。最后,Chrome 在其多进程架构上也引入了 GPU 进程。
  • 网络进程。主要负责页面的网络资源加载,之前是作为一个模块运行在浏览器进程里面的,直至最近才独立出来,成为一个单独的进程。
  • 插件进程。主要是负责插件的运行,因插件易崩溃,所以需要通过插件进程来隔离,以保证插件进程崩溃不会对浏览器和页面造成影响。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant