进程的定义
把一个静态的程序通过操作系统在内存中让cpu执行起来,形成了一个动态的执行过程,这个执行过程成为进程
-
程序(Program): 静态的实体。它是一组存储在磁盘或其他存储介质上的指令和数据的集合(例如一个
.exe
文件或一个 Python 脚本文件)。 -
进程(Process): 动态的实体。当一个程序被加载到内存中并开始执行时,它就变成了一个进程。 进程是程序的一次执行实例,它拥有运行程序所需的所有资源(内存空间、CPU时间、打开的文件、网络连接、安全属性等)同一个程序可以同时运行多次,产生多个独立的进程(例如,你可以同时打开多个记事本窗口)。
两者联系
两者区别
1.进程在执行过程中,要完成默写特定的功能,有些功能只有操作系统才能提供,比如读取文件,进程向操作系统发出请求,操作系统代表进程在内核执行,这个时候进程处于核心态,所以说进程有核心态,用户态
2.执行一段程序,一个进程的形式在内存中运行,而程序保存在硬盘中
3.操作系统为了管理这个进程,会引入额外的结构和状态变化,这个后面会说
进程的组成
-
程序的代码
- 含义:这是进程执行的指令序列或源代码,存储在内存中。它定义了程序要执行的操作,例如计算、逻辑判断等。
- 作用:作为进程的核心,代码决定了进程的行为和功能。没有代码,进程无法运行。
- 示例:在一个文本编辑器的进程中,代码可能包括打开文件、编辑文本和保存文件的指令。
-
程序处理的数据
- 含义:这是进程操作的数据对象,包括输入数据、输出数据、中间计算结果等。数据可以是变量、数组、结构体等。
- 作用:数据是代码处理的对象,进程通过读取和修改数据来实现功能。它反映了程序的当前状态。
- 示例:在一个计算器进程中,数据可能包括用户输入的数字和运算符,以及计算结果。
-
程序计数器中的值,指示下一条将运行的指令
- 含义:程序计数器(Program Counter, PC)是一个特殊的CPU寄存器,保存了下一条要执行的指令在内存中的地址。
- 作用:它控制进程的执行流程,确保指令按顺序运行或在跳转时(如函数调用)正确切换。这使进程知道从哪里继续执行。
- 示例:在一个游戏进程中,程序计数器可能指向当前帧的渲染指令,下一条指令可能是处理用户输入。
-
一组通用的寄存器的当前值,堆、栈
- 含义:
- 通用寄存器:CPU中的临时存储单元,用于保存当前计算的数据或地址(如累加器、基址寄存器)。
- 堆(Heap):动态分配的内存区域,用于存储程序运行时创建的对象(如通过
malloc
或new
分配的内存)。 - 栈(Stack):后进先出(LIFO)的内存区域,用于管理函数调用、局部变量和返回地址。
- 作用:寄存器和内存区域共同维护进程的执行上下文。寄存器提供快速访问,堆支持动态内存管理,栈处理函数嵌套和局部数据。
- 示例:在一个Web浏览器进程中,寄存器可能存储当前标签页的状态,堆用于存储加载的网页内容,栈用于处理JavaScript函数的调用链。
- 含义:
-
一组系统资源(如打开的文件)
- 含义:这是进程使用的操作系统管理的资源,包括文件句柄、网络连接、设备接口等(如打开的文件、套接字或打印机)。
- 作用:这些资源使进程能与外部环境交互,例如读写文件或网络通信。操作系统负责分配和回收这些资源,确保进程安全运行。
- 示例:在一个音乐播放器进程中,系统资源可能包括打开的音频文件、网络流媒体连接或音量控制设备。
进程的特点
一、动态性(Dynamic Nature)
定义:进程是程序的一次动态执行过程,具有生命周期(创建→运行→终止)。
核心表现:
- 创建与销毁:进程由操作系统动态创建(如系统调用
fork()
),分配资源(内存、文件句柄等),并在任务结束或异常时被终止回收资源。 - 状态变化:进程在执行过程中可能经历多种状态转换(就绪、运行、阻塞等),例如等待I/O操作时从运行态转为阻塞态。
示意图关联:左侧“进程切换示意图”中的箭头体现了进程状态的动态切换(如A→B→C→D),每个程序计数器(PC)的切换对应进程状态的改变。
二、并发性(Concurrency)
定义:多个进程可同时在内存中存在,通过时间片轮转等调度策略交替占用CPU,宏观上“同时运行”。
核心表现:
- 并发 vs 并行:
- 并发:单核CPU通过快速切换实现多进程“同时”执行(如示意图右侧时间轴上A、B、C、D交替执行)。
- 并行:多核CPU真正同时运行多个进程(需硬件支持)。
- 资源复用:通过进程调度(如先来先服务、优先级调度),CPU和内存资源被高效共享,提升系统吞吐量。
挑战:并发可能导致执行结果不确定(异步性),需同步机制(如信号量)保障正确性。
三、独立性(Independence)
定义:每个进程拥有独立的地址空间和系统资源(内存、文件等),互不干扰。
核心表现:
- 内存隔离:进程通过页表(Page Table)和MMU(内存管理单元)实现虚拟地址到物理地址的独立映射,一个进程无法直接访问其他进程的内存。
- 资源独立:操作系统为每个进程分配独立的文件描述符、环境变量等资源,进程崩溃不会影响其他进程(如Chrome浏览器多标签页独立进程设计)。
示意图关联:右侧时间轴中A、B、C、D的独立执行线段,体现了进程各自推进的独立性。
四、制约性(Constraint)
定义:进程因共享资源或协作任务而产生互斥或同步关系。
核心表现:
- 互斥(Mutual Exclusion):
- 临界资源(如打印机、共享变量)一次仅允许一个进程访问。
- 通过信号量(Semaphore) 或互斥锁(Mutex) 实现(例如P/V操作)。
- 同步(Synchronization):
- 协作进程需按特定顺序执行(如生产者-消费者模型)。
- 通过条件变量(Condition Variable) 或屏障(Barrier) 协调执行顺序。
挑战:制约不当可能导致死锁(Deadlock)或竞态条件(Race Condition)。
进程控制块
一、进程标识信息
核心作用:唯一标识进程身份与归属关系,实现权限控制和进程树管理。
-
本进程标识符(PID)
- 定义:操作系统分配给进程的唯一非负整数标识(如Linux中PID范围通常为1~32767)。
- 功能:通过
getpid()
系统调用获取当前PID,用于进程调度、资源分配和信号传递。 - 唯一性:进程终止后PID可被回收重用,但同一时刻PID全局唯一。
-
父进程标识符(PPID)
- 定义:记录创建该进程的父进程PID(如Shell启动程序时,Shell为父进程)。
- 功能:支持进程树管理(
pstree
命令可查看层级关系),父进程通过wait()
回收子进程资源,避免僵尸进程。
-
用户标识符(UID)
- 权限控制:分为实际用户ID(启动进程的用户)和有效用户ID(决定文件访问权限),通过
setuid()
可修改权限。 - 安全机制:例如SUID程序(如
passwd
)运行时,有效用户ID临时提升为root以修改系统文件。
- 权限控制:分为实际用户ID(启动进程的用户)和有效用户ID(决定文件访问权限),通过
二、处理机状态信息保存区
核心作用:保存进程被中断时的CPU现场,确保切换后能恢复执行。
-
用户可见寄存器
- 数据/地址寄存器:存储运算中间结果和内存地址(如EAX、EBX)。
- 示例:进程计算
a = b + c
时,b、c的值暂存于寄存器,切换时需保存至PCB。
-
控制和状态寄存器
- 程序计数器(PC):指向下一条待执行指令地址,中断时保存PC值确保恢复后继续执行。
- 程序状态字(PSW):包含标志位(如进位标志CF、零标志ZF),记录算术运算结果和CPU状态。
示例:若进程执行除法时除数为0,PSW溢出标志触发异常处理。
-
栈指针(Stack Pointer)
- 功能:指向当前栈顶地址,保存函数调用链、局部变量及中断现场。
- 场景:系统调用时,内核栈保存用户栈指针以切换执行上下文。
三、进程控制信息
核心作用:管理进程资源、调度策略及协作机制。
-
调度和状态信息
- 进程状态:就绪(等待CPU)、运行(占用CPU)、阻塞(等待I/O)等。
- 调度参数:优先级(实时进程优先于普通进程)、时间片长度(如Linux默认100ms)。
- 队列指针:指向就绪队列/阻塞队列中的下一个PCB,实现调度器高效遍历。
-
进程间通信(IPC)信息
- 通信机制:信号量、消息队列、共享内存的标识符存储于PCB。
- 示例:进程A向进程B发送消息时,内核通过B的PCB定位其消息队列缓冲区。
-
存储管理信息
- 内存结构:记录页表/段表基址(如x86的CR3寄存器),实现虚拟地址转换。
- 隔离保障:各进程页表独立,防止越界访问(如进程无法读写其他进程的0x08048000地址)。
-
进程所用资源
- 文件描述符表:记录打开的文件句柄(如fd 0/1/2对应stdin/stdout/stderr)。
- 资源清单:I/O设备、信号量、定时器等资源标识符,进程终止时由内核统一回收。
-
数据结构连接信息
- 组织方式:
- 链表:同状态PCB组成队列(如就绪链表、阻塞链表)。
- 索引表:按状态建立哈希表加速查找(较少用)。
- 亲属关系:父进程PCB记录子进程链表指针,支持
wait()
遍历子进程。
- 组织方式:
进程生命周期
1.NULL -> 创建状态:一个新进程被创建时的第一个状态;
2.创建状态 -> 就绪状态:当进程被创建完成并初始化后,一切就绪准备运行时,变为就绪状态,这个过程是很快的;
3.就绪态 -> 运行状态:处于就绪状态的进程被操作系统的进程调度器选中后,就分配给 CPU 正式运行该进程;
4.运行状态 -> 结束状态:当进程已经运行完成或出错时,会被操作系统作结束状态处理;
5.运行状态 -> 就绪状态:处于运行状态的进程在运行过程中,由于分配给它的运行时间片用完,操作系统会把该进程变为就绪态,接着从就绪态选中另外一个进程运行;
6.运行状态 -> 阻塞状态:当进程请求某个事件且必须等待时,例如请求 I/O 事件;
7.阻塞状态 -> 就绪状态:当进程要等待的事件完成时,它从阻塞状态变到就绪状态;