首页 > 系统相关 >理解进程调度时机跟踪分析进程调度与进程切换的过程

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

时间:2025-01-02 11:34:21浏览次数:6  
标签:调用 schedule 调度 内核 进程 切换

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

实验过程

任务一

  • 理解 Linux 系统中进程调度的时机,可以在内核代码中搜索 schedule()函数,看都是哪里调用了 schedule();

使用 grep 命令: 在内核源码的根目录运行以下命令:

grep -rnw "schedule()"

schedule

分析调用时机:

schedule() 常在以下场景中被调用:

进程需要主动放弃 CPU:

进程进入等待状态(如阻塞在某个资源上)。
通常通过调用 schedule() 主动放弃 CPU 使用权。
例如:在等待锁或信号量时。

系统中断或上下文切换:

在硬件中断或软件中断处理完成后,需要切换到其他进程。
典型场景:时钟中断触发调度。

内核等待事件:

内核中的某些子系统等待某个条件(如 I/O 操作完成),会调用 schedule()。
通常伴随 wait_event() 或 wait_queue()。

预定义的调度点:

某些代码路径明确指定需要触发调度,例如 mutex_lock()、cond_resched()。

关键调用点的说明

以下是一些常见的 schedule() 调用点及其意义:

  • 锁等待:mutex_lock() 或 spin_lock(): 如果资源已被锁定,当前进程需要调用 schedule() 进入等待队列,直到资源可用。
  • 阻塞等待:wait_event(): 如果某个条件未满足,调用 schedule() 挂起当前进程,直到条件满足。
  • 内核抢占:cond_resched(): 用于主动触发调度,确保长时间运行的任务不会占用 CPU 太久。
  • 睡眠:msleep() 或 schedule_timeout(): 当前进程主动进入睡眠状态。

分析源码

例如,在 kernel/sched/core.c 中找到 schedule() 函数的实现:

asmlinkage __visible void __sched schedule(void)
{
    struct task_struct *tsk = current;

    sched_submit_work(tsk);
    ...
    pick_next_task();
    ...
}
//该函数的主要作用是将当前任务标记为非运行状态,并选择下一个可运行任务。

任务二

  • 使用 gdb 跟踪分析一个 schedule()函数 ,验证您对 Linux 系统进程调度与进程切换过程的理解;
qemu-system-x86_64 -kernel ./linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -append "console=ttyS0" -s -S

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

context_switch():
alt text

switch_to宏定义:
alt text

调度的发生主要有两种方式:

1:主动式调度(自愿调度)

在内核中主动直接调用进程调度函数schedule(),当进程需要等待资源而暂时停止运行时,会把状态置于挂起(睡眠),并主动请求调度,让出cpu。

2:被动式调度(抢占式调度、强制调度)

用户抢占和内核抢占

(1)用户抢占发生在:从系统调用返回用户空间和从中断处理程序返回用户空间。

(2)内核抢占:在不支持内核抢占的系统中,进程/线程一旦运行于内核空间,就可以一直执行,直到它主动放弃或时间片耗尽为止。这样一些非常紧急的进程或线程将长时间得不到运行。

进程的切换:

(1)为了控制进程的执行,内核必须有能力挂起正在CPU上执行的进程,并恢复以前挂起的某个进程的执行,这叫做进程切换、任务切换、上下文切换;

(2)挂起正在CPU上执行的进程,与中断时保存现场是不同的,中断前后是在同一个进程上下文中,只是用用户态转向内核态执行;

(3)进程上下文包含了进程执行需要的所有信息

用户地址空间:包括程序代码,数据,用户堆栈等

控制信息:进程描述符,内核堆栈等

硬件上下文(注意中断也要保存硬件上下文知识保存的方法不同)

(4)schedule()函数选择一个新的进程来运行,并调用context_switch进行上下文的切换,这个宏调用switch_to来进行关键上下文切换

next = pick_next_task(rq, prev);

context_switch(rq, prev, next);

switch_to利用了prev和next两个参数:prev指向当前进程,next指向被调度的进程

标签:调用,schedule,调度,内核,进程,切换
From: https://www.cnblogs.com/Arisf/p/18647249

相关文章

  • 基于甘特图的任务调度与跟踪工具
    在当今复杂的项目管理领域,工具的种类繁多且功能各异。常见的项目管理工具包括禅道、Trello、Jira、MicrosoftProject等。这些工具在不同层面上助力项目管理,从任务分配到进度跟踪,从团队协作到资源管理。甘特图作为一种直观且有效的任务调度与跟踪工具,在众多项目管理工具中脱颖而......
  • ubuntu查看当前哪些进程在使用网络流量(好用的方法)
    一、ubuntu要查看当前哪些进程在使用网络流量使用nethogs工具:nethogs是一个用于显示各个进程使用的网络带宽的命令行工具。你可以通过以下命令安装并运行nethogs:sudoapt-getinstallnethogs#安装nethogs(对于基于Debian的系统)sudonethogs运行结果如下:会列出......
  • 737. 大学生HTML5期末大作业 ―【 Bootstrap4横向全屏切换的个人博客响应式网页(1页)
    目录一、网页概述二、网页文件三、网页效果四、代码展示1.html2.CSS3.JS五、总结1.简洁实用2.使用方便3.整体性好4.形象突出5.交互式强六、更多推荐欢迎光临仙女的网页世界!这里有各行各业的Web前端网页制作的案例,样式齐全新颖,并持续更新!感谢CSDN,提供了这么......
  • 系统管理体系之进程管理
    系统管理体系之进程管理1.进程名字含义程序安装包,程序代码,app,存放在磁盘上面.进程⭐️运行起来的程序,命令,服务(远程连接服务,网络服务)都可以称作进程。运行在内存中。守护进程守护进程,一直运行的进程.也可以叫做服务.2.进程分类(异常进程)2.1......
  • Java难绷知识05--Swing中的事件调度线程和资源释放
    Swing中的事件调度线程先了解一下Swing中的单线程模型单线程模型有什么作用虽然大伙认为Swing又丑又落后(但是我编写gui入门真的是从Swing开始)Swing最初设计是单线程模型,这意味着所有与Swing组件交互的代码都应该在同一个线程中执行。单线程模型避免了Swing组件可能因为......
  • 基于双层共识控制的直流微电网优化调度(Matlab代码实现)
     ......
  • 西门子SCL实现数码循环切换
    应用的软件是西门子的博图V18,功能实现是按下启动按钮每隔两秒切换一次数字,从0~9一直循环,按下停止按钮停止循序。比起梯形图,SCL更像是单片机的编程思路,需要哪一个口亮就直接至高或是至低。用Q0.0~Q0.6分别表示字段a、b、c、d、e、f、g。代码实现"启动保持信号":=("启动按钮"......
  • 小程序实现根据环境(正式版、开发版等)自动切换baseUrl
    前言在小程序发布和提审的过程中,经常需要手动切换baseUrl到prod(正式版)环境。这种方式不仅繁琐,还容易出错。因此,设计一种能够根据不同环境自动切换baseUrl的方案,不仅可以简化提审流程,还能有效避免人为失误。本文将详细讲解如何实现小程序在启动时自动判断环境并切换......
  • 切换标签或页面后,setInterval还会执行吗?为什么?
    在前端开发中,当你使用setInterval设置一个定时任务,并且随后切换标签或页面,这个定时任务的行为会受到浏览器的影响,但通常它仍然会继续执行。下面是具体的原因和解释:浏览器的工作原理:浏览器是多任务的,它同时处理多个标签页和内部进程。即使你当前不在查看某个特定的标签页,浏览器......
  • 浏览器渲染进程的线程有哪些?
    浏览器渲染进程的线程主要包括以下几种:GUI渲染线程:负责渲染浏览器页面,解析HTML、CSS,构建DOM树、CSSOM树、渲染树以及绘制页面。当界面需要重绘或由于某种操作引发回流时,该线程会执行。注意,GUI渲染线程和JS引擎线程是互斥的,以防止渲染出现不可预期的结果。JS引擎线程:......