【操作系统导论】第26章课后习题解答

目录

  • 前言
  • 26.1
    • 题目描述
    • 分析及解答
  • 26.2
    • 题目描述
    • 分析及解答
  • 26.3
    • 题目描述
    • 分析及解答
  • 26.4
    • 题目描述
    • 分析及解答

前言

内容仅作记录,解答有参考别人的地方,请谨慎参考

26.1

题目描述

【操作系统导论】第26章课后习题解答_第1张图片

分析及解答

使用cat loop.s查看程序代码:
【操作系统导论】第26章课后习题解答_第2张图片

这段代码首先将寄存器%dx中的值减1,test指令表示将寄存器%dx中的值与0做与运算,jgte表示“大于等于”则跳转。这里的halt指令表示停止这个线程。
【操作系统导论】第26章课后习题解答_第3张图片

输入指令:./x86.py -p loop.s -t 1 -i 100 -R dx运行程序
【操作系统导论】第26章课后习题解答_第4张图片

该进程只有一个线程,由于未设置寄存器%dx值初始值,这里默认为0,所以dx的值最开始为0,减1之后变为-1,程序停止。

输入指令:./x86.py -p loop.s -t 1 -i 100 -R dx -c运行程序查看结果
【操作系统导论】第26章课后习题解答_第5张图片

可以看到寄存器%dx一开始的值为0,后来变为了-1,线程停止。

26.2

题目描述

【操作系统导论】第26章课后习题解答_第6张图片

分析及解答

由于这里设置操作系统每100条指令进行一次中断,程序dx初始值设置为3,将会在dx减到-1时跳出循环,这个过程将会在操作系统未中断之前完成,即两个线程之间不影响计算,不存在竞争条件,之后再执行另一个线程。
【操作系统导论】第26章课后习题解答_第7张图片

输入指令:./x86.py -p loop.s -t 2 -i 100 -R dx -a dx=3,dx=3 -c运行程序查看结果:
【操作系统导论】第26章课后习题解答_第8张图片

可以看到运行结果与分析一致。由于程序在操作系统中断之前完成,所以多个线程的存在没有影响计算,代码没有竞争条件。

26.3

题目描述

【操作系统导论】第26章课后习题解答_第9张图片

分析及解答

输入指令:./x86.py -p loop.s -t 2 -i 3 -R dx -a dx=3,dx=3 -r -c -s 1查看种子为1时的结果
【操作系统导论】第26章课后习题解答_第10张图片
输入指令:./x86.py -p loop.s -t 2 -i 3 -R dx -a dx=3,dx=3 -r -c -s 2查看种子为2时的结果
【操作系统导论】第26章课后习题解答_第11张图片
输入指令:./x86.py -p loop.s -t 2 -i 3 -R dx -a dx=3,dx=3 -r -c -s 3查看种子为3时的结果
【操作系统导论】第26章课后习题解答_第12张图片

从三个不同种子下的程序运行结果可以看出,当操作系统的中断频率变得小(这里指发生中断之前不足以使一个线程运行完)且频繁,将会改变这个程序的行为,在发生中断的时候,操作系统将会保存当前正在执行的线程A的状态,同时恢复线程B的状态转而去执行线程B,在线程B未执行完之前发生中断同理。

26.4

题目描述

【操作系统导论】第26章课后习题解答_第13张图片

分析及解答

输入指令:cat looping-race-nolock.s查看程序代码:
【操作系统导论】第26章课后习题解答_第14张图片

由代码可以知道程序的功能:
·将内存地址2000中的值赋给寄存器%ax
·将寄存器%ax中的值加1
·将寄存器%ax中的值重新写回内存地址2000中
·根据寄存%bx中的值执行以上循环(这里未设置,默认bx为0,执行一次)
由此得到程序单线程运行情况,及内存地址2000中值的变化情况:
【操作系统导论】第26章课后习题解答_第15张图片

输入指令:./x86.py -p looping-race-nolock.s -t 1 -M 2000 -c查看程序运行结果:
【操作系统导论】第26章课后习题解答_第16张图片

可以看到程序运行结果与分析一致。

你可能感兴趣的:(操作系统,linux,经验分享,ubuntu)