进程与线程
进程与线程
什么是进程 ?
假设我们的电脑看作是一个工厂,电脑上面是可以运行各种应用程序的(浏览器、Word、音乐播放器、视频播放器....)每一个应用程序都可以看作是一个独立的工作区域,这个独立的工作区域就是我们的进程。
每个进程都会有独立的内存空间和系统资源,每个进程之间是独立的,这意味着假设有一个进程崩了,那么不会影响其他的进程。
什么又是线程 ?
刚才我们将进程比做工厂里面一个独立的工作区域,那么每个工作区域都有员工的,一个独立的工作区域是可以有多个员工的,类似的,一个进程也可以有多个线程,线程之间进行协同工作,共享相同的数据和资源。线程是操作系统所能够调度的最小单位。
如下图所示:

同样都是线程,其中的一个线程能够创建其他的 6 个线程,并且有决定这些线程能够做什么的能力,那么这个线程就被称之为主线程。
在一个进程中所拥有的所有的资源,所有的线程都有权利去使用,这个就叫做“进程资源共享”。
理论上来讲,一个应用会对应一个进程,但是这并不是绝对的。一些大型的应用,在进行架构设计的时候,会设计为多进程应用。比较典型的就是 Chrome 浏览器。在 Chrome 浏览器中,一个标签页会对应一个进程,当前还有很多除了标签页以外的一些其他的进程。这样做的好处在于一个标签页崩溃后,不会影响其他的标签页。
这样的应用我们就称之为“多进程应用”,如下图所示:

和前面所提到的主线程类似,如果一个应用是多进程应用,那么也会有一个“主进程”,起到一个协调和管理其他子进程的作用。
例如,在 Node.js 里面,我们可以通过 child_process 这个模块来创建一个子进程,那么在这种情况下,启动这些子进程的 Node.js 应用实例就会被看作是主进程,child_process 就是子进程。主进程负责管理这些子进程,比如分配任务,处理通信和同步数据之类的。
回到 Electron 桌面应用,当我们启动一个 Electron 桌面应用的时候,该应用对应的也是一个多进程应用,如下图所示:

这里面 Electron 是主进程,对应的就是我们应用入口文件的 index.js,该主进程负责的任务有:
- 管理整个 Electron 应用程序的生命周期
- 访问文件系统以及获取操作系统的各种资源
- 处理操作系统发出的各种事件
- 创建并管理菜单栏
- 创建并管理应用程序窗口
Electron Helper(Renderer)该进程就是我们窗口所对应的渲染进程。
假设在任务管理器将该进程关闭掉,我们会发现窗口不再渲染任何的东西,但是应用还存在,窗口也还存在。
这里就需要说一下,实际上在 Electron 应用中,有一个窗口进程,由窗口进程来创建的窗口,之后才是渲染进程来渲染的页面。这也是为什么我们关闭了渲染进程,但是窗口还存在的原因。

假设我们创建了多个窗口,那么会有多个窗口进程么?
多个窗口下仍然只有一个窗口进程,由这个窗口进程负责绘制多个窗口,不同的窗口里面会有不同的渲染进程来渲染页面。
如下图所示:

最后再明确一个点,一个窗口只能对应一个渲染进程么 ?
其实也不是,哪怕我是在一个窗口里面,我也是可以有多个渲染进程的。如何做到?通过 webview 加载其他的页面,当你使用 webview 的时候,也会对应一个渲染进程。