深入理解浏览器中的进程与线程

364次阅读  |  发布于3年以前

进程和线程的联系和区别

当我们启动某个程序时,操作系统会给该程序创建一块内存(当程序关闭时,该内存空间就会被回收),用来存放代码、运行中的数据和一个执行任务的主线程,这样的一个运行环境就叫进程

线程是依附于进程的,在进程中使用多线程并行处理能提升运算效率,进程将任务分成很多细小的任务,再创建多个线程,在里面并行分别执行

进程和线程的关系特点是这样的:

早期浏览器

2007年以前浏览器并不是多进程的结构,而是单进程的结构,一个进程中包含了网络、JS运行环境、渲染引擎、页面、插件等,这也导致单进程的结构引发了很多问题

所以为了解决这些问题,才发展出了多进程结构

我们来看一下目前最新的Chrom有进程架构

Chrome 打开一个页面有多少进程?分别是哪些

浏览器从关闭到启动,然后新开一个页面至少需要:1个浏览器进程,1个GPU进程,1个网络进程,和1个渲染进程,一共4个进程

后续如果再打开新的标签页:浏览器进程,GPU进程,网络进程是共享的,不会重新启动,然后默认情况下会为每一个标签页配置一个渲染进程,但是也有例外,比如从A页面里面打开一个新的页面B页面,而A页面和B页面又属于同一站点的话,A和B就共用一个渲染进程,其他情况就为B创建一个新的渲染进程

所以,最新的Chrome浏览器包括:1个浏览器主进程1个GPU进程1个网络进程多个渲染进程,和多个插件进程

我们平时看到的浏览器呈现出页面过程中,大部分工作都是在渲染进程中完成,所以我们来看一下渲染进程中的线程

渲染进程中的线程

说下浏览器的进程、线程模型,线程模型中的每个线程都是干嘛用的?

Chrome为例,有四种进程模型,分别是

线程模型中的线程都是干嘛的呢?

每一个Chrome的线程,入口函数都差不多,都是启动一个消息循环,等待并执行任务

你知道哪些进程间通信的方式?

(主从式、会话式、消息-邮箱机制、管道、共享内存、Unix Domain Socket,然后跟他讲我看过 Chromium IPC 的源码,内核里面把以前的 ChannelPosix 换成了 ChannelMojo,从而达到线程安全的目的,顺便解释了下线程安全,面试官表示很欣赏,说这个都看过,看来你学了不少)

多标签之间怎么通信?

没有办法直接通信,需要有一个类似中介者进行消息的转发和接收,比如

你知道僵尸进程和孤儿进程吗?

参考

浏览器工作原理与实践

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8