大话javascript 4期:事件循环(1)

1、进程与线程

现代操做系统好比Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操做系统。前端

什么叫“多任务”呢?简单地说,就是操做系统能够同时运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶做业,这就是多任务,至少同时有3个任务正在运行。还有不少任务悄悄地在后台同时运行着,只是桌面上没有显示而已。ajax

如今,多核CPU已经很是普及了,可是,即便过去的单核CPU,也能够执行多任务。因为CPU执行代码都是顺序执行的,那么,单核CPU是怎么执行多任务的呢?浏览器

答案就是操做系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每一个任务都是交替执行的,可是,因为CPU的执行速度实在是太快了,咱们感受就像全部任务都在同时执行同样。网络

真正的并行执行多任务只能在多核CPU上实现,可是,因为任务数量远远多于CPU的核心数量,因此,操做系统也会自动把不少任务轮流调度到每一个核心上执行。多线程

对于操做系统来讲,一个任务就是一个进程(Process),好比打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。异步

有些进程还不止同时干一件事,好比Word,它能够同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就须要同时运行多个“子任务”,咱们把进程内的这些“子任务”称为线程(Thread)布局

因为每一个进程至少要干一件事,因此,一个进程至少有一个线程。固然,像Word这种复杂的进程能够有多个线程,多个线程能够同时执行,多线程的执行方式和多进程是同样的,也是由操做系统在多个线程之间快速切换,让每一个线程都短暂地交替运行,看起来就像同时执行同样。固然,真正地同时执行多线程须要多核CPU才可能实现。操作系统

若是咱们要同时执行多个任务怎么办?插件

有两种解决方案:线程

一种是启动多个进程,每一个进程虽然只有一个线程,但多个进程能够一块执行多个任务。

还有一种方法是启动一个进程,在一个进程内启动多个线程,这样,多个线程也能够一块执行多个任务。

固然还有第三种方法,就是启动多个进程,每一个进程再启动多个线程,这样同时执行的任务就更多了,固然这种模型更复杂,实际不多采用。

总结一下就是,多任务的实现有3种方式:

  1. 多进程模式;
  2. 多线程模式;
  3. 多进程+多线程模式。

同时执行多个任务一般各个任务之间并非没有关联的,而是须要相互通讯和协调,有时,任务1必须暂停等待任务2完成后才能继续执行,有时,任务3和任务4又不能同时执行,因此,多进程和多线程的程序的复杂度要远远高于咱们前面写的单进程单线程的程序。

由于复杂度高,调试困难,因此,不是无可奈何,咱们也不想编写多任务。可是,有不少时候,没有多任务还真不行。想一想在电脑上看电影,就必须由一个线程播放视频,另外一个线程播放音频,不然,单线程实现的话就只能先把视频播放完再播放音频,或者先把音频播放完再播放视频,这显然是不行的。

总结:
1) 进程是cpu资源分配的最小单位(是能拥有资源和独立运行的最小单位)
2) 线程是cpu调度的最小单位(线程是创建在进程的基础上的一次程序运行单位,一个进程中能够有多个线程)

2、浏览器是多进程的

浏览器包含哪些进程

1) Browser进程:浏览器的主进程(负责协调、主控),只有一个。做用有

  • 负责浏览器界面显示,与用户交互。如前进,后退等
  • 负责各个页面的管理,建立和销毁其余进程
  • 将Renderer进程获得的内存中的Bitmap,绘制到用户界面上
  • 网络资源的管理,下载等

2) 第三方插件进程:每种类型的插件对应一个进程,仅当使用该插件时才建立
3) GPU进程:最多一个,用于3D绘制等
4) 浏览器渲染进程(浏览器内核)(Renderer进程,内部是多线程的):默认每一个Tab页面一个进程,互不影响。主要做用为

  • 页面渲染,脚本执行,事件处理等

关于浏览器进程问题能够简单基础三点:

1) 浏览器是多进程的。
2) 浏览器之因此可以运行,是由于系统给它的进程分配了资源(cpu、内存)。
3) 简单点理解,每打开一个Tab页,就至关于建立了一个独立的浏览器进程。

平时 coding 接触到最多的一个浏览器进程是浏览器渲染进程(浏览器内核),它管理着页面渲染。脚本执行,事件处理等。要同时处理这么多事情,渲染进程显然是多线程的,它主要包括如下5个常驻线程:

  1. GUI渲染线程,负责渲染浏览器界面,解析HTML,CSS,构建DOM树和RenderObject树,布局和绘制等。
  2. JS引擎线程,也称为JS内核,负责处理Javascript脚本程序,(例如V8引擎)。
  3. 事件触发线程,用来控制事件循环(能够理解为,JS引擎线程本身都忙不过来,须要浏览器另开线程协助)。
  4. 定时触发器线程,浏览器定时计数器并非由JavaScript引擎计数的,(由于JavaScript引擎是单线程的, 若是处于阻塞线程状态就会影响记计时的准确),JS中经常使用的setInterval和setTimeout就归这个线程管理。
  5. 异步http请求线程,也就是ajax发出http请求后,接收响应、检测状态变动等都是这个线程管理的。

3、Javascript是单线程的

咱们常说的JavaScript是单线程的,其实就是说的JS引擎是单线程的,它仅仅是浏览器渲染进程种的一个线程。为何呢?由于JavaScript的主要做用是与用户互动,以及操做DOM,若是JavaScript有两个线程,一个线程对一个DOM节点执行 A 操做,另外一个线程这个DOM节点执行 B 操做,那么就会起冲突,因此JavaScript在前端的应用就注定了它是单线程的。

然而JavaScript的单线程特性就注定咱们不用它去完成密集的 cpu 运算,由于密集 cpu 运算耗时过长,阻塞页面渲染。为了解决这个问题,HTML5提出 Web Worker 标准,容许JavaScript脚本建立多个线程,可是子线程彻底受主线程控制,且不得操做DOM

若是你以为这篇文章对你有所帮助,那就顺便点个赞吧,点点关注不迷路~

黑芝麻哇,白芝麻发,黑芝麻白芝麻哇发哈!

前端哇发哈

相关文章
相关标签/搜索