本文已参与「新人创作礼」活动,一起开启掘金创作之路。
进程和线程是什么
进程和线程是操作系统中的两个概念:
- 进程(process):计算机已经运行的程序,是操作系统管理程序的一种方法;
- 线程(thread):操作系统能够运行运算调度的最小单位,通常情况下它被包含在进程中;
上面是维基百科中的解释,转换成我们自己的理解:
- 进程:我们可以认为,启动一个应用程序就会默认启动一个进程(也可能是多个);
- 线程:每一个进程中,都会启动至少一个线程用来执行程序中的代码,这个线程被称为主线程;
- 因此我们可以说进程是线程的容器;
以现实中的例子类比:
- 操作系统类似于一个大工厂;
- 工厂中有很多车间,这个车间就是进程;
- 每个车间可能有一个以上的工人在工厂,这个工人就是线程;
操作系统:是管理计算机硬件与软件资源的计算机程序,用于提供硬件与软件之间的接口
操作系统-进程-线程之间的关系
操作系统的工作方式
操作系统是如何如何做到让多个进程(边听歌,边写代码,边查阅资料)同时工作的呢?
- 这是因为CPU的运算速度非常快,它能够快速在多个进程之间切换;
- 当我们的进程中的线程获取到时间片时,就可以快速执行我们编写的代码;
- 对于用户来说是感受不到这种快速的切换的;
浏览器中的JavaScript线程
JavaScript本身是单线程的,那么它必须要有一个对应的线程容器,也就是进程,这个进程可以是浏览器或者Node;
我们先来讲浏览器:
-
浏览器是一个进程吗?它里面只有一个线程吗?
- 不是的,目前多数的浏览器都是多进程的,每当我们打开一个标签(tab)页时就会开启一个新的进程,这是为了避免一个页面开始的时候,导致所有的页面都无法响应,从而整个浏览器需要强制退出;
- 每个进程中又有很多线程,其中包括执行JavaScript代码的线程;
-
JavaScript的代码执行都是在一个单独的线程中执行的:
- 这也就意味着JavaScript的代码,在同一个时刻只能做一件事;
- 如果这件事是非常耗时的,就会导致当前的线程被堵塞;
-
所以对于JavaScript代码中真正的耗时操作,实际上并不是由JavaScript线程执行的:
- 浏览器的每个进程是多线程的,那么其他线程可以来完成这个耗时的操作;
- 比如网络请求(需要建立网络连接)、定时器(需要计时),我们只需要在特性的时候执行应该有的回调即可;
注意: 浏览器中JavaScript代码的执行是由一个线程来完成的,但是对于JavaScript代码的下载和解析则是由浏览器中的其它线程来完成的,并不是同一个线程(因为这些都是比较耗时的操作)。