浏览器进程模型
我们知道js是执行在浏览器的语言,那么事件循环就要从浏览器开始了解。而对于复杂度堪比操作系统浏览器而言,岂是一般人能理解的哈,当然我也不懂,所以我们只顺着事件循环这个事情的线索,以最简单的语言,从线的开始摸索到结束。好吧开始正题。
浏览器是一个复杂应用程序,对于一个复杂的程序都是由多进程的,为了保持各项功能运行和互不影响,首先要了解进程和线程
1何为进程
- 程序运行需要有它自己的专属内存空间,可以把这块内存空间简单的理解为进程
- 每个应用至少有一个进程,进程之间相互独立,即使要通信,也要双方同意
2何为线程
- 一个进程至少有个线程,在进程开启后会自动创建一个线程来运行代码,该线程被称为主线程 (主线程结束了,整个程序就结束了) 线程执行者,并且可以有多个线程,共用同一个块内存空间(进程)
了解了进程和线程之后,接下来就快要摸到今天要讲的核心了,‘浏览器的渲染进程’ 我们写的js 代码也就是在这个渲染进程中的主线程中执行的,接着往下读吧。
3 浏览器有哪些进程和线程?
- 浏览器内部工作极其复杂(浏览器),浏览器是一个多进程的应用程序,为了避免相互影响,所以在浏览器中一个页面卡死了不会影响到其他页签的页面
- 对我们而言,只需要关心三个进程,浏览器进程、网络进程、渲染进程
- 浏览器进程,浏览器上自带的操作控制,子进程控制
- 网络进程,负责加载网络资源
- 渲染进程,启动后会开启一个渲染主线程,负责执行HMTL,CSS,JS代码
渲染进程如何工作
- 渲染主线程是浏览器中最忙的线程
渲染主线程要处理这么多任务,那么处理顺序和js操作是如何进行的,接下来就来揭晓一下
事件队列(消息队列)
- 主线程会循环的去事件队列中拿任务来执行,而主线程执行过程中遇到异步任务会交给其他线程执行,主线程结束当前任务继续执行队列中的任务,其他线程处理完成便将回调包装成任务推向事件队列的末尾中等待主线程去执行。
- js 是单线程的语言,这是因为它运行在浏览器渲染主线程中,而主线程只有一个
- js 阻塞渲染原理,就是因为js 改变页面内容,要重新渲染,而渲染可以看做是一个任务,会被推向任务队列的末尾中,如果在当前改变页面内容的任务中还有大量其他处理,那就会长时间的等待,也就是阻塞
- 事件队列分类 宏队列(w3c基于现在浏览器的复杂度,要求不只有宏队列,以谷歌为例至少有延时队列(中)、交互队列(高)),微队列(优先级最高)
最后,事件机制就讲完了,也就是js在浏览器中的执行过程,就是这样的。