2022-2023-1 20222808《Linux内核原理与分析》第九周作业

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

一、实验要求:

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

二、实验过程:

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

cd ~/LinuxKernel
qemu –kernel linux-3.18.6/arch/x86/boot/bzImage –initrd rootfs.img –S –s :

在这里插入图片描述
2、另开一个终端,使用gdb调试,并在相应位置设置断点
在这里插入图片描述
3、开始运行,观察断点情况
在这里插入图片描述
4、查看switch_to中的汇编代码
在这里插入图片描述

三、实验总结

1、Linux 调度器将进程分为三类:
(1)交互式进程
此类进程有大量的人机交互,因此进程不断地处于睡眠状态,等待用户输入。典型的应用比如编辑器 vi。此类进程对系统响应时间要求比较高,否则用户会感觉系统反应迟缓。
(2)批处理进程
此类进程不需要人机交互,在后台运行,需要占用大量的系统资源。但是能够忍受响应延迟。比如编译器。
(3)实时进程
实时对调度延迟的要求最高,这些进程往往执行非常重要的操作,要求立即响应并执行。比如视频播放软件或飞机飞行控制系统,很明显这类程序不能容忍长时间的调度延迟,轻则影响电影放映效果,重则机毁人亡。
根据进程的不同分类 Linux 采用不同的调度策略。对于实时进程,采用 FIFO 或者 Round Robin 的调度策略。对于普通进程,则需要区分交互式和批处理式的不同。传统 Linux 调度器提高交互式应用的优先级,使得它们能更快地被调度。而 CFS 和 RSDL 等新的调度器的核心思想是“完全公平”。这个设计理念不仅大大简化了调度器的代码复杂度,还对各种调度需求的提供了更完美的支持。

2、调度的发生主要有两种方式:
(1)主动式调度(自愿调度)
在内核中主动直接调用进程调度函数schedule(),当进程需要等待资源而暂时停止运行时,会把状态置于挂起(睡眠),并主动请求调度,让出cpu。
(2)被动式调度 (抢占式调度、强制调度)
用户抢占(在中断返回等过程中,从内核空间回到用户空间的时候)
内核抢占(在内核进程中发生抢占)

3、schedule() --> context_switch() --> switch_to --> __switch_to()

4、jmp和call 的区别
call会把他的下一条指令的地址压入堆栈,然后跳转到他调用的开始处,同时ret会自动弹出返回地址。
JMP只是简单的跳转
call的本质相当于push+jmp ret的本质相当于pop+jmp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值