设有堆栈s,栈指针top,栈中存放内存中相应数据块地址,设有两个程序段getaddr(top)和reladdr(blk),其中getaddr(top)从给定的top所指栈中取出相应的内存数据块地址,而reladdr(blk)则将内存数据块地址blk放入堆栈

admin2014-10-20  23

问题 设有堆栈s,栈指针top,栈中存放内存中相应数据块地址,设有两个程序段getaddr(top)和reladdr(blk),其中getaddr(top)从给定的top所指栈中取出相应的内存数据块地址,而reladdr(blk)则将内存数据块地址blk放入堆栈S中。getaddr(top)和reladdr(blk)可分别描述为:
proced ure getaddr(top)
begin
local r
r←(top)
top←top一1
return(r)
end
procedure reladdr(blk)
begin
top←top+1
(top)←blk
end
问:如果对这两个程序段采用并发执行,则在单CPU系统中,是否会破坏封闭性和可再现性?为什么?

选项

答案程序段reladdr开始执行,准备释放内存数据块地址入栈。然而,当reladdr执行到top←top+1语句时[见图(b)],程序段get:addr也开始执行且抢占了处理机,从而程序段reladdr停在top←top+l处等待处理机。getaddr程序段的执行目的是要从对应的堆栈指针top所指的栈格中取出一个内存数据块地址,显然,由于reladdr程序段的执行将指针top升高了一格且未放进适当的数据,getaddr的执行结果是失败的[见图(c)]。 [*]

解析
转载请注明原文地址:https://kaotiyun.com/show/jSvR777K
0

最新回复(0)