课后作业3.3.2:进程的调度

第1关:版本 0 内核中的进程调度分析

任务描述

当程序 01.c 运行时(在版本 0 内核中),会在父子两个进程(假设分别为 6 号和 7 号进程)中分别输出字符串01

请问:从 6 号进程刚创建完 7 号进程开始,在接下来的 9 次进程调度中,每次调度时,6 号和 7 号进程的剩余时间片是多少?选中的新进程是几号?

实验准备

本关卡使用版本 0 内核进行分析,01.c 存放在/data/workspace/myshixun/exp5中。

代码及答案

1.首先将该文件放入目录linux-0.11-lab/b/

打开一个终端,输入cp

打开workspace文件,从myshixun到exp5目录下,拖动01.c文件到终端,就会自动生成对应路径

然后在路径后面空一格,输入如下,将01.c拷贝到/b文件夹下

上述过程也可以用代码实现

cp /data/workspace/myshixun/exp5/01.c ~/os/linux-0.11-lab/b/

切换到linux-0.11-lab目录下启动虚拟机

cd os/linux-0.11-lab
./run

在bochs中输入以下内容,用mcopy命令将该文件拷入虚拟机硬盘,用ls命令检查

注意mcopy那行最后有个点,说明拷贝到当前文件位置

然后就是它给的教程上没给到的,在这一步要添加一个编译命令

回车后就完成了

然后关闭虚拟机窗口,开启gdb调试

先将 main 函数处的断点关闭,然后在函数 do_execve 处设断点

和教程上有所不同,我这里显示没有这个1断点(不管它)

上图表明可执行文件/bin/sh开始执行了,参数 filename 是要执行文件的名字。

为了准确起见,最好以如下方式自动显示可执行文件名(commands内的内容,笔者出于偷懒防止出错的心,没写commands 2的内容,即commands到end的代码,不写执行也可以成功)

然后连续摁3个c

摁到最后一个c的时候回到bochs页面,虚拟机等待输入( gdb 不响应)

这个时候不要跟着教程做ls追踪,直接输入./01即可

回到gdb是如下页面

继续输入

按照下图继续输入。

(提示:commands的printf内容最好不要输错,输入完成后检查几遍,如果一不小心输错了,在后续报错之后,重新开启commands再输入一遍即可,并且要注意下图输入一遍之后已经摁了一个c。如果不能通过重新输入commands来修改的话笔者采取重新实验的方法)

然后连续输入9个c

2.填写txt,写完保存(注意最后一行不是gdb输入最后一个c显示的那行,而是上一调度的时间片)

评测就可以看到通关了

  • 20
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值