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

本文通过分析x86汇编代码,探讨了不同中断频率和线程并发对程序执行的影响。在单线程和多线程环境下,观察寄存器%dx的值变化,揭示了程序执行路径和竞态条件。同时,研究了共享变量在并发环境下的行为,展示了线程间的交互和潜在问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.开始,我们来看一个简单的程序,“loop.s”。首先,阅读这个程序,看看你是否能理
解它:cat loop.s。然后,用这些参数运行它:
./x86.py -p loop.s -t 1 -i 100 -R dx
这指定了一个单线程,每 100 条指令产生一个中断,并且追踪寄存器%dx。你能弄清楚
%dx 在运行过程中的价值吗?你有答案之后,运行上面的代码并使用-c 标志来检查你的答
案。注意答案的左边显示了右侧指令运行后寄存器的值(或内存的值)。

答:查看loop.s的内容
在这里插入图片描述
top开始线程,接下来将寄存器dx的值减一,再用dx中的值和0作比较。如果大于等于则跳转到top. halt是结束这个线程。

运行题目中给的参数:
在这里插入图片描述
由于这里没有提前给出%dx的值,故默认为0,减一后为-1。到了判断语句(jgte),-1没有大于等于0,因此不会跳转,运行halt结束线程。

用-c查看答案:
在这里插入图片描述
*2.现在运行相同的代码,但使用这些标志:
./x86.py -p loop.s -t 2 -i 100 -a dx=3,dx=3 -R dx
这指定了两个线程,并将每个%dx 寄存器初始化为 3。%dx 会看到什么值?使用-c 标志
运行以查看答案。多个线程的存在是否会影响计算?这段代码有竞态条件吗? *

在这里插入图片描述
题目中说100条指令才会中断一次,dx的初始值为3,第一次执行变为了2,判断语句中2大于0,会跳转到top在减为1,再到0,最后到-1是结束线程0,转到线程1. 线程1和线程0中dx的变化一致,由3一步步变成-1后结束。运行完上述过程的所有指令总数没有达到100条,故不会发生中断。

在这里插入图片描述
下面用-c指令来查看答案:
在这里插入图片描述
*3.现在运行以下命令:
./x86.py -p loop.s -t 2 -i 3 -r -a dx=3,dx=3 -R dx
这使得中断间隔非常小且随机。使用不同的种子和-s 来查看不同的交替。中断频率是否
会改变这个程序的行为?
*

随机种子0:
在这里插入图片描述
随机种子1:
在这里插入图片描述
随机种子2:
在这里插入图片描述
随机种子3:
在这里插入图片描述
总结:当中断条件变得很短时(一个线程还没有运行完就中断了),中断时就会保存当前状态,等再次回到这个线程时恢复状态并接着工作。

*4.接下来我们将研究一个不同的程序(looping-race-nolock.s)。
该程序访问位于内存地址 2000 的共享变量。简单起见,我们称这个变量为 X。使用单
线程运行它,并确保你了解它的功能,如下所示:
./x86.py -p looping-race-nolock.s -t 1 -M 2000 *

首先先看一下looping-race-nolock.s的内容:
在这里插入图片描述
把地址2000中的值给%ax,%ax中的值加一,再把更新后的值给%ax。%bx的值减一,判断%bx和0,如果%bx大于0则跳转到top处,否则就运行halt结束线程。

运行题目中的指令:
在这里插入图片描述
在这里插入图片描述

用-c来查看答案验证结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值