2.1 进程与线程

2.1.1 进程的概念和特征

1 进程的概念

为使参与并发执行的每个程序都能独立运行,必须为之配置一个专门的数据结构,称为进程控制块PCB

系统利用PCB描述进程的基本情况和运行状态,进而控制和管理进程。

程序段、相关数据段、PCB构成了进程实体

创建进程就是创建进程的PCB,撤销就是撤销进程的PCB

进程是进程实体的运行过程,是系统进行资源分配的独立单位(资源指时间片,决定了进程是一个动态的过程性的概念)

2 进程的特征

动态性;进程是程序的一次执行,有生命周期,动态地产生、变化、消亡。动态性是进程最基本的特征。

并发性;多个进程同存于内存中。引入进程的目的就是使进程能和其他进程并发执行。并发性是进程的重要特征,也是操作系统的重要特征。

独立性;指进程是一个能独立运行、独立获得资源的基本单位。

异步性;进程相互制约,各进程按独立的不可预知的速度向前推进,需要在操作系统中配置相应的进程同步机制。

2.1.2 进程的组成

1 PCB

进程创建的主要工作:

1. 申请空白的 PCB (进程控制块)

PCB是操作系统管理进程的核心数据结构,也是进程存在的唯一标志。操作系统首先要在内存的内核区中为新进程申请一个空白的 PCB 结构。如果系统资源耗尽,PCB 分配失败,进程创建就会报错。

2. 分配唯一的进程标识符 (PID)

操作系统会为这个新申请的 PCB 分配一个全局唯一的数字 ID,也就是 PID。同时,会在新进程的 PCB 中记录下是谁创建了它(即父进程的 PID),从而建立起进程间的家族树关系。

3. 为进程分配运行资源 (内存等)

操作系统需要为新进程分配运行所需的物理内存或虚拟内存空间,用来存放程序的代码段、数据段以及程序运行所需的栈和堆。

实战细节补充:在现代 Linux 系统中,如果是通过 fork() 创建子进程,系统并不会立刻把父进程的内存全部拷贝一份,而是采用**写时复制(Copy-on-Write, COW)**机制。子进程起初只是共享父进程的物理内存,只有当父子双方有一方试图修改数据时,操作系统才会真正为修改的那一页数据分配新的物理内存。这极大地提高了进程创建的效率。

4. 初始化 PCB 中的各项信息

分配好资源后,操作系统需要把进程的初始状态写进 PCB 里,主要包括:

程序计数器(PC):将其指向程序的入口地址(或者是 fork() 之后的下一条指令)。

寄存器状态:初始化各种 CPU 寄存器的值,为进程日后上 CPU 运行做好准备。

控制与状态信息:将进程的初始状态设置为就绪态,并赋予它一个初始的调度优先级。

5. 将进程插入就绪队列

一切准备就绪后,操作系统会将这个填满信息的 PCB 节点挂载到系统的就绪队列中。

进程通信

管道通信

只支持半双工通信,只能在父子进程中使用

共享存储

消息传递

线程

线程也是程序执行流的最小单位

挂起状态

引入虚拟存储后,可将暂时不能运行的进程调至外存等待。等他重新具备了运行条件且内存又稍有空闲时再重新调入内存。(提高内存利用率和系统吞吐量)

暂时调到外存等待的进程为挂起状态,PCB不会一起调到外存,而是常驻内存进入挂起队列。PCB会记录进程数据在外存中的位置,进程状态等信息。操作系统通过内存中的PCB对进程进行监控管理。

调度

不能进行进程调度与切换的情况

进程在操作系统内核程序临界区中不能进行调度与切换

内核程序临界区一般用来访问某种内核数据结构的(进程的就绪队列)

进程放弃处理机