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

张建帮 原创作品转载请注明出处 《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上执行的进程,与中断时保存现场是不同的,中断前后是在同一个进程上下文中,只是由用户态转向内核态执行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章