进程和线程的理解
首先是程序:可执行文件,被存储在磁盘上。当程序中的代码放入内存开始被执行时,它就变成了进程。操作系统会给进程分配他运行所需要的资源,例如寄存器、PC、栈指针、内存页等等,系统调用资源的最小单位。
不同进程的执行不会影响到彼此,例如浏览器中如果每一个页面都在一个独立的进程中执行的话,有一个页面出现bug或受到攻击,其他的页面也并不会受影响。
线程:进程中的一个执行单元,可以独立运行的最小单位,每个进程至少有一个线程,也就是主线程,一般都会有多个线程。每个线程都有自己的栈空间(其实也有寄存器、PC、栈指针),但一个进程中的所有线程是共享内存地址空间的,这一点可以实现线程之间的通信。
打开一个网页之后可以有哪些线程?
打开一个网页后,可能会涉及到多个线程,这些线程可能包括但不限于以下几种:
- 主线程:负责页面的渲染和用户交互。当用户打开网页时,浏览器会创建一个主线程来处理渲染和用户交互等任务。
- JavaScript 线程:负责处理网页中的 JavaScript 代码。当网页包含 JavaScript 代码时,浏览器会为该网页创建一个 JavaScript 线程来处理 JavaScript 代码的执行。
- 样式计算线程:负责计算网页中的样式。当用户打开网页时,浏览器会通过样式计算线程计算网页中的所有元素的样式。
- 布局线程:负责计算网页中的布局。当网页中的元素的样式被计算后,浏览器会通过布局线程计算这些元素的位置和大小等信息。
- 图片加载线程:负责加载网页中的图片。当网页包含图片时,浏览器会为该网页创建一个或多个图片加载线程来加载图片。
- AJAX 线程:负责处理 AJAX 请求。当网页中需要与服务器进行数据交互时,浏览器会为该网页创建一个或多个 AJAX 线程来处理 AJAX 请求。
- Web Worker 线程:Web Worker 是 HTML5 中的一个 API,用于创建多线程的 JavaScript 程序。当网页中包含 Web Worker 时,浏览器会为该网页创建一个或多个 Web Worker 线程来处理 JavaScript 代码。
进程切换开销
-
- 切换虚拟地址空间
- 切换 CPU 上下文
- 切换内核栈
线程切换开销
-
- 切换 CPU 上下文
- 切换内核栈
进程的状态(生命周期):
- 新建状态(New):进程正在创建并进行初始化,但是还没有被操作系统调度运行。
- 就绪状态(Ready):进程已经完成初始化,等待分配CPU资源进行运行。当进程等待某些事件发生时,比如等待输入/输出操作完成,也会进入就绪状态。
- 运行状态(Running):进程正在占用CPU资源运行。
- 阻塞状态(Blocked):进程正在等待某些事件的发生,例如等待输入/输出操作完成、等待信号量等,此时进程无法继续执行。当事件发生时,进程会从阻塞状态转移到就绪状态,等待CPU调度运行。
- 终止状态(Terminated):进程已经运行完成或被终止,等待操作系统回收其占用的资源。
在不同状态之间转移是进程生命周期的基础,通过状态的切换,操作系统可以控制多个进程的执行顺序和资源分配。