理解进程调度时机跟踪分析进程调度与进程切换的过程

news/2024/12/31 3:26:41/文章来源:https://www.cnblogs.com/20202215zxp/p/18555413

张晓攀+原创作品转载请注明出处+《Linux内核分析》MOOC课程https://mooc.study.163.com/course/1000029000

实验八——理解进程调度时机跟踪分析进程调度与进程切换的过程

一、理解Linux系统中进程调度的时机

在 Linux 内核中,schedule() 函数是核心的进程调度机制。它的主要作用是实现进程切换,即选择下一个要运行的进程并将 CPU 控制权转移给它。以下是 schedule() 函数的主要功能和执行流程:

1. 基本功能

  • 选择下一个进程
    schedule() 根据调度策略(如完全公平调度器 CFS)从就绪队列中选出下一个要运行的进程。

  • 切换上下文
    如果选择的新进程与当前进程不同,schedule() 会调用 context_switch() 函数,保存当前进程的上下文(CPU 寄存器、程序计数器等)并恢复新进程的上下文。

2. 函数执行流程

  • 检查当前进程状态
    如果当前进程仍然可运行(TASK_RUNNING),它可能会重新被选中;否则,它会被放回等待队列。

  • 调用调度策略
    调度器(如 CFS)通过运行特定策略函数来确定下一个进程。CFS 通过一个红黑树数据结构管理就绪进程,选择“最小虚拟运行时间”的进程。

  • 执行上下文切换
    当下一个进程被选定后,schedule() 会调用 context_switch() 执行实际的进程切换,包括:

    • 保存当前进程的 CPU 上下文(栈指针、寄存器等)。
    • 加载新进程的上下文。
    • 切换到新进程的内核栈。

3. 调用时机

schedule() 通常在以下情况下被调用:

  • 当前进程的时间片用完
  • 进程进入阻塞状态(如等待 I/O)
  • 主动调用(如通过yield()sched_yield()
  • 中断处理或内核函数需要切换到更高优先级进程

4. 与调度策略的关系

schedule() 函数本身并不直接决定如何选取下一个进程,而是依赖于具体的调度策略模块(如 CFS、实时调度器)。这些策略定义了如何对进程进行排序和选择。

5. 关键性

schedule() 是整个内核调度的核心接口,对系统的多任务处理和资源分配起到至关重要的作用。它确保了各进程能够公平、高效地共享 CPU 资源。

二、使用 gdb 跟踪分析一个 schedule()函数

1.下载更新menu代码

2.重新制作文件系统并进入系统内核调试

3.设置断点进行调试

在内核函数schedule的入口处设置断点,接下来输入c继续执行,则系统即可停在该函数处,接下来我们就可以使用命令n或者s逐步跟踪,可以详细浏览pick_next_task,switch_to等函数的执行过程

schedule()函数和__schedule()函数:

context_switch():

switch_to宏定义:

三、实验总结

进程调度和进程切换是 Linux 内核中多任务管理的核心,它们共同实现了多个进程在 CPU 上的交替执行。以下是两者的简要说明和执行过程:


1. 进程调度(Process Scheduling)

定义
进程调度是从就绪队列中选择一个合适的进程来运行的过程。其目的是决定哪个进程可以使用 CPU。

调度流程

  1. 时间片用尽或阻塞:当前进程因时间片耗尽或等待资源而无法继续运行。
  2. 调用调度函数
    内核调用 schedule() 函数,选择下一个进程。
  3. 选择下一个进程
    根据调度策略(如 CFS)从就绪队列中挑选优先级最高或最符合策略的进程。

2. 进程切换(Context Switch)

定义
进程切换是将 CPU 从当前进程转移到另一个进程的过程,涉及保存和恢复进程的运行环境(上下文)。

切换流程

  1. 保存当前进程的上下文

    • 保存 CPU 寄存器、程序计数器(PC)、堆栈指针(SP)等信息到当前进程的 task_struct
    • 确保当前进程可以在下次调度时从中断点继续运行。
  2. 加载新进程的上下文

    • 恢复新进程的 CPU 寄存器、程序计数器和堆栈指针。
    • 将 CPU 控制权转移给新进程。
  3. 切换内核栈

    • 每个进程都有自己独立的内核栈。
    • 切换过程中,需要将内核栈从当前进程切换到新进程的内核栈。
  4. 返回用户态

    • 当进程从内核态返回用户态时,新进程就开始在 CPU 上运行。

两者的关系

  • 进程调度 是逻辑层面的选择:决定谁运行。
  • 进程切换 是物理层面的执行:切换 CPU 的执行上下文。

它们共同确保了系统能够在多任务环境下高效、平衡地分配 CPU 资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/836940.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

李继刚Lisp提示词灵感之源:压缩推动进步

探秘李继刚Lisp提示词压缩表达的灵感来源:德国计算机科学家尤尔根施密德胡伯提出,智能系统通过学习新技能来更高效地预测或压缩信息,这种内在动力推动了好奇心和创造力的发展,适用于从婴儿探索世界到科学家发现新规律的各种场景。前面在文章《 访谈李继刚:从哲学层面与大模…

java:找不到符号 符号:变量:log

原文链接:https://blog.csdn.net/zhanghaoninhao/article/details/129180810问题:java:找不到符号 符号:变量:log环境:springboot idea解决方法:在idea中,点击file-Settings,打开配置页面,如图红框位置,输入: -Djps.track.ap.dependencies=false

【SolidWorks 2024下载与安装教程】

‌SolidWorks 2024是一款由达索系统(Dassault Systemes)开发的三维CAD软件,广泛应用于机械设计、产品开发、工程设计、制造等领域。‌ 该软件以其强大的功能和易学易用的特点,深受工程师和设计师的喜爱。SolidWorks 2024在2024版本中引入了一系列新功能和改进,旨在提高设计效…

20222315 2024-2025-1 《网络与系统攻防技术》实验五实验报告

1、实验内容 1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息: DNS注册人及联系方式 该域名对应IP地址 IP地址注册人及联系方式 IP地址所在国家、城市和具体地理位置 PS:使用whois、dig、nslookup、traceroute、以及各类在线和离线工…

编程命名规范(网文)

一个好的变量或函数命名,应该能起到自解释的作用,甚至能减少我们代码的注释。 naming-cheatsheet是一个命名备忘录,记录一些常见的规范约定,并提供简单的例子说明。如果能够严格遵守这些规范,相信我们的代码可读性会大大提升,下面就来介绍 naming-cheatsheet 提供的一些建…

MyBatis 学习笔记

MyBatis 执行器 JDBC 的执行过程分为四步:获取数据库连接(Connection) 预编译 SQL(PrepareStatement) 设置参数 执行 SQL(ResultSet)MyBatis 提供了执行器 Executor 将这一过程进行封装,对外提供 SqlSession 让用户通过调用其 API 直接操作数据库,因为 SqlSession 持有…

机器学习:线性回归

章节安排背景介绍 均方根误差MSE 最小二乘法 梯度下降 编程实现背景生活中大多数系统的输入输出关系为线性函数,或者在一定范围内可以近似为线性函数。在一些情形下,直接推断输入与输出的关系是较为困难的。因此,我们会从大量的采样数据中推导系统的输入输出关系。典型的单输…

20222322 2024-2025-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 掌握使用Metasploit和nmap等工具进行前期渗透的方法,并利用四种特定的漏洞对靶机进行攻击。 (1)掌握Metasploit和nmap的用法 学习并熟悉Metasploit框架的基本操作,包括模块搜索(Search)、使用(Use)、展示选项(Show)、设置参数(Set)以及执行攻击(Exploi…

ETL之kettle 专业陪伴群,1元开启kettle精进之旅

1、为啥收取1元? 确保只有真正感兴趣或有意愿的用户才会加入。减少无关人员的加入,保持群组的专业性和活跃度。 付费入群可以减少垃圾信息的发送,因为发垃圾信息的人不太可能愿意为发送广告付费。 2、送人玫瑰手留余香自从公众号连载了90+篇关于kettle的干活文章,不到半年时…

SpringBoot:SpringBoot集成E-mail邮件发送功能

前言今天做项目时有个需求是:用公司邮箱给客户发送邮件通知,然后上网冲浪找到一些不错的文章,通过优化并实现功能后,写这篇文章记录一下,也提供给大家做参考。 前期准备 在编写代码前,我们需要获取到一些信息用于后续邮件发送功能,需要获取的信息为:协议服务器地址、邮…

控制之美1-第七章 PID控制

目录7.1 引子7.2 比例控制 7.1 引子 \[7000 \frac{dx(t)}{dt}+10ax(t)=u(t)+d(t) \]\(u(t)\) 是体重变化, \(u(t)=E_i-E_a\), \(E_i\) 是热 量摄入 ,\(E_a\) 是运动消耗, \(x(t)\) 系统输出,体重 \(a\)是劳动强度系数 \(d(t)=-aC\) 是扰动量 进行拉普拉斯变换 \[7000(sX(s)-…