前端开发中JS属于一个重点知识点,了解JavaScript的运行机制更能有助于我们了解前端的开发逻辑和流程。本篇文章主要是通过了解进程和线程是什么、浏览器进程以及浏览器的渲染流程来了解整个JavaScript运行机制。
进程与线程
启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,我们把这样的一个运行环境叫进程 。(eg:进程是一个工厂,系统会给工厂分配独立的内存(独立的一块内存)资源,且进程之间互不影响)
单个进程中执行的每个任务就是一个线程。( eg:就是工厂中的工人,多个工人协作完成任务,可以右边一个或多个工人,且工人之间共享工厂中的资源)
区别
如下总结了几个进程与线程的区别:
- 进程是操作系统分配资源的最小单位,线程是任务调动和执行的最小单位。
- 一个线程只能属于一个进程,但是一个进程可以拥有一个或者多个线程组成。多线程处理就是允许一个进程中在同一时刻执行多个任务。
- 进程之间的资源相互独立
- 同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)
浏览器进程
浏览器进程的相关介绍,我在《chrome访问一个网页启动了多少个进程?》一文中已有介绍,这里只是简单列出进程类型:
- GPU进程
- 浏览器进程
- 网络进程
- 插件进程
- 渲染进程
Event Loop
事件循环是JS为了解决JavaScript单线程运行阻塞问题的一种方案,简单来说就是JS中的异步操作实现原理。JS中将执行代码分为同步代码和异步代码,其中异步代码又分为微任务与宏任务(详情请参考《JavaScript 之宏任务与微任务》)。
如下介绍事件机制的几个特点:
- JS分为同步任务和异步任务(包含宏任务和微任务)
- 同步任务都在主线程上执行,形成一个执行栈
- 主线程之外,事件触发线程管理着一个任务队列,只要异步任务有了运行结果,就在任务队列之中放置一个事件。
- 一旦执行栈中的所有同步任务执行完毕(此时JS引擎空闲),系统就会读取任务队列,将可运行的异步任务添加到可执行栈中,开始执行(js引擎存在monitoring process进程,会持续不断的检查主线程执行栈是否为空.)。
定时器
定时器由定时器线程控制,因为JavaScript引擎是单线程的, 如果处于阻塞线程状态就会影响记计时的准确,因此很有必要单独开一个线程用来计时。当使用setTimeout或setInterval时,它需要定时器线程计时,计时完成后就会将特定的事件推入事件队列中。