
操作系统是一组做计算机资源管理的软件的总称。
目前常见的操作系统有:Windows、Unix、Linux、OSX、Mac OS、Android、iOS和鸿蒙等。
操作系统的职责是:
进程 是操作系统对正在运行的程序的一种抽象,也可以说 进程就是程序的一次运行过程 。
进程是操作系统资源分配的基本单位。
操作系统是如何对大量进程进行管理的呢?
使用进程控制块(PCB)来记录进程的相关信息,如进程的唯一标识(pid)、进程关联的程序信息(哪个程序,加载到内存中的哪个区域等)、分配给该进程的各个资源和进程调度信息等。
这样一来,每一个PCB就代表着一个正在运行的程序(进程)。
进程控制块 其实本质就是一个结构体,在这个结构体中包含许多包含进程相关信息的属性。
操作系统再通过一些数据结构(链表、搜索树等)将PCB组织起来,以便管理时进行增删查改操作。
1. pid:进程的身份标识符,唯一的
2. 内存指针:是一组指针,指向进程所需要执行的程序存放在硬盘上的指令以及这些指令所依赖的数据。
· 因为进程在运行过程中十分依赖内存资源,操作系统加载可执行程序(以 .exe 为后缀的程序,里面保存了程序运行时的指令和数据)的过程中,会把其中的指令和数据读取出来,加载到内存中。在后续的进程运行中,cpu 就可以从存放指令的内存中读取指令并执行。(所有的软件都是由 cpu 来执行,而 cpu 具体执行哪些软件的指令,是由操作系统加载到内存上的指令决定的)
3. 文件描述符表:记录进程与硬盘上文件的交互信息。
· 进程在运行过程中经常需要和硬盘进行交互,而硬盘上的数据是以文件的形式组织的。在进程读写文件的时候需要打开文件,每一次打开一个文件,都会把文件的信息保存在文件描述符表中的一个项中。(一个项对应着一个文件)
4. 进程调度(进程状态、进程优先级、进程的上下文和进程的记账信息)
· 操作系统在管理进程的过程中,通常需要完成很多重要的工作。

从上图可以看到,此时我的电脑的进程数有279个,但是 cpu 的核心数(即逻辑处理器)只有22个。
一个 cpu 逻辑核心在同一时刻,只能够执行一个进程的指令。那22个 cpu 逻辑核心如何能够在同一时刻执行279个进程的指令呢?
早期的计算机在同一时刻只能够运行一个进程,要想运行下一个进程,只能结束当前进程。
这时候, 多任务操作系统 登场了。即使只有一个 cpu 逻辑核心,也能够同时运行多个进程。
使用的方法是 分时复用 ,把一个单位时间分成很多份,每一份时间安排执行不同进程的指令(如第一份时间用来执行进程1的指令、第二份时间用来执行进程2的指令......),cpu 的运行时间是很快的(一秒钟能够执行上亿次指令),那么切换进程执行的速度也是很快的,以至于人眼看上去像是这些进程在 “同时运行” 一样。
现代 cpu 在运行进程的时候,并发和并行是同时存在的。 程序员写代码的时候,通常无法区分进程是“并发执行”还是“并行执行”,统称为“并发执行”
因为需要并发执行,所以操作系统需要进行进程运行的快速切换,也称为“进程调度”,进程调度包含了一些记录进程并发执行的信息(进程状态、进程优先级、进程的上下文和进程的记账信息)。
· 进程状态:进程在执行的过程中有很多状态,其中两个主要状态是“就绪状态”和“阻塞状态”。
· 就绪状态:指 cpu 可以随时执行进程的指令;
· 阻塞状态:指当前进程的指令不适合被 cpu 执行。
· 进程优先级:有些进程本身需要消耗 cpu 资源更多(如游戏和浏览器对比,游戏需要消耗 cpu 资源比浏览器更多),则该进程的优先级较高。
· 进程的上下文:保存进程执行的中间状态,确保并发执行时 cpu 能够沿着某个进程上次的执行状态继续执行。
· 我们操作系统的并发执行是采用分时复用的,假如一个进程的执行时间被安排到了第一份时间和第三份时间,那么这个进程的指令被执行一会之后,cpu 就去执行其他进程了,当 cpu 执行完其他进程后回来继续执行该进程,是应该从头开始执行呢?还是刚才的进度继续执行呢?进程的上下文就是通过寄存器记录进程在并发执行过程中的中间状态(进度),以确保执行完其他进程后的 cpu 回来执行时能够沿着之前进度继续执行。
· 进程的记账信息:统计每一个进程在 cpu 上运行了多久。
· 为了合理分配 cpu 资源,当操作系统发现某一个进程已经很久没有分配到 cpu 的资源了,就会给该进程分配一些 cpu 资源。
在并发执行中,cpu 频繁创建进程、销毁进程,对资源的消耗比较大,为了解决这个问题,引入 线程 的概念,线程可以理解为 轻量级进程 ,即创建和销毁的开销更小。
线程也是一个正在运行的任务,但是这个“任务”要比进程的任务更加小,可能是执行一段代码级别的任务。
cpu 执行线程的过程,与 进程调度 是一样的,但是我们称为 线程调度。每一个线程都有对应的线程调度信息(状态、优先级、上下文和记账信息),但是一个进程中的所有线程都共享同一份 文件描述符表 和 内存指针。
线程是操作系统调度执行的基本单位。
完