客户端容器 | 青训营笔记

87 阅读3分钟

客户端容器

本文将从四个方面来介绍有关客户端容器的有关概念,分别是浏览器架构,渲染进程,Chrome运行原理

1.浏览器架构

1.演变:

  • 单进程架构:所有的模块运行在同一个进程里,包含网络、插件、JavaScript运行环境等。
  • 多进程架构:主进程、网络进程、渲染进程、GPU进程、插件进程。由多个进程共同完成某些任务。
  • 面向服务架构:将原来的UI、数据库、文件、设备、网络等,作为一个独立的基础服务。
tips: 单进程架构由于其的单一性,导致其可扩展性比其他两者更低,而且单进程架构中的第三方插件可以随意访问并修改系统资源,导致其的安全性和稳定性差并且最关键的是,这种架构卡!!!!

2.多进程的分工

  • 主进程:主要负责页面展示逻辑、用户交互、子进程管理;包括地址栏、书签、前进、后退、收藏夹等。
  • GPU进程:负责UI绘制,包含整个浏览器全部UI。
  • 网络进程:网络服务进程,负责网络资源加载。
  • 渲染进程:管理标签页,控制Tab内的所有内容,将HTML、CSS和JavaScript转换为用户可交互的网页。
  • 插件进程:控制网站运行的插件,比如Flash、ModHeader等。
  • 其他进程:适用程序Storage/Network/Audio Service等。

2.渲染进程

1.构成的线程

  • JS引擎:负责解析JS脚本,运行JS程序,每个渲染进程下面只有一个JS引擎线程,与GUI渲染线程互斥,如果JS任务执行时间过长,会导致页面卡顿。
  • GUI渲染:负责渲染浏览器界面,解析HTML、CSS、构建dom树和render树、布局、绘制,和JS引擎线程互斥,GUI更新会在JS引擎空闲时立即执行。
  • 定时器触发:定时器所在线程,setTimeout、setinterval计时完毕后,将回调添加到事件队列,等待JS引擎执行。
  • 网络线程:在XHR、Fetch等发起请求后新开一个网络线程请求,如果设置了回调函数,在状态变更时,将回调放入事件队列,等待JS引擎执行。
  • 事件触发:由宿主环境提供,用于控制事件循环,不断地从事件队列里取出任务执行。

2.多线程工作流程

  • 网络线程负责加载网页资源
  • JS引擎解析JS脚本并且执行
  • JS解析引擎空闲时,渲染线程立即工作
  • 用户交互、定时器操作等产生回调函数放入任务队列中
  • 事件线程进行事件循环,将队列里的任务取出交给JS引擎执行

3.Chrome运行原理

1.输入处理

用户URL框输入内容后,UI线程会判断输入的是一个URL地址呢?还是一个query查询条件;如果是URL,直接请求站点资源;如果是query,将输入发送给搜索引擎

2.开始导航

当用户按下回车,UI线程通知网络线程发起一个网络请求,来获取站点内容;请求过程中,TAB处于loading状态

3.读取响应

网络线程接受到HTTP响应后,先检查响应头的媒体类型(MIME Type);如果响应主体是一个HTML文件,浏览器将内容交给渲染进程处理;如果拿到的是其他类型文件,比如Zip、exe等,则交给下载管理器处理

4.渲染进程寻找

网络线程做完所有检查后,会告知主进程数据已准备完毕,主进程确认后为这个站点寻找一个渲染进程;主进程通过IPC消息告知渲染进程去处理本次导航;渲染进程开始接收数据并告知主进程自己已开始处理,导航结束,进入文档加载阶段

本文章对于客户端容器的叙述到此为止,如有错误,敬请指正。