文章插图
作者:趁你还年轻
转发链接:https://segmentfault.com/a/1190000022950333
前言看到这些词仿佛比较让人摸不着头脑,其实在我们的日常开发中,早就和它们打过交道了 。
我来举几个常见的例子:
- 我执行了一段js,页面就卡了挺久才有响应
- 我触发了一个按钮的click事件,click事件处理器做出了响应
- 我用setTimeout(callback, 1000)给代码加了1s的延时,1秒里发生了很多事情,然后功能正常了
- 我用setInterval(callback, 100)给代码加了100ms的时间轮训,直到期待的那个变量出现再执行后续的代码,并且结合setTimeout删除这个定时器
- 我用Promise,async/await顺序执行了异步代码
- 我用EventEmitter、new Vue()做事件广播订阅
- 我用MutationObserver监听了DOM更新
- 我手写了一个Event类做事件的广播订阅
- 我用CustomEvent创建了自定义事件
- 我·······
而且也与浏览器的运行原理有一些关系,作为每天在浏览器里辛勤耕耘的前端工程师们,浏览器的运行原理(多进程、单线程、事件循环、消息队列、宏任务、微任务)可以说是必须要掌握的内容了,不仅对面试有用,对手上负责的开发工作也有很大的帮助 。
- 浅谈浏览器
- 架构浏览器可以是哪种架构?
- 如何理解Chrome的多进程架构?
- 前端最核心的渲染进程包含哪些线程?
- 主线程(Main thread)(下载资源、执行js、计算样式、进行布局、绘制合成)
- 光栅线程(Raster thread)
- 合成线程(Compositor thread)
- 工作线程(Worker thread)
- 浅谈单线程jsjs引擎图什么是单线程js?
- 单线程js属于浏览器的哪个进程?
- js为什么要设计成单线程的?
- 事件循环与消息队列什么是事件循环?
- 什么是消息队列?
- 如何实现一个 EventEmitter(支持 on,once,off,emit)?
- 宏任务和微任务哪些属于宏任务?
- 哪些属于微任务?
- 事件循环,消息队列与宏任务、微任务之间的关系是什么?
- 为任务添加和执行流程示意图
- 浏览器页面循环系统原理图消息队列和事件循环setTimeoutXMLHttpRequest宏任务
- 参考资料
先来看看我的机器上运行的微信和Chrome的进程详情:
文章插图
如果自己设计一个浏览器,浏览器可以是哪种架构呢?
- 单进程架构(线程间通信)
- 多进程架构(进程间IPC通信)
但是由于这些功能的日益复杂,例如将网络,存储,UI放在一个线程中的话,执行效率和性能越来越低下,不能再向下拆分出类似“线程”的子空间 。
因此,为了逐渐强化浏览器的功能,于是产生了多进程架构的浏览器,可以将网络、调度、UI、存储、GPU、设备、渲染、插件等等任务分配给多个单独的进程,在每一个单独的进程内,又可以拆分出多个子线程,极大程度地强化了浏览器 。
如何理解Chrome的多进程架构?Chrome作为浏览器界里的一哥,它也是多进程IPC架构的 。
文章插图
Chrome多进程架构主要包括以下4个进程:
- Browser进程(负责地址栏、书签栏、前进后退、网络请求、文件访问等)
- Renderer进程(负责一个Tab内所有和网页渲染有关的所有事情,是最核心的进程)
- GPU进程(负责GPU相关的任务)
- Plugin进程(负责Chrome插件相关的任务)
推荐阅读
- 服务器概念、组成、分类和架构之争
- 如何把网页设置成极速?
- 今日头条技术架构到底有多牛?
- 生意参谋子账号专用浏览器 生意参谋可以开多少个子账号
- 80后架构师教你学ApacheBeam,一个开源统一分布式数据处理编程库
- 架构的腐化是必然的
- 浅谈数据库分布式架构设计
- MySQL数据库架构和同步复制流程
- 基于LAMP环境搭建论坛
- 软件架构概述