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

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

攥写人:李鹏举  学号:20132201

( *原创作品转载请注明出处*)

( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000)

一、实验要求:

  1. 理解Linux系统中进程调度的时机,可以在内核代码中搜索schedule()函数,看都是哪里调用了schedule(),判断我们课程内容中的总结是否准确;
  2. 使用gdb跟踪分析一个schedule()函数 ,验证您对Linux系统进程调度与进程切换过程的理解;推荐在实验楼Linux虚拟机环境下完成实验。
  3. 特别关注并仔细分析switch_to中的汇编代码,理解进程上下文的切换机制,以及与中断上下文切换的关系;

二、实验过程:

1、使用gdb跟踪分析schedule()函数,首先开启分布执行内核的指令。

输入指令:qemu –kernel linux-3.18.6/arch/x86/boot/bzImage –initrd rootfs.img –S –s :

2、然后打开另一个终端输入

gdb
(gdb)file linux-3.18.6/vmlinux
(gdb)target remote:1234
(gdb)b schedule
(gdb)c

进行调试跟踪schedule的执行过程 :

之后运行这些设置的断点:

三、实验知识点总结:

进程调度时,首先进入schedule()函数,将一个task_struct结构体的指针tsk赋值为当前进程然后调用sched_submit_work(tsk) 我们进入这个函数,查看一下做了什么工作 我们在执行到sched_submit_work时,输入si进入函数,可以看到这个函数时检测tsk->state是否为0 (runnable)若为运行态时则返回tsk_is_pi_blocked(tsk),检测tsk的死锁检测器是否为空,若非空的话就return。然后检测是否需要刷新plug队列,用来避免死锁sched_submit_work主要是来避免死锁然后我们进入__schedule()函数。

之后我直接打开了一下switch_to.h,和core.c观察switch_to的调用:

我们看到在context_switch中使用switch_to(prev,next,prev)来切换进程。
switch_to是一个宏定义,完成进程从prev到next的切换,首先保存flags,然后保存当前进程的ebp,然后把当前进程的esp保存到prev->thread.sp中,然后把标号1:的地址保存到prev->thread.ip中。然后把next->thread.ip压入堆栈。这里,如果之前B也被switch_to出去过,那么next->thread.ip里存的就是下面这个1f的标号,但如果next进程刚刚被创建,之前没有被switch_to出去过,那next->thread.ip里存的将是ret_ftom_fork__switch_canqry应该是现代操作系统防止栈溢出攻击的金丝雀技术。
jmp __switch_to使用regparm call, 参数不是压入堆栈,而是使用寄存器传值,来调用__switch_to
eax存放prev,edx存放next。这里为什么不用call __switch_to而用jmp,因为call会导致自动把下面这句话的地址(也就是1:)压栈,然后__switch_to()就必然只能ret到这里,而无法根据需要ret到ret_from_fork。当一个进程再次被调度时,会从1:开始执行,把ebp弹出,然后把flags弹出。

本次的实验让我们看到了Linux是如何进行进程调度,又是在何时进行进程调度切换的。我们研究了几个进程调度的函数,并且看到了系统是如何在死锁状况出现时进行处理与恢复的。进程的调度是操作系统运行的重中之重,只有系统调用才能保障操作系统快速的运行多个任务,让多个任务同时进行,这样才能让操作系统的运行有意义,满足用户同时打开多个程序,同时进行多种任务,不会长时间处于等待之中

时间: 2024-12-23 23:09:28

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

Linux内核设计第八周学习总结 理解进程调度时机跟踪分析进程调度与进程切换的过程

陈巧然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.视频内容 Linux系统的一般执行过程 最一般的情况:正在运行的用户态进程X切换到运行用户态进程Y的过程 1. 正在运行的用户态进程X 2. 发生中断——save cs:eip/esp/eflags(current) to kernel stack, then load cs:eip(entry of a specific IS

linux内核分析第八周-理解进程调度时机跟踪分析进程调度与进程切换的过程

实验原理: 一.调度时机 不同类型的进程有不同的调度需求 第一种分类: I/O-bound 频繁的进行I/O 通常会花费很多时间等待I/O操作的完成 CPU-bound 计算密集型 需要大量的CPU时间进行运算 第二种分类 批处理进程(batch process) 不必与用户交互,通常在后台运行 不必很快响应 典型的批处理程序:编译程序.科学计算 实时进程(real-time process) 有实时需求,不应被低优先级的进程阻塞 响应时间要短.要稳定 典型的实时进程:视频/音频.机械控制等 交

linux内核分析 第八周 理解进程调度时机跟踪分析进程调度与进程切换的过程

笔记: 实验:使用gdb跟踪分析一个schedule()函数

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

李俊锋 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验原理 1.操作系统的基本概念 任何计算机系统都包含一个基本的程序集合,称为操作系统. – 内核(进程管理,进程调度,进程间通讯机制,内存管理,中断异常处理,文件系统,I/O系统,网络部分) – 其他程序(例如函数库.shell程序.系统程序等等) 操作系统的目的 – 与硬件交互,管理所有的硬件资源 – 为用户程序(应

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

一.原理分析 1.调度时机 背景不同类型的进程有不同的调度需求第一种分类I/O-bond:频繁的进行I/O:通常会花费很多时间等待I/O操作的完成CPU-bound:计算密集型:需要大量的CPU时间进行运算 第二种分批处理进程(batch process):不必与用户交互,通常在后台运行:不必很快响应.典型的批处理程序:编译程序.科学计算实时进程(real-time process):有实时需求,不应被低优先级的进程阻塞:响应时间要短.要稳定.典型的实时进程:视频/音频.机械控制等交互式进程(i

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

李洋 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这一次实验是针对linux系统中进程调度时机得深入理解. Linux 调度器将进程分为三类: 1. 交互式进程 2. 批处理进程 3. 实时进程 根据进程的不同分类 Linux 采用不同的调度策略.对于实时进程,采用 FIFO 或者 Round Robin 的调度策略.对于普通进程,则需要区分交互式和批处理式的不同.传统 Linux 

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

20135125陈智威 +原创作品转载请注明出处 +<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验原理: 1.不同类型的进程有不同需求的调度需求:第一种分类:—I/O-bound:频繁的进行I/O,通常会花费很多时间等待I/O操作的完成—CPU-bound:计算密集型,需要大量的CPU时间进行运算第二种分类:—批处理进程:不必与用户交互,通常在后台运行:不必响应很快:—实时进程:有实时需求,不被低优先级的

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

1理解进程调度时机跟踪分析进程调度与进程切换的过程: schedule()调用发生在中断处理过程(包括时钟中断.I/O中断.系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule(): 内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度: 用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度

通过gdb跟踪进程调度分析进程切换的过程

作者:吴乐 山东师范大学 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本实验目的:通过gdb在linux下对一个简单的命令行命令实现进程的过程进行跟踪,分析一般用户进程实现进程切换的过程,并进一步剖析进程调度的工作的原理. 一.实验过程 1.打开实验环境,并设置context_switch和pick_next_switch两个断点. 2.来到第二个断点处list(分析在第三部分) 3.到第一个断点处,在这里