实验内容
现在的 Linux 0.11 采用 TSS(后面会有详细论述)和一条指令就能完成任务切换,虽然简单,但这指令的执行时间却很长,在实现任务切换时大概需要 200 多个时钟周期。
而通过堆栈实现任务切换可能要更快,而且采用堆栈的切换还可以使用指令流水的并行优化技术,同时又使得 CPU 的设计变得简单。所以无论是 Linux 还是 Windows,进程/线程的切换都没有使用 Intel 提供的这种 TSS 切换手段,而都是通过堆栈实现的。
本次实践项目就是将 Linux 0.11 中采用的 TSS 切换部分去掉,取而代之的是基于堆栈的切换程序。具体的说,就是将 Linux 0.11 中的 switch_to 实现去掉,写成一段基于堆栈切换的代码。
本次实验包括如下内容:
- 编写汇编程序
switch_to: - 完成主体框架;
- 在主体框架下依次完成 PCB 切换、内核栈切换、LDT 切换等;
- 修改
fork(),由于是基于内核栈的切换,所以进程需要创建出能完成内核栈切换的样子。 - 修改 PCB,即
task_struct结构,增加相应的内容域,同时处理由于修改了 task_struct 所造成的影响。 - 用修改后的 Linux 0.11 仍然可以启动、可以正常使用。
- (选做)分析实验 3 的日志体会修改前后系统运行的差别。
实验过程
添加process.c
修改main.c、printk.c、fork.c、sched.c、exit.c
修改后编译测试
cd path/oslab/linux-0.11
make all
./run
#进入bochs
gcc -o process process.c
sync
#关闭bochs后查看
./mount-hdc
vi hdc/usr/root/process.c
chmod +x process.c
python stat_log.py hdc/var/process.log 6 7 8 9 10 11 12 13 14 15 16
修改linux-0.11/include/linux/sched.h
#define INIT_TASK \
{ 0,15,15,
// 上述三个值分别对应 state、counter 和 priority;我们修改第三个值(默认值15)
修改为15

修改为5

修改为25

修改为50

结论: 时间片变小,进程因时间片到时产生的进程调度次数变多,该进程等待时间越长。 然而随着时间片增大,进程因中断或者睡眠进入的进程调度次数也增多,等待时间随之变长。 故而需要设置合理的时间片,既不能过大,也不能过小。
修改文件如下
作于2024年09月10日