Open oakland opened 4 years ago
01 | Chrome架构 单进程 向 多进程 发展,每个标签(tab)是一个渲染进程,各个标签之间互不影响,一个标签卡死或者挂掉不会影响整个浏览器的其他 tab。
还有一种特殊的情况是:
Chrome的默认策略是,每个标签对应一个渲染进程。但是如果从一个页面打开了新页面,而新页面和当前页面属于同一站点时,那么新页面会复用父页面的渲染进程。官方把这个默认策略叫process-per-site-instance。 直白的讲,就是如果几个页面符合同一站点,那么他们将被分配到一个渲染进程里面去。 所以,这种情况下,一个页面崩溃了,会导致同一站点的页面同时崩溃,因为他们使用了同一个渲染进程。
02 | TCP协议:如何保证页面文件能被完整送达浏览器?
虽说UDP 不能保证数据可靠性,但是传输速度却非常快,所以 UDP 会应用在一些关注速度、但不那么严格要求数据完整性的领域,如在线视频、互动游戏等。
对于浏览器请求,或者邮件这类要求数据传输可靠性(reliability)的应用,如果使用 UDP 来传输会存在两个问题:
基于这两个问题,我们引入 TCP 了。TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。相对于 UDP,TCP 有下面两个特点:
备注:tcp 和 udp 就是权衡速度和可靠性之后产生的两种协议,每个协议倾向不同的特点。
问答:
现在的浏览器可以同时打开多个页签,他们端口一样吗?如果一样,数据怎么知道去哪个页签? 作者回复: 端口一样的,网络进程知道每个tcp链接所对应的标签是那个,所以接收到数据后,会把数据分发给对应的渲染进程
06 | 渲染流程(下)
在上图中,我们使用了 CSS 的 transform 来实现动画效果,这可以避开重排和重绘阶段,直接在非主线程上执行合成动画操作。这样的效率是最高的,因为是在非主线程上合成,并没有占用主线程的资源,另外也避开了布局和绘制两个子阶段,所以相对于重绘和重排,合成能大大提升绘制效率。
keyword: 极客时间,极客绑,李兵,浏览器,浏览器原理
Content-Type
12丨栈空间和堆空间:数据是如何存储的?
整个上面这段论述讲的很透彻,尽管之前就知道这个原理。但是让我最受启发的在于为什么需要堆栈两套存储空间,而不是全部存在栈空间中。从上面的内容可以看到其实栈空间存的都是简单数据类型,因为对象类型的数据会以对象内存地址的方式存在栈空间中,这个地址就是一串数字?,这样的话存的就都是简单数据类型了。方便 js 对栈空间进行回收管理。
上面这段内容对于理解闭包又加深了印象,最受启发的地方在于 closure(foo) 这个对象的创建,这个对象的创建实际上根本解决了为什么会有闭包的原因。其实闭包就是相当于带着 closure(xxx) 对象的内容。
第二个问题:innerBar返回后,含有setName和getName对象,这两个对象里面包含了堆中的closure(foo)的引用。虽然foo执行上下文销毁了,foo函数中的对closure(foo)的引用也断开了,但是setName和getName里面又重新建立起来了对closure(foo)引用。
你可以: 1:打开“开发者工具” 2:在控制台执行上述代码 3:然后选择“Memory”标签,点击"take snapshot" 获取V8的堆内存快照。 4:然后“command+f"(mac) 或者 "ctrl+f"(win),搜索“setName”,然后你就会发现setName对象下面包含了 raw_outer_scope_info_or_feedback_metadata,对闭包的引用数据就在这里面。
这个回复也引出了另外一个问题,就是如何使用 memory 控制面板的问题,这个可以作为引申题目下来再研究。
15 消息队列和时间循环
整个上面这一段内容给出了为什么要分微任务和宏任务的原因,非常好。
16 settimeout
看了一下,我觉得这个 setTimeout 其实更像一个可以插队的 hashmap,就是自己给自己定时间,到时间了就去任务队列插队,如果当前循环队列中正在执行,就等这个任务执行完,然后插入队列,如果没有任务就直接插队进去。
18 宏任务/微任务
微任务出现的原因
关于什么是宏任务,什么是微任务,评论里有人说:
我觉得这个说法不错。
20 async/await