前端进阶——浏览器篇

news2024/9/21 22:45:15

 浏览器如何工作(一)进程架构 

浏览器的工作过程复杂而高效,其核心在于其进程架构的设计。以下是对浏览器进程架构的详细解析:

一、浏览器的主要进程

现代浏览器大多采用多进程多线程的架构,以Chrome浏览器为例,其主要进程包括:

  1. 浏览器进程(Browser Process)
    • 功能:作为浏览器的主进程,负责浏览器的整体控制和资源协调,包括用户界面的展示(如地址栏、书签栏等)、网络请求的管理、以及与其他进程的通信等。
    • 关键线程
      • UI线程:控制浏览器上的按钮及基础界面的展示。
      • 网络线程(Network Thread):主要用于处理网络请求,如DNS解析、建立TLS连接等。
      • 存储线程(Storage Thread):用于控制文件访问。
      • IO线程:主要用于进程间通信。
  2. 渲染进程(Renderer Process)
    • 功能:负责页面的渲染工作,包括HTML、CSS的解析,JavaScript的执行,以及页面的布局和绘制等。
    • 数量:通常每个标签页对应一个渲染进程,但也可能根据浏览器的优化策略有所不同(如Process-per-site-instance、Process-per-site等模式)。
    • 关键线程
      • GUI渲染线程:负责页面的渲染工作,如解析HTML和CSS、构建DOM树、CSSOM树、Render树,以及绘制页面等。
      • JavaScript引擎线程:负责解析和执行JavaScript代码,与GUI渲染线程互斥。
      • 定时器线程:处理setIntervalsetTimeout等定时器任务,计时完毕后将任务添加到事件队列中等待JavaScript引擎线程执行。
      • 异步HTTP请求线程:当发起网络请求时,浏览器会新开一个线程来处理这些请求,并在请求状态变化时将回调放入事件队列中。
      • 事件触发线程:用于控制事件循环,将任务添加到事件队列中,并在适当的时候将其分发给JavaScript引擎线程执行。
  3. GPU进程(GPU Process)
    • 功能:负责处理与图形渲染相关的任务,如将渲染进程计算出的图像帧绘制在屏幕上。
  4. 插件进程(Plugin Process)
    • 功能:负责运行浏览器插件,如Flash插件等。这些插件通常运行在独立的进程中,以提高安全性和稳定性。

二、浏览器的工作流程

从用户输入URL到页面展示的过程大致如下:

  1. 处理输入:用户在地址栏输入URL并按下回车后,UI线程会判断输入内容是否为URL,并交给网络线程处理。

  2. 网络请求:网络线程进行DNS解析、建立TLS连接等网络操作来请求对应资源。如果收到服务器重定向头部,则与UI线程沟通并发起新的请求。

  3. 读取响应:网络线程收到服务器响应后,解析HTTP报文并根据响应头Content-Type确定响应主体类型。如果是HTML文件,则交给渲染进程处理;如果是其他文件,则交给下载管理器或相应处理模块。

  4. 页面渲染:渲染进程接收到HTML数据后,开始解析HTML内容并构建DOM树和Render树。随后进行页面布局和绘制,并将图像帧交给GPU进程绘制在屏幕上。

  5. 事件处理:在渲染过程中,如果遇到JavaScript代码或用户交互事件(如点击、滚动等),则会将这些事件添加到事件队列中等待JavaScript引擎线程处理。

  6. 页面更新:当JavaScript引擎线程空闲时,会从事件队列中取出任务执行,并可能导致DOM树的更新和页面的重新渲染。

通过以上进程和线程的协同工作,浏览器能够高效地处理用户的网络请求并展示丰富的网页内容。

下面搬运自前端大佬(偶像cos02)©归cos02,若有侵权,立即删除

浏览器的核心功能

浏览器,“浏览” 是这个产品的核心,浏览无非分为两步:

  1. 获取想浏览的资源
  1. 展示得到的资源

现代浏览器还增加了交互功能,这涉及到脚本运行。因此,理解浏览器的核心就是理解其三大引擎如何工作:

  • 网络引擎
  • 渲染引擎
  • 脚本引擎

浏览器架构的选择:单进程 vs 多进程

在设计浏览器这样复杂的程序时,我们面临两种基本结构的选择:

  1. 单进程 + 多线程:所有功能集中在一个进程中,通过多线程实现各个功能。
  1. 多进程 + 每个进程少量线程 + IPC 通信:核心服务被抽离成独立进程,进程间通过 IPC 通信。

选择哪种结构,这是一个值得考虑的问题。我们可以想想各自的优缺点:

单进程结构:

优点:

  1. 内存效率高,多个线程共享一个进程的内存开销
  1. 通信效率高,线程之间由于可以访问公共内存,通信开销较小

缺点:

  1. 稳定性差,一个线程挂掉可能引起整个进程挂掉(对于浏览器而言,这是致命的,比如一个页面挂掉,可能导致整个浏览器挂掉)
  1. 安全性差,进程之间可以访问公共内存,页面之间难以实现有效的沙箱隔离
  1. 可拓展性差,功能越多,意味着一个进程越来越大庞大,耦合难以避免的变多

多进程结构:

优点:

多进程程序解决了单进程的一些缺点

  1. 稳定性:一个进程挂了不会引起其他进程(一个页面挂了不会影响其他页面)
  1. 安全性:进程之间天然隔离,可以实现更严格的沙箱
  1. 利用现代 CPU:多进程可以更好的使用现代多核 CPU
  1. 拓展性:将各个模块抽离成一些独立的进程,实现解藕,单独维护

缺点:

  1. 更多的资源(内存,I/O,CPU时钟)消耗
  1. 更多的进程通信(IPC)开销

浏览器架构的历史演变

在回看一个产品时,不要脱离其历史背景。

早期的浏览器,功能简单,且计算机内存资源昂贵,此时单进程的设计也许更合理。

但随着人类社会的发展,计算资源相对宽裕,计算能力大幅度提升,且用户的复杂了很多,此时,多进程的结构更加合理。

1990年代单进程架构内存资源昂贵简单的网页内容2000年代初单进程多线程网页开始复杂化多核处理器出现2008年Chrome发布多进程架构硬件性能提升内存成本下降2010年代多进程架构普及移动设备兴起网页应用复杂度大增现在持续优化的多进程架构智能资源管理云计算和边缘计算的影响浏览器架构的演变

浏览器架构的选择与其所处的时代背景密切相关:

  • 早期:功能简单,计算机资源昂贵,单进程设计更合理。
  • 现代:计算资源丰富,用户需求复杂,多进程结构更加适合。

现代多进程浏览器架构

前面提到,现代浏览器使用多进程的架构模式。

以我的 Chrome 浏览器举例:

  • 浏览器主进程:
    • 程序 UI(地址栏,书签栏,前进后退按钮)
    • 管理标签和窗口
    • 协调其他进程
    • 网络请求相关
  • GPU 进程:
    • 处理 GPU 任务,加速渲染
    • 处理 OpenGL 和 2D 绘图操作
    • 将渲染进程的绘制命令转为 GPU 命令
  • 实用工具进程:
    • 浏览器将一些特定的任务封装为了独立的进程,比如音频处理,文件解压,存储
  • 渲染进程
    • 浏览器会尽力为每个标签页提供一个独立的渲染进程
    • 解析和渲染网页资源
  • 拓展进程
    • 现代浏览器通过插件扩展功能,为了安全性,每个插件运行在一个独立的进程中

 

Chrome架构进化的目标是将整个浏览器程序的不同部分服务化,便于分割或合并。

前面提到,多进程架构会引起更多的内存和计算开销,所以 chrome 选择了更灵活的方式:

基本思路是:

  • 在高配设备中,每个服务独立开进程,保证稳定;
  • 在低配设备中,多个服务合并为一个进程,节约资源。同样的思路也应用到了Android上。

结语

一个应用的设计与其时代背景有关,技术的推进本质是用户需求的推进。而 Chrome 架构设计也充分体现了一个灵活的架构的优势。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2042320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你会读财务报表吗?快来看看如何正确解读

在现代商业的复杂网络中,每一家公司都像是一个精密运行的钟表,其运转的顺畅程度取决于各个齿轮的完美契合与精准配合。而财务报表,就像是是这钟表的指针,实时展现着公司运转的状态和效率,帮助管理者把握全局&#xff0…

用python实现视频中插入各种形式的文本,包括普通文本、数学公式、项目符号列表和标题

tex_mobject 模块提供了一系列可以使用 LaTeX 渲染文本的类。通过这个模块,你能够在视频中插入各种形式的文本,包括普通文本、数学公式、项目符号列表和标题等。具体类的功能如下: BulletedList:用于创建带项目符号的列表。MathT…

关于utf-8编码规范练习题

目录 一、代码内容 二、MySQL内容 三、代码遇到的问题 遭遇: 解决思路: 四、出现问题1 断点调试,分析问题 发现问题点: 问题解决 五、出现问题2 原因: 举例: 举例总结: 一、代码内容…

数学建模--浅谈多波束测线问题

目录 1.问题说明 2.问题分析 3.代码分析 1.问题说明 这个是国赛的真题,我们这个里面只是浅谈,就是对于这个里面运用的过程仿真的思路进行说明,这个探测的波束问题实际上也是一个简单的过程仿真问题,也是需要去进行作图的&#…

游戏管理系统

目录 Java程序设计课程设计 游戏管理系统 1系统简介 1.1需求分析 1.2 编程环境与工具 2系统总体设计 2.1 系统的功能模块图。 2.2 各功能模块简介。 3主要业务流程 (1)用户及管理员登录流程图 (2)信息添加流程 &#x…

Java语言程序设计——篇十三(3)

🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳&…

virtual_host.hpp模块

目录 一.VirtualHost虚拟机模块介绍 二.VirtualHost的实现 1. 类概述 2. 交换机操作 3. 队列操作 4. 绑定操作 5. 消息操作 6. 清理操作 总结 三.全部代码 一.VirtualHost虚拟机模块介绍 虚拟机是对之前几个数据管理模块的整合,并封装了之前的一些操作。…

安装Jmeter,配置jdk

注意点: java的jdk和jmeter的版本相匹配 ! ! ! 目前我使用的是1.8的的,jmeter使用的是5.6.3 JDK下载地址:https://www.oracle.com/cn/java/technologies/downloads 别管,直接傻瓜式安装点点就完了... 1.电脑-属性-高级系统设置-环境变量 2.系统变量-新建-变量…

如何理解:进程控制

文章目录 前言:进程创建:进程终止:如何终止进程?进程等待非阻塞等待: 总结: 前言: ​ 对于前面的地址空间的学习,我们现在了解到原来所谓变量的地址其实是虚拟地址,该虚…

python管理mysql(实现读写分离)及如何用Mycat读写分离

Day24 编写python代码实现读写分离 1、安装pymysql,它是python管理mysql的驱动,或者称为连接器 [rootpyhton ~]#pip3 config set global.index-url Simple Index [rootpython ~]# pip3 install pymysql #安装pymysql [rootpyhton ~]# python3 …

【C++】什么是内存管理?

如果有不懂的地方,可以看我以往文章哦! 个人主页:CSDN_小八哥向前冲 所属专栏:C入门 目录 C/C内存分布 C内存管理方式 new/delete操作内置类型 new/delete操作自定义类型 operator new与operator delete函数 new和delete实现…

【秋招笔试】24-08-10-OPPO-秋招笔试题(第二套)

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

2024巴黎奥运会VIS视觉设计分享学习

2024年巴黎奥运会的视觉识别系统(VIS)以其独特的设计和创意,展现了法国的优雅与活力。该设计融合了现代感与传统元素,以巴黎标志性的建筑和文化为灵感,创造出一系列令人印象深刻的视觉符号。 色彩上,采用了…

SpringCloud网关

1.网关的作用 2.网关入门 2.1引入依赖 <dependencies><dependency><groupId>com.heima</groupId><artifactId>hm-common</artifactId><version>1.0.0</version></dependency><!--网关--><dependency><g…

【qt】基于tcp的客户端搭建

ui界面设计 我们给客户端提供服务器的ip地址&#xff0c;以及服务器的端口号 1.界面设计 2.修改对象名称 代码实现 断开按键的槽函数处理 转到槽&#xff0c;然后实现槽函数&#xff0c;直接关闭该窗口&#xff0c;就可以了 连接槽函数编写&#xff0c;首先要支持网络通信…

C# 解析html

C#解析html库 网上查找有如下几个库 SGMLReader (好久不更新了)html-agility-pack(活跃)AngleSharp(活跃)CsQuery(好久不更新) 选择AngleSharp 原因:能向写js一样获取元素 安装AngleSharp 1.2.0-beta.431 using AngleSharp.Html.Parser;namespace HtmlParse01;class Progr…

示波法电子血压原理

血压是指血液在血管内流动时作用于单位面积血管壁的侧压力&#xff0c;它是推动血液在血管内流动的动力。在不同血管内被分别称为动脉血压、毛细血管压和静脉血压&#xff0c;通常所说的血压是指体循环的动脉血压。 血压正常范围值&#xff1a;收缩压130mmHg&#xff0c;舒张压…

【Python学习-UI界面】PyQt5 小部件9-QMenuBar,QMenuQAction 菜单栏

样式如下: 在pyqt5中直接添加就行&#xff0c;子项只能输入英文&#xff0c;输入中文的方式待研究 一个水平的 QMenuBar 位于QMainWindow对象的标题栏下方&#xff0c;用于显示QMenu对象。 QMenu 类提供了一个可以添加到菜单栏的小部件。它还用于创建上下文菜单和弹出菜单。…

基于YOLOv10深度学习的草莓成熟度检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、人工智能

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

SpringCloud完整教程

一下内容为本人在听黑马程序员的课程时整理的 微服务技术栈 ⎛⎝≥⏝⏝≤⎛⎝ ⎛⎝≥⏝⏝≤⎛⎝ ⎛⎝≥⏝⏝≤⎛⎝ ⎛⎝≥⏝⏝≤⎛⎝ 1、微服务框架 1.1、认识微服务 1.1.1、服务架构演变 **单体架构&#xff1a;**将业务的所有功能集中在一个项目中开发&#xff0c;打包成…