浏览器中的进程与线程

前言

  • 本文以Chrome浏览器为例,简单整理了浏览器中进程与线程的相关知识。
  • 以学习为目的,参考了网上的一些相关文章,结合了自己的理解,若表述有误烦请指出。

 

首先简单理解一下进程与线程。

1、进程

  • 进程是计算机中程序的一次运行活动,是系统进行资源分配的基本单位。通常我们启动一个程序,CPU便会开启一个进程,并给这个进程分配内存资源。
  • 任一时刻,一个CPU核心只能运行一个进程,其他进程处于挂起状态。(关于多进程,只是多个进程轮流占用CPU,且每次占用很短时间,这就是并发)
  • 进程之间相互独立,互不影响,一个进程不能直接访问其他进程中的资源。

2、线程

  • 线程是程序执行的最小单元。通常一个进程中包含了一个或多个线程。
  • 同一进程中的线程共享资源,且可以并行执行。
  • 某些线程之间存在相互制约的关系。

 

  有一个很形象的比喻。如果把CPU比作一个工厂,那么进程就是工厂中的一个个车间,不同车间相互独立。由于工厂资源有限,同一时间只能运作一个车间。而线程就好比是车间里的工人,多个工人共享一个车间,一起工作。

  进程与线程简单介绍到这里。

 

浏览器有多进程和多线程之分。

Chrome是多进程浏览器,一个标签页就可以看作一个进程,有时候多个标签页(如空白页)会合并到一个进程。除了管理标签页的Renderer进程外,还有Browser进程、GPU进程等其他多个进程。

通过浏览器中的 更多工具-任务管理器 可以看到如下图:

 

1、为什么采用多进程架构

  • 如果所有标签页在同一个进程中,那么某个标签页的崩溃会影响整个浏览器。而多个进程间独占资源,相互隔离,便可避免这个问题
  • 同样避免第三方插件崩溃而影响整个浏览器
  • 多进程充分利用多核优势
  • 由一个主进程来管理和控制其他进程对操作系统资源的访问,具有一定的安全性。

2、浏览器中的多进程

  1、Browser进程(主进程)

    浏览器主界面显示,处理用户交互,如前进后退

    管理其他进程,如创建和销毁其他进程,给其他进程分配资源

    将Renderer进程得到的内存中的Bitmap,绘制到用户界面中

    管理网络资源,如下载

  2、第三方插件进程

    通常一个插件对应一个进程,仅当使用该插件时才创建

  3、GPU进程

    最多一个,用于图形处理,3D绘制等

  4、Renderer进程(渲染进程、渲染引擎、浏览器内核)

    通常一个标签页对应一个Renderer进程

    从主进程中获取页面资源

    解析并渲染页面

    处理JavaScript脚本等

 

3、浏览器中的多线程

  例如Browser进程、Renderer进程等,内部有那么多任务,为了保证运行速度,进程中会有多个线程并行工作。

 

  Browser进程中的线程

    UI线程:该线程是程序运行的主线程,是程序的入口点,用来处理用户交互,如监听用户输入、前进后退等。同时,会分发任务给其他相应线程去执行。

    IO线程:处理Browser进程与其他进程进行进程间通信,下载Renderer进程所需的资源文件等

    File线程:读取磁盘文件、下载文件到磁盘等

    数据库线程:进行一些数据库操作,如保存Cookie到数据库

    历史记录线程

    http服务代理线程

    ......

 

  Renderer进程中的线程

    GUI渲染线程:解析html、css等文件,渲染页面,处理页面的重绘与回流

    JavaScript引擎线程:处理JavaScript脚本(注意,该线程与渲染线程是互斥的,当该线程执行时,渲染线程会被挂起,等到该线程空闲时再执行)

    事件触发线程:当一个事件被触发时,将其添加到事件队列尾部,由于JavaScript引擎是单线程,所以必须等待其空闲时才会事件队列中的事件

    定时器线程:由于JavaScript引擎是单个线程,存在阻塞,会影响计时的准确性,所以计时由单独的线程控制

    异步http请求线程:在XMLHttpRequest连接后,新开一个线程请求。检测到状态变更时,如果设有回调函数,异步线程就产生状态变更事件,放到事件队列等待处理

 

4、Browser进程与Renderer进程如何通信(以开启一个新页面为例)

  • Browser进程中的UI线程处理用户交互,接收到用户请求,转交给IO线程
  • Browser进程中的IO线程获取页面内容(如通过网络请求),随后将该任务通过RendererHost接口传递给Renderer进程
  • Renderer进程的Renderer接口收到消息,简单解释后交给渲染线程,进行html、css解析,渲染页面,js执行等任务
  • Renderer进程将得到的结果传递给Browser进程
  • Browser进程接收到结果并在界面上绘制出图像

 

 

 

参考资料:

 

posted @ 2018-03-13 23:21 Lifetime_yo 阅读(...) 评论(...) 编辑 收藏