javascript异步那些事(一)—— 单线程与多线程

什么是进程

  • 狭义定义:
        进程是正在运行的程序的实例(an instance of a computer program that is being executed)。
  • 广义定义:
        进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元,也就是说,不同的进程使用不同的内存空间。

什么是线程

  • 线程是进程中一个单一的顺序控制流程,一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成

进程与线程的关系

  • 线程是进程的子集,一个进程可以包含多个线程,但至少有一个线程

单线程与多线程的区别:

举个栗子:

你早上上班,正要打卡的时候,手机响了
单线程:你如果先接了电话,等接完了,再打卡,就是单线程。
多线程:如果你一手接电话,一手打卡。
两件事的结果是一样的。。你接了电话且打了卡。

由上面的例子可知,单线程做事的方式是串行,多线程做事的方式是并行,那么,并行做事的时候如果事情之间有相互依赖的话,怎么办

再举个栗子

有一家蛋糕店,厨师不停的生产蛋糕并放到柜台,售货员不停的从柜台售出蛋糕,这就引入了 多线程间通信的概念

avatar

上图只是简单的表达了线程间的协作方式,事实上,多线程通信协作时,需要处理的情况是非常复杂的,比如:

  • 如何保证多线程之间可以正确处理相互依赖,即多线程的执行结果要与单线程执行结果保持一致
  • 每个线程的生命周期如何管理
  • 当某个线程在执行过程中产生了阻塞该如何处理

javascript是单线程的

  • 我们可以看到,多线程在提高工作效率的同时,带来了工作方式更为复杂的副作用。不过不用担心,我们的javascript是单线程的,完全不存在上面的问题,至于javascript的单线程具体如何,请看下回分解。

avatar