进程调度、上下文切换

本文探讨了多道程序设计及分时系统的目的,并详细解释了作业队列、就绪队列和设备队列的概念。此外,还介绍了进程调度过程中涉及的上下文切换机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多道程序设计的目的:无论何时都有进程在运行,从而使CPU利用率达到最大化
分时系统的目的:在进程之间快速切换CPU以便用户在程序运行时能与其进行交互。

作业队列:进程进入系统时,包括系统中的所有进程
就绪队列:驻留在系统内存中的就绪的、等待运行的进程
设备队列:等到特定I/O设备的进程列表


进程调度队列图:


就绪队列————————————>CPU——————>|
          |<---I/O<——I/O队列<——I/O请求<—————-|
          |—————————————时间片结束<———|
          |<——————子进程运行<——创建子进程<——|
          |<——————中断发生<————等待中断<——|

上下文切换:将CPU切换到另一个进程需要保存current 进程state并恢复另一个进程的状态。发生context switch时,内核会将旧进程的状态保存在PCB中,然后装入经调度要执行的并已保存的新的进程上下文。

### Linux 进程上下文切换原理 在 Linux 系统中,进程上下文切换是指当 CPU 需要从一个进程切换到另一个进程时所执行的一系列操作。这一过程涉及保存当前运行进程的状态以及恢复下一个待运行进程的状态[^1]。 具体来说,上下文切换的过程包括以下几个方面: - **寄存器状态保存**:为了确保被暂停的进程能够在其下次调度时继续执行,操作系统需要保存该进程的所有寄存器状态。 - **程序计数器更新**:程序计数器指向即将执行的指令地址,在上下文切换过程中也需要进行相应的调整。 - **内存管理单元 (MMU)**:如果涉及到不同进程之间的切换,则还需要刷新 MMU 的页表映射关系,以便新进程访问其对应的虚拟地址空间[^2]。 这些复杂的操作使得频繁发生上下文切换成为影响系统整体性能的重要因素之一。 ### 解决与优化方法 针对因高频率上下文切换而导致的性能瓶颈问题,可以从多个角度出发来改善情况: #### 减少不必要的线程/进程创建 过多活跃的同时存在的轻量级单位如线程或重载型实体像传统意义上的独立流程都会增加竞争条件下的切换开销。因此合理规划应用架构设计减少此类对象实例数量至关重要。 #### 使用无锁数据结构 对于多线程环境中的共享资源访问控制机制而言,默认采用互斥锁可能会引发额外等待从而加剧上下文转换现象;改用基于原子操作构建而成无需依赖显式锁定逻辑的数据容器则可以在一定程度上缓解上述矛盾局面。 #### 调整工作负载分配策略 通过分析实际业务场景需求重新审视现有任务分发模式是否存在不合理之处进而作出相应修正措施比如适当降低并发度水平等手段均有助于削减总体上的切换成本支出比例。 ```bash # 查看系统的上下文切换次数 vmstat 1 5 | awk 'NR>2 {print $9}' ``` 以上命令可以帮助监控一段时间内的平均每秒上下文切换次数,便于后续针对性地实施改进方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值