Chrome架构

Chrome架构

Posted by limantang on August 9, 2019

Chrome架构

  1. 明确进程和线程的概念

    • 什么是并行处理

      并行处理就是计算机同一时刻处理多个任务(时间分片)

      假如要计算如下代码

      A = 1 + 2;
      B = 20 / 5;
      C = 7 * 8;
      

      上述可以拆解为四个任务

      1. 计算A = 1 + 2
      2. 计算B = 20 / 5
      3. 计算C = 7 * 8
      4. 显示最后结果

      如果是单线程那么只能按照顺序依次来处理这四个任务

      如果是多线程只需要分为两步

      • 使用三个线程同时执行前三个任务
      • 再执行第四个显示任务
    • 线程 VS 进程

      多线程可以并行处理任务, 但是线程不是单独存在的, 线程是由进程启动和管理的

    • 什么是进程

      一个进程就是一个程序运行的实例, 在启动一个程序的时候, 操作系统会为这个进程创建一块内存, 用来存放代码和运行中需要的数据和一个执行任务的主线程, 这样一个运行环境就是进程

      线程是依附于进程的, 进程中使用多线程并行处理可以提高执行效率

    • 进程和线程之间的关系

      1. 进程中任意一线程执行出错, 都会导致整个进程崩溃

      2. 线程之间是共享进程中的数据的

      3. 当一个进程关闭以后,操作系统会回收进程所占用的内存

      4. 进程之间的内容相互隔离

        进程隔离是为保护操作系统中的进程互不干扰技术, 每个进程只能访问自己占有的数据, 避免进程之间的数据干扰, 正是因为这样, 如果一个进程挂掉了, 是不会影响到其他进程的, 如果进程之间需要通信就要使用进程间通信机制(IPC)

  2. 单进程浏览器时代

    顾名思义, 单进程浏览器是指浏览器所有的功能模块都是运行在同一进程里

    这些模块包含了JS运行环境, 渲染引擎, 页面, 插件等

    带来的问题就是不稳定, 不流畅, 不安全

  3. 多进程浏览器

    一个页面(tab页)运行在单独的渲染进程中, 插件运行在插件进程(早期的多线程架构)

    多进程浏览器解决了上述的几个问题

    • 解决不稳定

      由于进程之间相互隔离, 就算一个页面崩溃, 或者插件崩溃, 都不会影响到页面进程等其他进程

    • 解决不流畅问题

      JS运行在渲染进程中, 即使JS阻塞了渲染进程, 影响的只是当前渲染的页面, 并不会影响浏览器的其他页面

      也解决了内存泄漏的问题, 当一个页面关闭, 随之一个进程被关闭, 所占的内存会被操作系统回收

    • 解决不安全问题

      多进程的好处是可以使用安全沙箱, 沙箱可以看成是操作系统给浏览器的进程上了一把锁, 沙箱内的程序可以运行, 但是不能再硬盘上写数据, 也不能读取敏感位置的数据

    现在的多线程架构

    渲染进程: 将HTML, CSS,JS转换为用户可以交互的网页, V8引擎就运行在此, 默认情况Chrome会为每个tab页创建一个渲染进程, 渲染进程运行于沙箱模式

    网络进程: 负责网络资源加载

    插件进程: 负责运行插件, 由于插件容易崩溃, 所以单独独立出来

    GPU进程: 用来绘制UI界面

    浏览器主进程: 负责页面显示, 用户交互, 字进程管理, 提供存储功能

带来的问题

  • 更高的资源占用
  • 更富在的体系结构
  1. 未来的Chrome架构

    面向服务的架构(SOA), 原来的各种模块会被独立成服务, 每个服务都可以在独立的进程中运行, 访问服务必须使用定义好的接口, 用过IPC来通信, 从而构建一个更内聚, 松耦合, 易维护, 易扩展的系统