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来查看答案验证结果: