<操作系统导论>第二十八章

1.首先用标志-p flag.s 运行 x86.py。该代码通过一个内存标志“实现”锁。你能理解 汇编代码试图做什么吗?
在这里插入图片描述
查看flag.s的内容:

在这里插入图片描述
可以知道这是类似书上28.1中的锁
在这里插入图片描述
2.使用默认值运行时,flag.s 是否按预期工作?
它会产生正确的结果吗?使用-M 和-R 标志跟踪变量和寄存器(并打开-c 查看它们的
值)。你能预测代码运行时标志最终会变成什么值吗?

在这里插入图片描述

在这里插入图片描述
flag的变化与预期是一致的

3.使用-a 标志更改寄存器%bx 的值(例如,如果只运行两个线程,就用-a bx = 2,bx = 2)。代码是做什么的?对这段代码问上面的问题,答案如何?

由于bx的值变成了2,由之前的汇编代码分析可以知道每个线程都可以执行两次,ax总共可以得到4次加一的操作,所以最终答案是4.

用-c来查看答案:

在这里插入图片描述
在这里插入图片描述
与预期结果一致!

4.对每个线程将 bx 设置为高值,然后使用-i 标志生成不同的中断频率。什么值导致产 生不好的结果?什么值导致产生良好的结果?

bx为高值说明要进行的循环次数很多,这是如果中断的频率很高,就很容易出问题,所以我认为i的值越小(中断频率越高)会导致产生不好的结果;i的值越大(中断频率越低)会导致产生好的结果。

下面运行程序来验证猜想(以中断频率为4举例):
./x86.py -p flag.s -R ax,bx -M flag,count -a bx=4,bx=4 -i 4 -c

在这里插入图片描述
运行结果太长,这里以一部分举例:

在这里插入图片描述
这里可以看到最初先运行线程0,flag设置成了1,由于中断跳到了线程1,由于flag为1,未开锁,线程1在执行while(1),占用了cpu却没做有用的事,会产生不好的结果。
第二次执行线程0时,最终flag设置成了0,开了锁,中断到线程1,线程1也能正常执行,cpu得到了充分利用,是一种很好的结果。

运行结果与猜想一致!

5.现在让我们看看程序 test-and-set.s。首先,尝试理解使用 xchg 指令构建简单锁原语 的代码。获取锁怎么写?释放锁如何写?

在这里插入图片描述
在这里插入图片描述
6.现在运行代码,再次更改中断间隔(-i)的值,并确保循环多次。代码是否总能按 预期工作?有时会导致 CPU 使用率不高吗?如何量化呢?

还是以中断为4来验证答案:

./x86.py -p test-and-set.s -i 7 -R ax,bx -M mutex,count -a bx=5 -c

在这里插入图片描述
这里可以看到代码能够按预期正常工作,但是题4中的问题依然存在,不合时宜的中断会占用cpu却不做实事。

7.使用-P 标志生成锁相关代码的特定测试。例如,执行一个测试计划,在第一个线程 中获取锁,但随后尝试在第二个线程中获取锁。正确的事情发生了吗?你还应该测试什么?

输入命令验证:
./x86.py -p test-and-set.s -i 10 -R ax,bx -M mutex,count -a bx=5 -P 1100111000111000111000 -c

在这里插入图片描述
正确的事发生了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值