10分钟了解JS的线程与进程
2024-07-06 05:05:44

面试官:你能说一下线程和进程吗?

我:工作中用不到,我没了解过。

面试官:哈哈哈,你好,很高兴您来面试,请您暂时先回去等通知。

正文

大多数前端都知道前端的JS是单线程语言,但是JS为什么是单线程语言大多数人可能还是不清楚的。

线程与进程这个东西,虽然不影响日常开发,但这是程序员必会的基础知识,我没能完整的说出来,确实不太好。

因此,我这里整理一下相关的知识点。

进程(process)

  1. 查看人管理器,每个应用程序至少会启动一个进程,有的会启动多个进程
  2. 一个进程会占有一片独立的内存空间。
  3. 各个进程的内存空间相互独立,不能互相访问。

线程(thread)

  1. 是进程内一个独立执行的单元。
  2. 是进程内的一个独立的执行单元
  3. 是CPU的最小调度单元

单线程与多线程的概念,是针对一个进程内的概念。

  • 一个进程内有多个线程,那这个进程对应的程序就是多线程的程序。
  • 一个进程内只有一个线程,那么这个程序就是单线程的程序,并且,一个程序,如果只有一个主线程,那就是单线程。

拓展

  1. 某个独立的模块(浏览器的JS引擎)必须运行在某个进程的某个线程上,不能直接运行在进程上。
  2. 一个进程中必须至少有一个线程,就是所谓的主线程。主线程是进程启动后自动创建的,要运行代码必须要创建线程。
  3. 一个进程可以同时运行多个线程,叫做多线程。
  4. 一个进程内的数据可心供其中多个线程直接共享使用
  5. 多进程之间的数据不能直接共享使用

二者比较

单线程和多线程之间并无优劣之分,只是根据使用场景而确定的方案,譬如JS一开始之所以确定为单线程,就是为了提高执行效率。

多线程
1
2
优点:能有效提升CPU的利用率
缺点:创建多线程开销,线程间切换开销,锁进制与状态同步问题
单线程
1
2
优点:代码顺序执行,编码更加简单
缺点:效率低

关于cpu利用率

单核cpu,某一个时刻肯定只能有一个线程在执行。但是却也能创建多线程,多线程是交替执行的,只是比较快,看着好像是同时执行的。
双核cpu,某一个时刻可以有两个线程在执行。单线程的就浪费了双核的能力了,另外一个核闲置了。

异步与多线程的区别

异步和多线程都是处理并发任务的方式,但它们本质上是不同的。

多线程和异步编程之间的一个关键区别是,多线程涉及在一个进程内创建多个线程,而异步编程涉及以非阻塞方式执行任务。

另一个区别是,多线程需要显式地管理线程同步和通信,而异步编程可以使用编程构造(例如回调或承诺)来处理异步操作。

多线程和异步编程都可以用于实现计算机系统的并发和并行,但使用哪种取决于程序的具体要求以及底层硬件和软件基础设施。

1
2
3
4
1. 执行方式:多线程是并行执行任务,即多个线程同时执行任务,而异步是串行执行任务,即一个任务执行完成后再执行下一个任务。
2. 内存使用:每个线程都有自己的栈和内存,因此多线程会占用更多的内存。而异步则可以在一个线程中共享内存。
3. 调度机制:多线程需要操作系统提供的线程调度器来进行线程之间的切换,而异步则是通过事件循环和任务队列的机制完成任务的调度。
4. 错误处理:多线程中一个线程抛出异常时,其他线程不受影响,但异步中一个任务出错可能会影响后续的任务执行。

总的来说,多线程适用于CPU密集型的任务(如计算),而异步则适用于IO密集型的任务(如网络请求),它们都有自己的优缺点,在选择使用时需要根据具体的场景进行判断。

并行与并发

谈到异步多线程了,多少就顺手讲一下并行与并发的概念,这都算是计算机相关的基础名词,多少要做一个了解。

并发是一个人同时吃三个馒头(时间点是相互独立的,在一个时间点只能吃其中馒头的一口)

并行是三个人同时吃三个馒头(时间是重合的,三个人可以在同一时间吃馒头)

并行(parallel)

指在同一时刻,有多条指令在多个处理器上同时执行。

就好像两个人各拿一把铁锨在挖坑,一小时后,每人一个大坑。所以无论从微观还是从宏观来看,二者都是一起执行的。

并发(concurrency)

指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。

这就好像两个人用同一把铁锨,轮流挖坑,一小时后,两个人各挖一个小一点的坑,要想挖两个大一点得坑,一定会用两个小时。

并行在多处理器系统中存在,而并发可以在单处理器和多处理器系统中都存在,并发能够在单处理器系统中存在是因为并发是并行的假象,并行要求程序能够同时执行多个操作,而并发只是要求程序假装同时执行多个操作(每个小时间片执行一个操作,多个操作快速切换执行)。

关于CPU与二者的关系

当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状态.这种方式我们称之为并发(Concurrent)。

当系统有一个以上CPU时,则线程的操作有可能非并发.当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。

结语

前端的基础知识,仅做内功修炼的一条,可以涉猎了解,但是没必要深入了解。

除非,是真正纯正的技术MAN。

参考

JS进程与线程全解析-前端开发-JavaScript_哔哩哔哩_bilibili

异步和多线程的区别

[前端进阶] - 搞懂浏览器进程和线程 - 掘金 (juejin.cn)

并发与并行的区别(超级通俗易懂)_并发和并行区别秒懂_咋么又饿了的博客-CSDN博客