Content
时间循环 event loop
event loop 是浏览器上的概念。
进程和线程 process and thread
进程可以简单理解为内存上一块独立的空间
如果进程需要同时执行多个任务。那每个任务都可以是一个独立的线程。
浏览器是一个多进程多线程的application。浏览器非常复杂像一个操作系统。浏览器需要很多独立进程 (网络进程。浏览器进程。渲染进程。。。。。。)
浏览器进程:浏览器展示。(导航栏,收藏)。用户互动。子进程管理(启动其他进程)。进程内部会有多个线程处理不同任务。 网络进程:加载网络资源。多个线程负责同时加载多个资源 渲染进程:启动后开启一个主线程。主线程负责 html css 。 每一个标签页都是一个单独的渲染进程(将来可能是一个站点一个进程)
渲染主线程干什么:
- html解析
- 解析css
- 计算样式 em->px 优先级
- layout 长宽高
- 图层 z-index
- 每秒页面画60次 fps
- js
- event listener
- 回调函数 callback
- 。。。。。。。
那为什么不多线程呢?js 都是dom操作。大量的dom element如果被同时操作。太多lock了。lock本身的cost就不小。
如何调度任务
比如用户的click 的callback。要立刻处理吗?
结局办法 massage queue
渲染主线程里任务可以生成新的任务 其他线程也可以添加任务。
- 最一开始的时候。渲染主线程会进入一个无限循环
- 每一次循环,都是检查消息队列里有没有任务。有就取出第一个执行。没有就进入休眠
- 所有线程(包括其他进程的线程)可以随时向message queue添加任务。
整个这个循环过程叫event loop (message loop)
何为异步
代码中有一些无法立即执行的任务
- setTimeOut
- XHR fetch
- addEventListener
阻塞



