进程与线程

为了提高CPU的利用率发明了进程

处理器的速度比大部分IO设备的速度都要快得多。
程序在IO设备上运行时,处理器必须暂停保持空闲,等待IO处理结果(如图a)。这将导致严重的资源浪费。
如果当CPU阻塞,等待其他设备运行结果时,将原有程序挂起,转而运行其他程序(如图b),则CPU的利用率将会得到大幅提高。

另一方面,在单核系统中,为了在宏观上实现程序的并行,避免一个程序长时间占用CPU导致其他程序无法被执行,在一定时间后,CPU主动将正在运行的程序调出,转而执行其他程序。
尽管在微观上,仍然是一条条指令顺序执行,但在宏观上实现了并行。

多个程序并发执行

为了恢复执行时,程序能在被挂起前的位置继续执行接下来的代码,需要将程序的上下文及有关数据保存起来,存储在内存中,将这部分信息称之为进程

进程是内存中存储的数据结构

进程是系统作为资源分配的基本单位,由一组机器指令、数据结构和堆栈等组成,能独立运行的活动实体。

可以把进程视为由一组元素组成的实体,包括程序代码和与之相关联的数据集
在内存中,分配一个称为**进程控制块(Process Control Block,PCB)**的数据结构,用于存放进程的信息。

操作系统在执行调度、资源分配、中断处理、性能监控和分析时,都能读取和修改PCB。可以说PCB集合定义了操作系统的状态。

进程链表结构

PCB包含进程标识信息、进程状态信息和进程控制信息。

进程标识信息

进程状态信息

运行一个进程时,进程的信息会出现在寄存器中。中断进程时,必须保存该寄存器的所以信息,以便腾出寄存器给其他进程使用,
并且恢复执行时可以恢复这些信息到寄存器中。包括:

进程控制信息

操作系统在控制和协调各种活动进程所需的额外信息。包括:

操作系统通过创建和管理进程控制块来管理进程。PCB包含了充分的信息,也因此可以中断一个进程的执行,并在之后恢复。

PCB分为五种状态用来描述进程的行为

在任何一个时刻,一个进程要么正在被执行,要么未执行。
未被执行的进程,一些进程已经就绪,待CPU调度便可马上执行;一些进程被阻塞等待IO;还有的进程已经运行结束,需要辅助程序分析和记录;

五状态模型对进程从新建到退出的各个状态进行了划分:

进程状态之间的转换

进程状态切换

进程在发生系统中断或陷阱时切换线程

新增挂起态将进程换出内存

进程由新建态转换为就绪态时,便将该进程有关的代码和数据保存在内存中。在未使用虚拟内存的系统中,内存不足时,如果没有就绪的进程,那么无法将新建态的进程转换为就绪态。导致CPU的利用率降低。
从操作系统的角度,可以将内存中的阻塞或就绪的一部分或全部进程转移到磁盘中。

包含挂起态的进程状态转换图

线程

在进程中,将可被操作系统调度和分派的实体,独立出来,称之为线程。未提出线程概念的系统中,可认为是一个单线程进程模型。

单线程和多线程进程模型

一个进程中可能有一个或多个线程,每个线程都有:

多线程共享进程的状态和资源

多线程模型中,每个线程会有单独的栈单独的控制块,控制块中包含寄存器值、优先级和其他与线程相关的状态信息。
因此,进程中的所有线程共享该进程的状态和资源,所有线程都驻留在同一块地址空间中,并可访问相同的数据。

当某个线程改变了内存中的一个数据项时,其他线程在访问这一数据项时会看到这一变化。
若一个线程以读权限打开一个文件,那么其他线程也能从这个文件中读取数据。

因此需要同步各种线程的活动,以便他们互不干扰且不破坏数据结构。

多线程相比单线程性能更高

挂起态对象成没有意义

如果一个进程被换出,由于所有线程共享该进程的地址空间,因此所有线程都将被换出。

线程仅有4种状态:

线程阻塞不会导致进程阻塞

若一个被阻塞线程阻塞了整个进程,则会丧失线程的某些灵活性和能力。