进程调度的过程

操作系统中的进程管理与调度
进程是操作系统中资源分配的基本单位,由PCB(进程控制块)进行描述和组织。PCB包含进程身份、内存指针和文件描述符表等信息。当进程数量超过CPU核心数时,操作系统通过调度算法公平分配执行机会。调度考虑因素包括优先级、状态、记账信息和上下文。此外,虚拟地址空间解决了进程内存访问的安全问题。

进程(process)/任务(task):

一个程序运行起来,完成一系列任务的模样。

一个可执行文件是“静态”的,当我们双击运行的时候,操作系统就会把这个可执行文件的关键信息加载到内存中,并且开始运行里面的代码,就形成了一个进程。同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。

在一个操作系统上,同时跑着这么多的进程,就需要进行管理:管理分为两步,先描述,使用一个类或者结构体,把这个东西有啥特征,都表示出来;再组织,使用一个数据结构,把很多个这样的对象或者结构体给整理到一起。

管理的方式就是使用PCB进程控制块:

PCB(进程控制块)就是一个结构体,这个结构体里包含了一些表示进程的核心信息。

操作系统内核中,就把若干PCB串成了一个双向链表。

PCB中包含的信息:

1.进程的身份识别pid

2.内存指针——操作系统要把一些必要的数据加载到内存中,有些是要运行的指令(代码),有些是运行时依赖的数据(全局变量),内存指针就描述了该进程的内存中哪些部分是指令,哪些部分是数据。

3.文件描述符表——表示了当前进程都打开了哪些文件,在代码中打开一个文件fopen,就会在进程的文件描述符表(顺序表)里给这个文件分配一个表项,每个元素就代表一个打开的文件,对应的数组下标就是文件描述符。

总结:以上三点描述了进程持有哪些系统资源,也认为进程是操作系统中“资源分配”的基本单位。

进程的调度:

为什么会存在进程的调度问题?

当前的计算机,CPU是有限的,但是进程数量是比较多的,经常会出现“进程多,核心数少”的情况,操作系统是要做到尽可能的公平,让每一个进程都有运行的机会,所以就需要进行调度。

调度的方法:

 

用来实现进程的几个的关键的属性:

1.进程的优先级

2.进程的状态

3.进程的记账信息

4.进程的上下文

进程的虚拟地址空间:

为什么会存在进程的虚拟地址空间?

 对于每一个进程使用内存时,可能会存在指针解引用出错,导致指针指向非法的内存地址

 

 

 

 

 

<think> 我们正在讨论进程调度的具体过程。根据用户的问题“我想了解进程调度的具体过程”,结合之前提供的详细回答以及引用的内容,我们需要系统地解释进程调度的具体步骤和相关机制。 首先,回顾之前回答的“进程调度的原理、过程及相关机制”中第四部分调度过程详解”已经给出了一个概要。现在需要更详细地展开。 根据引用[4]和[5],进程调度涉及进程状态转换和进程控制块(PCB)的管理。同时引用[3]提到了进程调度的触发原因和状态转换。 具体过程应包括: 1. 触发调度的时机(即什么情况下会发生调度) 2. 调度程序的工作:选择下一个要运行的进程 3. 上下文切换的具体步骤 另外,根据引用[2],Linux中进程调度依赖于task_struct结构体,其中包含了调度所需的信息(如优先级、运行时间等)。 因此,我们可以将进程调度的具体过程分为三个主要阶段:触发阶段、选择阶段和切换阶段。 下面按照这个结构进行详细说明: </think> ### 进程调度的具体过程 #### 一、调度触发阶段 当发生以下事件时,操作系统会触发进程调度: 1. **主动放弃CPU**: - 进程执行阻塞操作(如 I/O 请求) - 调用 `sleep()` 或 `exit()` 等系统调用 - 进程执行 `yield()` 主动让出CPU[^3] 2. **被动抢占**: - **时间片耗尽**:时钟中断触发(Linux 默认 10ms) - **高优先级就绪**:实时进程进入就绪队列 - **中断唤醒**:硬件中断使阻塞进程变为就绪态[^4] ```mermaid graph TB A[时钟中断] --> B{时间片耗尽?} C[系统调用] --> D{阻塞操作?} E[硬件中断] --> F{唤醒高优先级进程?} B -->|是| G[触发调度] D -->|是| G F -->|是| G ``` #### 二、调度决策阶段 调度器从**就绪队列**中选择进程,核心步骤: 1. **更新进程状态**: - 将当前进程移出运行队列 - 更新其`vruntime`(CFS算法)或剩余时间片[^1] 2. **选择新进程**: - **CFS调度器**:从红黑树取`vruntime`最小的进程 - **实时调度**:选择优先级最高的实时进程(SCHED_FIFO/RR) - 计算优先级公式: $$P_{\text{effective}} = P_{\text{static}} - \text{nice} + \text{bonus}$$ 其中静态优先级$P_{\text{static}}$范围 100-139(Linux)[^2] #### 三、上下文切换阶段 完成进程执行环境的切换: 1. **保存当前上下文**: - 寄存器状态 → PCB (task_struct) - 浮点运算状态 → fpu_state - 程序计数器 (PC) 和栈指针 (SP)[^5] 2. **加载新进程上下文**: - 从新进程的PCB恢复寄存器状态 - 加载页表基址寄存器 (CR3) - 切换内核栈和线程局部存储 3. **切换开销**: - 寄存器切换:0.1-1μs - TLB刷新:1-10μs(取决于架构) - 缓存污染:可能导致10-100μs性能下降 #### 四、恢复执行阶段 1. 新进程从上次中断点继续执行 2. 更新调度统计信息: - 运行时长 - 上下文切换次数 - 优先级历史记录 #### 关键数据结构(Linux示例) ```c // task_struct 关键字段 struct task_struct { long state; // 进程状态(TASK_RUNNING等) int prio; // 动态优先级 struct mm_struct *mm; // 内存管理信息 struct thread_struct thread; // CPU寄存器状态 struct list_head run_list; // 就绪队列指针 }; ``` --- ### 引用来源 [^1]: 进程调度触发机制与状态转换 [^2]: Linux 优先级计算模型 [^3]: 主动放弃CPU的场景分析 [^4]: 中断唤醒与抢占机制 [^5]: 进程上下文数据结构详解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值