当使用系统着手创建新历程时,会依次执行资源分配、初始化历程控制块(PCB)等使用。以在 Windows 系统中启动大型游戏《英雄联盟》为例,系统首先会为该游戏历程分配初始内存空间,用于加载游戏的底子步伐代码与配置数据;接着构建 PCB,在其中记载历程的优先级、初始状态等关键信息。当这些核心使用完成后,游戏历程便从创建态顺遂过渡到停当态,进入停当队列等待 CPU 调度执行。
1.2 停当态到运行态
调度步伐依据特定算法,从停当队列中挑选历程投入运行。假设系统处于多使命繁忙状态,停当队列中有浏览器历程(用于浏览网页)、音乐播放器历程(播放配景音乐)、游戏历程(运行《英雄联盟》)。若接纳优先级调度算法,且游戏历程被赋予较高优先级,那么调度步伐会选中游戏历程,使其从停当态切换为运行态,进而占用 CPU 资源,执行游戏的各项指令,如渲染游戏画面、处置处罚玩家使用输入等。
1.3 运行态到阻塞态
当历程遭遇需等待外部变乱完成的环境时,会主动进入阻塞态。继续以《英雄联盟》游戏历程为例,在游戏运行过程中,若须要从硬盘加载新的游戏地图数据,由于硬盘 I/O 使用速度远低于 CPU 处置处罚速度,在等待数据读取完成的时间段内,游戏历程会进入阻塞态。此时,CPU 资源会被释放,调度步伐将其分配给其他停当态历程,如音乐播放器历程可继续播放音乐。
1.4 阻塞态到停当态
一旦历程所等待的变乱完成,便会立刻从阻塞态转换为停当态。在上述游戏加载地图数据的场景中,当硬盘成功将地图数据传输至内存后,游戏历程所等待的 I/O 变乱竣事,它会迅速从阻塞态切换为停当态,重新进入停当队列,等待 CPU 再次调度,以便继续执行后续的游戏逻辑,如显示新地图画面、加载 NPC 信息等。
1.5 运行态到停当态
以生产者 - 消耗者模型为例,生产者历程负责生产数据并放入缓冲区,消耗者历程从缓冲区读取数据。设置两个信号量:empty(表现缓冲区空闲槽位数量,初始值为缓冲区大小)和 full(表现缓冲区中已添补数据的槽位数量,初始值为 0)。生产者历程在生产数据前执行 P (empty),若缓冲区已满,empty 值减为负数,生产者历程阻塞;生产数据后执行 V (full),叫醒可能阻塞的消耗者历程。消耗者历程在读取数据前执行 P (full),若缓冲区为空,full 值减为负数,消耗者历程阻塞;读取数据后执行 V (empty),叫醒可能阻塞的生产者历程,以此实现两者的同步执行。
3.2 管程同步
使用二进制信号量可轻松实现历程互斥。将二进制信号量 mutex 初始化为 1,多个历程在进入临界区前执行 P (mutex) 使用,若 mutex 值减为 0,分析成功获取锁,可进入临界区;若 mutex 值变为负数,历程阻塞。在退出临界区时执行 V (mutex) 使用,叫醒可能阻塞的其他历程。比方,多个历程同时访问共享的打印机资源,每个历程在使用打印机前执行 P (mutex),确保同一时刻仅有一个历程能占用打印机,使用完毕后执行 V (mutex),让其他历程有机会使用,有效制止打印机资源的冲突使用。
五、信号量机制
信号量是控制历程对共享资源访问的核心工具,分为二进制信号量和计数信号量。
5.1 二进制信号量
其取值固定为 0 或 1,常用于实现历程互斥。以多个历程访问共享文件为例,设置二进制信号量 file_lock 初始值为 1。历程在读取或写入文件前,先执行 P (file_lock),若成功获取(file_lock 变为 0),则可对文件举行使用;使用完成后执行 V (file_lock),释放文件锁,答应其他历程访问。若有多个历程同时实验访问文件,只有一个历程能成功执行 P (file_lock),其他历程将被阻塞,直至锁被释放,从而保证文件资源的互斥访问。
5.2 计数信号量
其取值为非负整数,可用于历程同步与资源计数。比方,系统中有 3 台打印机可供多个历程使用,设置计数信号量 printer_count 初始值为 3。历程须要使用打印机时,执行 P (printer_count),若 printer_count 值大于 0,分析有可用打印机,值减 1 后历程可使用打印机;若 printer_count 值变为 0,分析打印机已全部被占用,历程阻塞等待。当历程使用完打印机后,执行 V (printer_count),释放一台打印机资源,若有历程阻塞等待,会叫醒其中一个历程继续执行,通过计数信号量有效管理打印机资源的分配与使用。
六、PV 使用
PV 使用是对信号量举行使用的原语。
6.1 P 使用
P 使用(wait 使用)用于申请资源。以停车场车辆进出管理为例,假设停车场最多容纳 10 辆车,设置计数信号量 parking_space 初始值为 10。每辆车进入停车场时,执行 P (parking_space),若此时停车场还有空位(parking_space 值大于 0),值减 1 后车辆可进入;若停车场已满(parking_space 值为 0),后续执行 P 使用的车辆历程将被阻塞,等待其他车辆脱离停车场释放资源。
6.2 V 使用
V 使用(signal 使用)用于释放资源。在上述停车场场景中,当车辆脱离停车场时,执行 V (parking_space),将 parking_space 值加 1,若有其他车辆历程因等待停车位而阻塞,会叫醒其中一个历程,答应其进入停车场,通过 PV 使用实现对停车场资源的动态管理与控制。
七、PV 使用实现前驱使用 刷题
通过设置信号量可精准实现历程间的前驱关系。比方,在一个视频编辑项目中,有三个历程:P1 负责视频剪辑,P2 负责添加字幕,P3 负责天生终极视频。要求 P2 在 P1 完成后执行,P3 在 P2 完成后执行。设置三个信号量 S1、S2、S3,初始值均为 0。在 P1 剪辑视频完成后执行 V (S1);P2 在开始添加字幕前执行 P (S1),若 P1 未完成,P2 将阻塞等待;P2 添加字幕完成后执行 V (S2);P3 在天生终极视频前执行 P (S2),若 P2 未完成,P3 将阻塞等待。以此类推,通过 PV 使用确保历程按 P1→P2→P3 的顺序依次执行,保障视频编辑使命的精确流程。
八、死锁