进程调度时机与进程切换分析

张建帮 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

1 实验目的

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

2 实验过程

  1. 使用gdb跟踪分析一个schedule()函数 ,使用网站 实验楼 进行试验

  2. 打开shell,进入 /home/shiyanlou/LinuxKernel/menu 目录

  3. 由于实验楼的虚拟机不能联网,也就不能使用 git clone 命令进行复制,于是打开孟宁老师的 github主页 ,将其中的 test_exec.c 的内容覆盖 menu 目录下的 test.c,将 Makefile 的内容覆盖 menu 目录下的 Makefile,同时新建 hello.c 文件,将其内容也复制过来

  4. 使用 make rootfs 命令查看当前系统,如下所示:
    这里写图片描述
    可以看到和上次实验的版本相同

  5. 添加 -s -S 选项进行调试,在menu目录下,输入下面命令:
    qemu -kernel ../linux-3.18.6/arch/x86/boot/bzImage -initrd ../rootfs.img -s -S

  6. 新建一个 shell 窗口进行 gdb 调试。在 gdb 调试窗口中先输入 b sys_execve,准备对 exec 命令进程调试,然后输入 c 以便让程序继续运行,最后在出现的界面中输入 exec 命令,gdb窗口也暂停在 sys_execve 处

  7. 在 gdb 窗口中输入下面命令:

b schedule
b context_switch
b pick_next_task 

输入 b switch_to 命令时,提示 switch_to 函数未定义,因为 switch_to 仅仅只是一个宏而已,因此出现上述提示。
8. 接下来 输入 c 继续执行,gdb 在断点 __schedule 函数处停了下来,接下来连续输入 c 都是在此处停了下来,说明我们的程序还没有得到调度。
9. 在输入不知道多少次 c 后,我终于决定放弃等到它得到调度的那一刻,直接调用 delete 删除所有断点后,再输入 c ,终于看到了结果:

这里写图片描述

这也进一步说明了在cpu的内部,调度是频繁发生着的

3 实验总结:

通过实验可知schedule()函数用来选择一个新的进程来运行,并调用context_switch宏进行上下文的切换,这个宏调 用switch_to来进行关键上下文切换,其中pick_next_task()函数封装了进程调度算法。

而进程调度时机有三种情况:

1、中断处理过程(包括时钟中断、I/O中断、系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule();

2、内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度,若是主动调度,则没有中断上下文的切换;

3、用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。

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

通过优先权法和轮转算法的模拟加深对进程概念和进程调度过程的理解,掌握进程状态之间的切换,同时掌握进程调度算法的实现方法和技巧。 要求: 1.用C语言或C++语言来实现对n个进程采用优先权优先算法以及轮转算法的进程调度。 2.每个用来标识进程进程控制块PCB用结构来描述,包括以下字段: (1)进程优先数ID,其中0为闲逛进程,用户进程的标识数为1,2,3…。 (2)进程优先级Priority,闲逛进程(idle)的优先级为0,用户进程的优先级大于0,且随机产生,优先数越大,优先级越高。 (3)进程占用的CPU时间CPUtime,进程每运行一次,累计值等于4。 (4)进程总共需要运行时间Alltime,利用随机函数产生。 (5)进程状态,0:就绪态;1:运行态;2:阻塞态。 (6)队列指针next,用来将多个进程控制块PCB链接为队列。 3.优先数改变的原则 (1)进程在就绪队列中每呆一个时间片,优先数增加1。 (2)进程每运行一个时间片,优先数减3。 4.在调度前,系统中拥有的进程数PCB_number由键盘输入,经初始化后,所有的进程控制块PCB链接成就绪队列。其中它们的初始化状态如下: This is an example for priority processing : Input the number of the PCB to be started :1 PCB: ID priority CPUtime ALLtime State 5 86 4 64 ready 1 32 20 68 ready 6 59 0 47 ready 2 18 20 62 ready 4 86 4 6 ready 7 72 4 51 ready 8 76 0 60 ready 9 4 4 19 ready 13 94 12 19 ready 16 88 12 24 ready 5.为了清楚地观察诸进程调度过程,程序应将每个时间片内的进程的情况显示出来,参照输出格式如下所示: This is an example for priority processing : Input the number of the PCB to be started : PCB: ID priority CPUtime ALLtime State 1 42 0 68 ready 建立: Creating -> ready 1 41 4 68 running 变迁1:ready -> running 1 41 0 68 blocked 变迁2:running -> blocked 1 41 0 68 ready 变迁4:running -> ready The idle prcess is running! 变迁1:ready -> running The idle prcess is completed! 销毁: running -> Destroy The idle prcess is running! 变迁1:ready -> running The idle prcess is completed! 销毁: running -> Destroy The idle prcess is running! 变迁1:ready -> running
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值