20242828-《Linux内核原理与分析》第九周作业
Linux 系统中进程调度的时机
在 Linux 系统中,进程调度是由内核完成的,用于管理进程的执行顺序和资源分配。调度的时机是指内核决定从当前进程切换到另一个进程的时刻,主要包括以下几种场景:
-
时间片用尽
**触发机制:**定时器中断(clock interrupt)。
Linux 使用时间片轮转(time slicing)调度策略,每个进程被分配一定的 CPU 时间片。当时间片用尽时,内核触发调度器选择下一个合适的进程运行。
**典型场景:**抢占式多任务系统中,确保所有进程都能公平使用 CPU。 -
进程主动让出 CPU
**触发机制:**进程调用特定系统调用。
如果一个进程因某种原因需要等待(如 I/O 操作、信号或获取锁),它会主动进入睡眠(阻塞)状态。此时,内核会触发调度器选择其他进程运行。
常见系统调用:
sleep():进程主动休眠。
wait():等待子进程结束。
阻塞式 I/O 调用:如 read()、write()。 -
高优先级任务唤醒
**触发机制:**有更高优先级的进程从睡眠状态被唤醒。
如果某个优先级较高的进程从阻塞状态被唤醒,内核可能会立即中断当前的低优先级进程,切换到高优先级进程。
**典型场景:**实时任务、I/O 完成通知。 -
系统调用返回或中断处理结束
**触发机制:**进程从内核态返回用户态时。
每当进程完成系统调用或中断处理时,内核会检查是否需要进行进程切换。
典型场景:
某进程完成 I/O 操作。
中断处理完成时触发调度器。 -
新进程创建或进程终止
触发机制:
调用 fork() 或其他进程创建函数后。
某进程调用 exit() 终止后。
新进程创建后,调度器会决定是否切换到新进程执行。
如果当前运行的进程终止,调度器会选择其他进程运行。 -
总结
Linux 的进程调度是多任务操作系统的核心功能,其调度时机由内核态的各种事件驱动,主要包括时间片用尽、进程状态变化以及系统资源条件变化等。Linux 通常采用 CFS(完全公平调度器) 和特定场景下的实时调度策略来实现这些调度行为。
实验:使用 gdb 跟踪分析一个 schedule()函数
1、启动MenuOS系统
cd LinuxKernel
rm -rf menu # 无法克隆,可使用侧边栏上传代码将代码压缩包传入实验楼环境中
git clone https://github.com/mengning/menu.git
cd menu
mv test_exec.c test.c
make rootfs
2、配置gdb,远程调试并设置断点;
cd ..
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
gdb # 打开另一个终端,使用gdb调试
file linux-3.18.6/vmlinux
target remote:1234
b schedule
b context_switch
b switch_to
b pick_next_task