二 进程与线程
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对进程进行监控管理。
调度
不能进行进程调度与切换的情况
进程在操作系统内核程序临界区中不能进行调度与切换
内核程序临界区一般用来访问某种内核数据结构的(进程的就绪队列)















