一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情。
前言
学了那么久,一直都在说JS是单线程的语言,它是一种异步的方式,使得JS这门语言的难点降低了不少。如果说要接触到线程的话,要对线程控制的非常好,否则就会造成灾难性的后果。
进程线程属于操作系统的领域,而操作系统是门很深的学问。然而进程是怎么来的呢?
进程
进程是操作系统产生的,去启动应用程序的时候,会分配一个进程。当我们启动一个node程序就是启动了一个进程。操作系统启动程序的时候一定会给它分配一个进程。
一个进程就是一个独立的内存空间,这个空间也可以进行伸缩。当内存不够用时,就会询问操作系统,操作系统就会进行相应的操作,分配或回收内存空间。
原则上一个进程产生后,不会受到其他进程的干扰。这是进程之间最重要的原则。
在之前的操作系统上是没有进程的,所有的应用程序都是共享整个内存空间,只要有一个程序崩溃,就会导致一连串的程序崩溃。有了进程之后操作系统就变得比较稳定,进程间就不会相互影响了,就算程序崩溃也不会影响到其他的程序。
进程之间也是可以进行通信的,通信的方式要遵守一定的协议例如:ipc。然而cup的数量是有限的,如果运行了很多个应用程序都是cpu在运行,cpu的执行方式是:一个应用程序执行一段,执行完后将数据保存到内存空间,马上切换到下一个程序,这就是操作系统调度执行。
虽然一个应用程序在启动的时候只有一个进程,但是它在运行的过程中,可以开启新的进程。进程之间仍然保持相对独立的状态。
- 如果一个进程是直接由操作系统开启,则讲做主进程。
- 如果一个进程B是由A开启的,则A是B的父进程,子进程会继承父进程的一些信息,但是还是保持相对独立。
线程
操作系统启动一个进程,都会自动分配一个线程,称之为主线程程序一定在线程上运行。
主线程在运行的过程中,可以创建多个子线程。
当cpu执行到进程的时候,又会在该进程的线程中切换执行。
线程和进程很相似,他们都是独立的,最大的区别在于,线程的内存空间没有隔离。线程之间数据都是共享一块内存空间。线程之间的数据交换可以不用遵守协议,随意使用。
但是在函数执行的时候,顺序可能会被打乱。这就是之前讲到的如果控制不当,就会造成数据混乱。
let n = 1;
function add(){
n++;
console.log(n);
}
如果有多个线程都执行add函数,那么就会造成意想不到的结果。