进程(Process):简单来说,就是正在进行中的程序。程序一旦运行就是进程。一个程序可以有多个进程。
线程(thread): 可以理解为进程中独立运行的子任务。一个进程中可以运行多个线程,线程共享进程的空间。
比如,WeChat.exe运行时就有很多的子任务在同时运行。像好友视频、下载文件、传输数据、发送表情等,这些不同的任务或者说功能都可以同时运行,其中每一项任务完全可以理解成是“线程”在工作,传文件、听音乐、发送图片表情等功能都有对应的线程在后台默默地运行。
进程和线程之间的关系
进程——资源分配的最小单位,线程——CPU调度的最小单位。
进程是能拥有资源和独立运行的最小单位。 线程是建立在进程的基础上的一次程序运行单位,一个进程中可以有多个线程。
进程更倾向于从操作系统申请资源,并对这些资源进行统一的管理,提供一个良好的运行环境。线程则更注重利用已经分配好的资源运行程序。也就是说,线程是建立在进程的基础上运行的,共享进程的内存空间。
浏览器是多进程的
上图也可以看出,浏览器是多进程的。
- 浏览器是多进程的
- 浏览器之所以能够运行,是因为系统给它的进程分配了资源(cpu、内存)
- 简单点理解,每打开一个Tab页,就相当于创建了一个独立的浏览器进程。 在浏览器中打开一个网页相当于新起了一个进程(进程内有自己的多线程)
注意: 在这里浏览器应该也有自己的优化机制,有时候打开多个tab页后,可以在Chrome的更多工具 -> 任务管理器中看到,有些进程被合并了。所以每一个Tab标签对应一个进程并不是绝对的。
JS是单线程的
JavaScript语言的一大特点就是单线程,主要目的是为了避免多线程同时修改DOM节点。
js最初的用途是为了实现用户与浏览器的交互,这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?
所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成这门语言的核心特征。
所谓单线程,是指在JS引擎中负责解释和执行JavaScript代码的线程只有一个。