前言
内容仅作记录,解答有参考别人的地方,请谨慎参考
26.1
题目描述
分析及解答
使用cat loop.s查看程序代码:
这段代码首先将寄存器%dx中的值减1,test指令表示将寄存器%dx中的值与0做与运算,jgte表示“大于等于”则跳转。这里的halt指令表示停止这个线程。
输入指令:./x86.py -p loop.s -t 1 -i 100 -R dx运行程序
该进程只有一个线程,由于未设置寄存器%dx值初始值,这里默认为0,所以dx的值最开始为0,减1之后变为-1,程序停止。
输入指令:./x86.py -p loop.s -t 1 -i 100 -R dx -c运行程序查看结果
可以看到寄存器%dx一开始的值为0,后来变为了-1,线程停止。
26.2
题目描述
分析及解答
由于这里设置操作系统每100条指令进行一次中断,程序dx初始值设置为3,将会在dx减到-1时跳出循环,这个过程将会在操作系统未中断之前完成,即两个线程之间不影响计算,不存在竞争条件,之后再执行另一个线程。
输入指令:./x86.py -p loop.s -t 2 -i 100 -R dx -a dx=3,dx=3 -c运行程序查看结果:
可以看到运行结果与分析一致。由于程序在操作系统中断之前完成,所以多个线程的存在没有影响计算,代码没有竞争条件。
26.3
题目描述
分析及解答
输入指令:./x86.py -p loop.s -t 2 -i 3 -R dx -a dx=3,dx=3 -r -c -s 1查看种子为1时的结果
输入指令:./x86.py -p loop.s -t 2 -i 3 -R dx -a dx=3,dx=3 -r -c -s 2查看种子为2时的结果
输入指令:./x86.py -p loop.s -t 2 -i 3 -R dx -a dx=3,dx=3 -r -c -s 3查看种子为3时的结果
从三个不同种子下的程序运行结果可以看出,当操作系统的中断频率变得小(这里指发生中断之前不足以使一个线程运行完)且频繁,将会改变这个程序的行为,在发生中断的时候,操作系统将会保存当前正在执行的线程A的状态,同时恢复线程B的状态转而去执行线程B,在线程B未执行完之前发生中断同理。
26.4
题目描述
分析及解答
输入指令:cat looping-race-nolock.s查看程序代码:
由代码可以知道程序的功能:
·将内存地址2000中的值赋给寄存器%ax
·将寄存器%ax中的值加1
·将寄存器%ax中的值重新写回内存地址2000中
·根据寄存%bx中的值执行以上循环(这里未设置,默认bx为0,执行一次)
由此得到程序单线程运行情况,及内存地址2000中值的变化情况:
输入指令:./x86.py -p looping-race-nolock.s -t 1 -M 2000 -c查看程序运行结果:
可以看到程序运行结果与分析一致。