Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

《浏览器工作原理与实践》-- 学习笔记 #1

Open
wanCheng7 opened this issue Aug 5, 2019 · 0 comments
Open

《浏览器工作原理与实践》-- 学习笔记 #1

wanCheng7 opened this issue Aug 5, 2019 · 0 comments

Comments

@wanCheng7
Copy link
Owner

wanCheng7 commented Aug 5, 2019

Chrome的多进程架构

线程与进程

一个进程就是一个程序的运行实例,它具体指操作系统为这个任务创建的一块内存,可以用来存放代码、数据和一个执行任务的主线程。一个进程是可以包含多个线程的。

线程可以理解为一个处理任务的机器,一个线程同时只能做一件事。但是线程不能单独存在的,它是由进程来启动和管理的。

  • 进程中任一线程执行出错,都会导致整个进程的崩溃
  • 线程之间共享进程中的数据
  • 当一个进程关闭之后,操作系统会回收进程所占用的内存
  • 进程之间的内容相互隔离

TCP协议

计算机的地址就称为 IP 地址,访问任何网站实际上只是你的计算机向另外一台计算机请求信息。

V8工作原理

栈内存和堆内存:数据是如何存储的

下面是JavaScript的内存模型,主要分为代码空间、栈内存和堆内存:
image

JavaScript的数据类型一共有八种:
image

栈内存中存储的是7种基本数据类型,堆内存中存储的是Object这种引用类型

因为栈内存需要反复切换调用栈,所以切换上下文的高效,只能存储几种基本类型,相对比较大的复合类型就存在堆内存中。

编译器和解释器:V8是如何执行一段JavaScript代码的?

以下是关于编译器和解释器的具体介绍:
image

关于V8如何执行一段JavaScript代码的,答题可以分为以下步骤:
JavaScript代码 -> AST -> 字节码 -> 机器码

image

消息队列和事件循环:页面是怎么“活”起来的?

  • 因为js是单线程的,主线程上只能做一件事,所以有必要引入消息队列,把待处理的消息放在一个队列中,依次执行。

  • 但是纯粹的队列机制有个问题,就是如果等所有队列跑完再执行页面渲染,就会显得很卡,那如果队列中一个任务执行完了马上就渲染又会比较浪费性能,不够高效。

  • 所以现在比较主流的方案就是,我们将消息队列中的任务称为宏任务,而由于某一个红任务比如对DOM的操作而产生的副作用比如UI更新和异步请求等都放到这个宏任务的微任务队列中去,每次消息队列中的某一个宏任务执行完了,并不是马上执行下一个宏任务,而是先执行它的微任务队列,如果这个宏任务操作有DOM 有变化,那么就会将该变化添加到微任务列表中,所以相应页面就会重新渲染,然后才是执行下一个宏任务。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant