在计算机系统中CPU作为“运算核心”是通过进程与线程这两个抽象层实现对海量任务的有序调度、资源隔离与高效并发。理解CPU如何处理进程与线程本质是理解操作系统如何“管理任务”与“分配算力”——这一过程覆盖了资源定义、状态流转、调度算法、同步互斥、通信机制等多个维度是计算机体系的核心知识体系。一、进程与线程的定义1. 进程Process资源分配的基本单位进程是程序的一次运行实例是操作系统为其分配内存、CPU、文件句柄等资源的“最小单元”。当双击“浏览器”图标时操作系统会为浏览器分配独立的地址空间如4GB虚拟内存与其他进程隔离避免数据篡改加载程序代码与初始化数据到内存创建一个“进程控制块PCBProcess Control Block”——这是进程的“身份证”存储进程ID、状态就绪/运行/阻塞、寄存器值、内存地址范围、打开的文件列表等信息将进程加入“就绪队列”等待CPU调度。进程是“资源的容器”——每个进程都拥有独立的资源集合确保不同程序运行时互不干扰例如浏览器进程崩溃不会导致微信进程关闭。2. 线程ThreadCPU调度的基本单位线程是进程内的执行流是CPU实际“调度执行”的最小单元。一个进程至少包含一个线程称为“主线程”也可创建多个线程如浏览器的“渲染线程”“JS执行线程”“网络请求线程”。线程与进程的区别在于资源共享线程不拥有独立资源而是共享所属进程的所有资源如内存地址空间、文件句柄、网络连接线程仅拥有自身的“私有数据”1.线程IDTID、2.程序计数器PC记录下一条要执行的指令地址、3.寄存器组存储当前计算的临时数据、4.栈空间存储函数调用栈避免线程间栈数据冲突。3. 进程与线程的差异对比维度进程Process线程Thread资源分配单位操作系统资源分配的最小单元不分配资源共享所属进程资源CPU调度单位不直接被调度需通过线程CPU调度的最小单元地址空间独立每个进程有专属虚拟地址空间共享与所属进程的地址空间完全一致上下文切换开销大需切换地址空间、资源列表等小仅需切换PC、寄存器、栈资源不变通信成本高需通过IPC机制如管道、共享内存低直接读写共享内存需同步机制稳定性高一个进程崩溃不影响其他进程低一个线程崩溃可能导致整个进程崩溃二、进程与线程的状态流转CPU调度的“任务生命周期”CPU处理进程/线程围绕“状态转换”展开——在不同状态间切换操作系统通过状态管理实现对任务的有序调度。1. 进程的五大核心状态经典模型所有进程的生命周期都围绕以下5种状态流转CPU仅会调度“就绪态”进程新建态New进程刚被创建如双击软件操作系统正在为其分配资源、初始化PCB尚未加入就绪队列就绪态Ready进程已具备运行条件资源分配完成等待CPU空闲加入“就绪队列”运行态Running进程被CPU调度正在执行指令此时CPU的寄存器、PC均指向该进程的上下文阻塞态Blocked进程因等待资源/事件如等待磁盘读写完成、等待网络数据、等待键盘输入而暂停主动放弃CPU加入“阻塞队列”即使CPU空闲也无法调度阻塞态进程终止态Terminated进程完成任务或异常退出如点击关闭按钮、崩溃操作系统回收其资源内存、文件句柄删除PCB。2. 状态转换的触发条件状态流转是操作系统与CPU协同工作的体现新建态 → 就绪态进程初始化完成资源分配完毕就绪态 → 运行态CPU调度器从就绪队列中选择一个进程按调度算法将其上下文加载到CPU运行态 → 就绪态进程用完“时间片”如10ms或有更高优先级进程进入就绪队列操作系统剥夺当前CPU使用权保存其上下文放回就绪队列运行态 → 阻塞态进程发起“阻塞请求”如调用read()函数读取文件主动放弃CPU等待事件完成阻塞态 → 就绪态进程等待的事件完成如文件读取完毕操作系统将其从阻塞队列移回就绪队列运行态 → 终止态进程执行完exit()指令或因错误如内存访问越界被操作系统终止。3. 线程的状态与进程的差异线程的状态模型与进程基本一致新建、就绪、运行、阻塞、终止但有一个关键区别线程的阻塞不会导致进程阻塞。eg浏览器的“网络请求线程”因等待数据进入阻塞态时“渲染线程”仍可继续运行显示页面整个浏览器进程保持活跃。三、线程的实现模型CPU如何“感知”线程线程并非硬件直接支持的概念而是操作系统通过软件层抽象实现的。不同的实现模型直接决定了CPU能否利用多核、线程调度的开销大小主要分为三类1. 用户级线程ULTUser-level threads操作系统“看不见”的线程实现逻辑线程的创建、调度、状态管理均由“用户态库”如POSIX的pthread库实现操作系统仅感知进程不感知线程映射关系多对一多个用户级线程对应1个内核级线程内核级线程是操作系统与CPU交互的最小单元优缺点优点线程切换在用户态完成无需陷入内核开销极小可在不支持线程的操作系统上运行缺点无法利用多核CPU一个进程的所有线程只能在一个CPU核心上运行因内核仅分配一个内核线程若一个线程阻塞如等待IO整个进程的所有线程都会被阻塞内核认为进程阻塞。应用场景早期UNIX系统、轻量级并发场景如脚本语言的线程。2. 内核级线程KLTKernel-level threads操作系统“直接管理”的线程实现逻辑线程的创建、调度、状态管理均由操作系统内核实现每个线程对应一个“线程控制块TCB”内核通过TCB调度线程映射关系一对一1个用户级线程对应1个内核级线程优缺点优点可利用多核CPU多个线程可被调度到不同核心一个线程阻塞时其他线程不受影响内核仅标记该线程阻塞缺点线程切换需“陷入内核”保存/加载TCB开销较大线程数量受限于内核资源TCB占用内存过多线程会消耗内核资源。应用场景Windows、Linux2.6版本后、现代操作系统的主流模型。3. 混合级线程HLTMixed-level threads平衡开销与多核利用实现逻辑结合用户级线程与内核级线程由用户态库管理“用户级线程池”内核管理“内核级线程池”映射关系多对多多个用户级线程对应多个内核级线程数量可动态调整优缺点优点兼顾低开销用户态切换与多核利用内核级线程调度到多核心线程数量灵活用户级线程可远多于内核级线程缺点实现复杂需用户态库与内核协同应用场景Solaris系统、Java虚拟机JVM的线程模型如HotSpot VM在Linux上的实现。四、CPU调度机制如何选择“下一个要运行的任务”CPU的能力是“并发执行多任务”但单个CPU核心同一时间只能执行一个线程——操作系统通过“调度算法”实现“多任务并发”的错觉。调度机制分为三级调度其中“短程调度”直接决定CPU执行哪个任务。1. 三级调度从“任务入内存”到“CPU执行”的全流程调度级别别称作用调度对象频率长程调度作业调度选择“外存中的作业”加载到内存创建进程作业如用户提交的任务低分钟级中程调度内存调度当内存不足时将“部分进程挂起”移到外存释放内存内存充足时“激活挂起进程”进程中秒级短程调度CPU调度从“就绪队列”选择线程/进程分配CPU使用权就绪态线程/进程高毫秒级重点短程调度——这是CPU与操作系统交互最频繁的环节直接影响系统的响应速度与吞吐量。2. 短程调度的目标不同场景下调度算法的优化目标不同需在以下目标间权衡CPU利用率让CPU尽可能 busy避免空闲吞吐量单位时间内完成的任务数如服务器场景优先响应时间从用户发起请求到得到响应的时间如桌面系统优先周转时间任务从“进入就绪态”到“执行完成”的总时间包括等待时间运行时间公平性避免某个任务长期得不到CPU即“饥饿”问题。3. 经典调度算法1先来先服务FCFS, First-Come, First-Served最简单的“排队算法”逻辑按进程进入就绪队列的顺序调度先到先执行直到进程完成或阻塞例子就绪队列依次进入A运行时间10ms、B1ms、C1ms总周转时间10 (101) (1011)33ms优缺点实现简单、公平但“短作业会被长作业阻塞”如B、C需等A执行完吞吐量低。应用场景早期批处理系统无交互需求。2短作业优先SJF, Shortest Job First“短任务优先”的优化逻辑选择“预计运行时间最短”的就绪进程先执行分两种非抢占式一旦进程开始运行直到完成或阻塞才放弃CPU抢占式也叫“最短剩余时间优先SRTF”若新进入就绪队列的进程运行时间短于当前进程的剩余时间立即剥夺CPU例子同上队列A(10)、B(1)、C(1)非抢占式总周转时间1 (11) (1110)15ms远优于FCFS优缺点平均周转时间最短但“长作业会饥饿”若持续有短作业进入长作业永远得不到CPU无法准确预测运行时间。应用场景可预测任务运行时间的场景如批处理系统。3高响应比优先HRRN解决SJF的饥饿问题逻辑通过“响应比”动态选择进程响应比 等待时间预计运行时间/预计运行时间等待时间越长响应比越高即使是长作业等待时间足够长后也会被调度例子就绪队列A(10)、B(1)、C(1)初始响应比A1010/10、B101/1、C101/1随机选B执行B完成后A等待时间1响应比(110)/101.1C响应比(11)/12选C执行C完成后A响应比(210)/101.2选A执行总周转时间1 (11) (210)15ms同SJF且无饥饿优缺点兼顾公平与效率解决饥饿但需实时计算响应比开销略高。应用场景批处理与交互混合系统。4时间片轮转Round Robin, RR交互系统的“基础算法”逻辑为每个就绪进程分配固定“时间片”如10ms进程用完时间片后无论是否执行完都放回就绪队列末尾调度下一个进程关键参数时间片大小——太小会导致“上下文切换频繁”开销高太大则响应时间长接近FCFS通常时间片设为“10-100ms”匹配人类感知的响应速度例子就绪队列A(10)、B(1)、C(1)时间片2msA运行2ms→B运行1ms完成→C运行1ms完成→A运行2ms→A运行2ms→A运行2ms→A运行2ms完成总周转时间10 (21) (211)17ms优缺点响应时间短适合桌面系统如Windows、macOS公平性好但平均周转时间长上下文切换开销高。应用场景分时系统多用户交互、桌面操作系统。5多级反馈队列Multileved Feedback QueueMLFQ实际系统的“主流算法”MLFQ是“时间片轮转”与“优先级调度”的结合被Linux早期O(1)调度器、Windows XP等系统采用多队列设计设置多个优先级队列如Q0-Q7Q0优先级最高Q7最低时间片规则优先级越高时间片越小如Q0时间片10msQ120ms每低一级时间片翻倍调度规则仅调度最高优先级队列中的进程若Q0有进程不调度Q1及以下同优先级队列内按RR调度进程用完时间片后优先级降低一级如Q0→Q1放入对应队列进程等待时间过长如Q7的进程等待500ms优先级提升一级避免饥饿新创建的进程放入最高优先级队列Q0确保快速响应如用户点击打开软件优点兼顾响应时间高优先级短时间片、吞吐量低优先级长时间片与公平性避免饥饿适配复杂场景应用场景通用操作系统桌面、服务器。6Linux CFS调度器现代系统的“公平调度”Linux 2.6.23后采用“完全公平调度器CFS”摒弃传统“优先级队列”目标是“让每个线程获得公平的CPU时间”虚拟运行时间vruntime为每个线程维护“虚拟运行时间”计算公式实际运行时间 × (1024/线程权重)权重由线程优先级决定优先级越高权重越大vruntime增长越慢调度逻辑CPU始终选择“vruntime最小”的线程执行确保权重高的线程高优先级获得更多CPU时间优点无固定时间片动态调整执行时长公平性与效率平衡适配多核CPU。五、进程与线程的同步与互斥当多个线程/进程共享资源如内存中的全局变量、磁盘文件时会出现竞态条件Race Condition例如两个线程同时修改“计数器”初始值0均执行“countcount1”最终结果可能是1而非2因指令执行被打断。为解决这一问题需通过“同步与互斥”机制保证资源访问的有序性。1. 概念临界区Critical Section访问共享资源的代码段如“countcount1”需确保“同一时间只有一个线程/进程进入”互斥Mutual Exclusion多个线程/进程不能同时进入临界区同步Synchronization多个线程/进程按约定顺序执行如“线程A完成后线程B才能执行”。2. 互斥机制的实现1硬件方法底层指令保障中断禁用线程进入临界区前禁用CPU中断避免被调度打断退出后启用中断优点简单缺点禁用中断期间CPU无法响应其他任务适合单核心多核无效测试并设置TS指令一条原子指令不可被打断功能是“读取内存值→判断是否为0→若为0则设为1并返回true否则返回false”线程通过TS指令获取“锁”获取成功才进入临界区交换XCHG指令原子交换两个内存值逻辑与TS类似通过交换“锁变量”与“本地变量”实现互斥。2软件方法信号量与管程信号量Semaphore由荷兰科学家Dijkstra提出是最经典的同步原语定义为一个非负整数S支持两种原子操作P操作WaitSS-1若S0线程阻塞加入信号量的等待队列V操作SignalSS1若S≤0唤醒等待队列中的一个线程应用二进制信号量S0或1用于互斥初始化S1临界区前P操作后V操作计数信号量S≥0用于同步如控制同时访问资源的线程数。管程Monitor将“共享资源临界区同步操作”封装成一个“对象”确保只有管程内的函数能访问共享资源且同一时间只有一个线程执行管程内的函数管程内置“条件变量”如wait()、signal()实现线程间同步优点是安全性高避免信号量使用不当导致的死锁被Java、C#等语言支持如Java的synchronized关键字本质是管程。3. 死锁同步机制的“陷阱”死锁是多个线程/进程因“互相等待对方释放资源”而永久阻塞的状态需满足四大必要条件互斥条件资源只能被一个线程/进程占用持有并等待条件线程/进程持有部分资源同时等待其他资源不可剥夺条件资源只能由持有者主动释放不能被强制剥夺循环等待条件多个线程/进程形成“资源等待环”如A等B的资源B等A的资源。死锁的解决策略预防破坏四大条件之一如“资源有序分配”破坏循环等待“一次性分配所有资源”破坏持有并等待避免动态判断是否会产生死锁如“银行家算法”模拟分配资源若分配后系统处于“安全状态”则允许分配检测与解除通过“资源分配图”检测死锁解除方法包括“剥夺资源”“终止进程”如Linux的OOM Killer会终止占用内存多的进程解除内存资源死锁。六、进程与线程的通信机制进程间因地址空间独立需通过操作系统提供的“进程间通信IPCInter Process Communication”机制交换数据线程间因共享地址空间通信更简单但需同步机制保障安全。1. 进程间通信IPCInter Process Communication方式IPC机制实现逻辑优缺点应用场景管道Pipe内核维护的“字节流缓冲区”分为匿名管道父子进程间与命名管道任意进程间半双工需双向通信需两个管道优点简单缺点无消息边界只能传输字节流命令行重定向如ls | grep txt消息队列内核维护的“消息链表”进程按“消息类型”发送/接收消息有消息边界优点支持结构化数据缺点消息大小有限制进程间异步通信如服务器通知客户端共享内存内核分配一块“共享内存区域”多个进程将其映射到自身地址空间直接读写内存优点速度最快无需内核拷贝缺点需同步机制高频数据传输如数据库、游戏信号量用于同步与互斥非数据传输常与共享内存配合使用优点轻量缺点不能传输数据共享资源的访问控制信号Signal内核向进程发送的“异步通知”如CtrlC发送SIGINT信号进程可自定义处理函数优点实时性高缺点只能传递信号编号异常处理如进程崩溃通知套接字Socket跨主机/本地进程通信的网络协议接口支持TCP/UDP优点跨网络缺点开销大网络通信如浏览器与服务器2. 线程间通信ITC,Inter Thread Communication共享内存直接读写进程的全局变量、静态变量需通过synchronized、mutex等同步机制避免竞态条件消息传递通过线程安全的队列如Java的ConcurrentLinkedQueue传递消息避免直接共享数据条件变量管程内置的同步机制用于线程间“等待-通知”如线程A等待某个条件满足线程B满足条件后通知A。总结当用户双击“浏览器”图标时CPU与操作系统的协同流程如下进程创建操作系统为浏览器分配内存、创建PCB初始化主线程创建TCB将进程加入就绪队列CPU调度短程调度器如Linux CFS选择该进程的主线程加载其上下文PC、寄存器到CPU主线程进入运行态执行浏览器初始化代码线程创建浏览器主线程创建“渲染线程”“JS线程”“网络线程”共享浏览器进程的内存与文件资源状态流转网络线程发起HTTP请求进入阻塞态等待数据CPU调度渲染线程运行绘制页面网络数据到达后网络线程从阻塞态转为就绪态等待CPU调度同步与通信JS线程修改DOM时通过同步机制如锁通知渲染线程更新页面避免资源争抢进程终止用户点击关闭按钮浏览器进程的所有线程执行终止逻辑操作系统回收资源内存、文件句柄删除PCB/TCB进程进入终止态。从“进程创建”到“终止”CPU的核心工作是“按调度算法分配算力”操作系统的核心工作是“管理资源、维护状态、保障同步”——二者协同实现了“多任务并发”的计算机核心能力也是现代操作系统与CPU设计的底层逻辑。
阅读完成 · 觉得有帮助?