本题问题(1)考察S...
解答:
本题问题(1)考察Swap指令的应用,问题(2)考察Swap指令用硬件逻辑实现的原因。
假设线程T0和T1均要访问临界区,伪代码如下:
bool lock = FALSE; // 共享变量
...
void T0() {
bool key = TRUE;
if (key == TRUE)
swap key, lock; // 交换key和lock的值
临界区;
lock = TRUE;
...
}
void T1() {
bool key = TRUE;
if (key == TRUE)
swap key, lock; // 交换key和lock的值
临界区;
lock = TRUE;
...
}
(1) 按照上述伪代码执行,发现线程T1和T2均能够进入临界区,无法实现互斥访问临界区。
执行“swap key, lock;”后,key为FALSE,lock为TRUE,lock为TRUE满足进入临界区前上锁条件,key为FALSE可以进入临界区,所以key为TRUE应该起到拦截效果,同时为了进入临界区,需要进行轮询。所以第一处修改如下:
①进入区中的语句“if (key == TRUE) swap key, lock;”存在错误,修改为“while (key == TRUE) swap key, lock;”。
此外,退出临界区后需要进行解锁,否则其他线程无法访问临界区。所以第二处修改如下:
②退出区中的语句“lock = TRUE;”存在错误,修改为“lock = FALSE;”。
修改后如下线程T0和T1访问临界区的伪代码如下:
bool lock = FALSE; // 共享变量
...
void T0() {
bool key = TRUE;
while (key == TRUE)
swap key, lock; // 交换key和lock的值
临界区;
lock = FALSE;
...
}
void T1() {
bool key = TRUE;
while (key == TRUE)
swap key, lock; // 交换key和lock的值
临界区;
lock = FALSE;
...
}
实现了多线程互斥访问临界区。
(2) 第一问。否。
第二问。Swap指令为原子操作。但用函数调用语句“newSwap(&key, &lock)”代替指令“swap key, lock”后,因为多个线程可以并发执行newSwap(),newSwap()执行时传递给形参b的是共享变量lock的地址,在newSwap()中对lock既有读操作又有写操作,并发执行时不能保证实现两个变量值的原子交换,从而会导致并发执行的线程同时进入临界区。
将newSwap代替swap后,修正后的线程T0和T1访问临界区的伪代码如下:
bool lock = FALSE; // 共享变量
...
void T0() {
bool key = TRUE;
while (key == TRUE) {
bool temp = key; ①
key = lock; ②
lock = temp; ③
}
临界区;
lock = FALSE;
...
}
void T1() {
bool key = TRUE;
while (key == TRUE) {
bool temp = key; ④
key = lock; ⑤
lock = temp; ⑥
}
临界区;
lock = FALSE;
...
}
例如按照①②④⑤③⑥的顺序执行,则T0和T1能够同时进入临界区,进而产生冲突。
为了保证Swap指令的原子性,可使用的方案有通过软件加互斥锁实现或者通过硬件逻辑直接实现,相比使用软件加互斥锁实现的方案,通过硬件逻辑直接实现明显更加安全和高效。所以Swap指令是由硬件逻辑直接实现的,不会被中断。
登录后提交答案
暂无评论,来抢沙发