chrome架构了解

165 阅读5分钟

本文是 01 | Chrome架构:仅仅打开了1个页面,为什么有4个进程?的学习笔记,chrome架构的知识点基本来自于此。

1 名词解释

1.1 进程和线程

进程(Process)

  • 是应用程序的运行实例,操作系统进行资源(内存、磁盘IO等)分配的最小单元
    每个进程都有独立的内存空间,存放代码和数据
  • 两个进程间如果需要通信,需要用到IPC(Inter Process Communication)机制

线程(Thread)
进程运行和执行的最小调度单位,也是CPU调度的最小单位。同一进程内的线程共享内存空间。

操作系统能同时运行多个进程,一个进程可以有多个线程同时执行(通过CPU调度)。
进程会默认启动一个线程,我们把它叫做主线程,主线程又可以启动新的线程。

JS执行就是单线程的(JS引擎中负责解释和执行代码的线程只有一个,同一时间只能执行一个任务),
python执行是多线程的。

JS 中其实是没有线程概念的,所谓的单线程也只是相对于多线程而言。JS 的设计初衷就没有考虑这些,针对 JS 这种不具备并行任务处理的特性,我们称之为 “单线程”。 —— 来自知乎 “如何证明 JavaScript 是单线程的?” @云澹的回答

import threading, time

print('thread %s is running...' % threading.current_thread().name)

counter = 0
def add(a , b):
    print('thread %s is running...' % threading.current_thread().name)
    global counter
    counter = a + b
    # 停1s
    time.sleep(1)
    print('thread %s ended.' % threading.current_thread().name)

def multiply(a, b):
    print('thread %s is running...' % threading.current_thread().name)
    global counter
    counter = a * b
    print('thread %s ended.' % threading.current_thread().name)

t1 = threading.Thread(target=add, args=(4,5), name='Task1')
t2 = threading.Thread(target=multiply, args=(4,5), name='Task2')
t1.start()
t2.start()

print('counter is  %d' % counter)
print('thread %s ended.' % threading.current_thread().name)

Xnip2022-09-20_09-41-25.jpg 加上主进程共有三个进程,都可以访问counter变量。

1.2 沙盒

Sandbox(又叫沙盒、沙箱),是一种安全机制,为执行中的程序提供一个完全隔离的环境,以避免对系统造成伤害。沙盒通常会限制程序所能存取的资源,包括磁盘和内存空间。
浏览器中就内置了沙盒。

1.3 面向服务的架构

Services Oriented Architecture(简称 SOA),是一种软件开发方法,使用服务的组件来创建业务应用程序。每种服务提供一种业务能力,服务可以跨平台和语言相互通信。开发人员可使用这些独立的服务来执行复杂的任务。

这貌似就是我们日常说的微服务架构

2. 多进程架构

文章写于2022-09-20,版本是105.0.5195.125(正式版本) (x86_64)

2.1 架构

Xnip2022-09-20_20-51-14.jpg chrome启动后的进程包括

  • 一个浏览器主进程
  • 一个网络进程
  • 一个GPU进程
  • 一个缓存进程
  • N个渲染进程

还可能会有

  • 一个音频进程
  • N个插件进程(得看自己装了多少插件)

能看到chrome中的进程吗?
可以。通过浏览器的任务管理器查看即可: Xnip2022-09-20_20-47-01.jpg 打开一个空白标签页
Xnip2022-09-21_09-12-45.jpg

打开了两个窗口、4个标签页后的进程列表 Xnip2022-09-20_20-47-12.jpg 4个标签页对应的进程是渲染进程

我已经知道了chrome启动的进程,但它们分别是有什么用勒?

2.2 进程功能

  1. 浏览器进程
    负责界面显示、用户交互,子进程管理功能
    子进程管理:将存储进程结束,浏览器进程会重新启动一个
    Xnip2022-09-21_09-19-57.jpg 直接结束浏览器进程,效果和退出浏览器相同

  2. 渲染进程
    将HTML、CSS和JS转换为用户可以与之交互的网页
    其他:

    • JS V8引擎运行在该进程中
    • 默认情况,chrome会为每个tab标签创建一个渲染进程
    • 出于安全考虑,渲染进程都是运行在沙箱模式下(这里以后再讨论)

    结束知乎的那个渲染进程后,此页面不能正常显示了,别的页面未受影响 Xnip2022-09-20_21-08-34.jpg

  3. GPU进程
    负责3D效果、动画、图片等渲染 Xnip2022-09-21_09-33-27.jpg

  4. 网络进程
    负责网络资源加载

  5. 缓存进程(Storage)
    负责提供浏览器存储,是从主进程中分离出来的服务。(李兵老师的文章上这个功能是写在主进程中的,但我看进程列表的时候已经分离出来了)

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

  7. 音频进程
    负责处理音频、视频

3. 面向服务的架构

2016年,chrome使用了“面向服务的架构”思想设计和新的Chrome架构。原来的模块会被独立成服务(Service),每个服务都可以在独立的进程中运行,访问服务必须使用定义好的接口,通过IPC通信,从而构建一个高内聚、低耦合、易于扩展和维护的系统。
chrome最终要把UI、数据库、文件、设备网络等重构为基础服务

Xnip2022-09-21_20-55-12.jpg

现在是2022年,应该处于过渡期。
从的截图来看,已经有部分模块被独立成了服务。尝试在网页中上传附件,并没有新增文件服务Xnip2022-09-21_20-56-19.jpg

这两种架构从现有资料来看对前端开发和用户来说没看出来有更多的提升(说是有资源使用的优化,但看不出来),更多应该是对浏览器开发人员的不同。

参考文章