《现代操作系统》第二章进程的互斥处发现一个错误!!!!

qq_35516657 2017-06-14 08:48:22
TSL指令是一种需要硬件支持的方案。许多计算机,特别是那些为多处理机设计的计算机,都有一条指令叫做测试并上锁(TSL)。其工作如下所述:它将一个存储器字读到一个寄存器中,然后在该内存地址上存一个非零值。读数和写数操作保证是不可分割的—即该指令结束之前其他处理机均不允许访问该存储器字。执行TSL指令的CPU将锁住内存总线以禁止其他CPU在本指令结束之前访问内存。
为了使用TSL指令,我们必须用一个共享变量lock来协调对共享内存的访问。当lock为0时,任何进程都可以使用TSL指令将其置为1并读写共享内存。当操作结束时,进程用一条普通的MOVE指令将lock重新置为0。
这条指令如何被用来防止两个进程同时进入临界区呢?解决方案示于图2-10。其中示出了使用四条指令的汇编语言例程。第一条指令将lock原来的值拷贝到寄存器中并将lock置为1,随后这个原先的值与0相比较。如果它非零,则说明先前已被上锁,则程序将回到开头并再次测试。经过或长或短的一段时间后它将变成0(当前处于临界区中的进程退出临界区时),于是子例程返回,并上锁。清除这个锁很简单,程序只需将0存入lock即可,不需要特殊的指令。
enter_region:
tsl register,lock |复制lock到寄存器,并将lock置为1
cmp register,#0 | lock等于0吗?
jne enter_region |如果不等于0,已上锁,再次循环
ret |返回调用程序,进入临界区

leave_region:
move lock , #0 |置lock为0
ret |返回调用程序
图2-10 用TSL指令上锁和清除锁
现在就有一种很明确的解法了。进程在进入临界区之前先调用enter_region。这将导致忙等待,直到锁空闲为止。随后它获得锁变量并返回。在进程从临界区返回时它调用leave_region,这将把lock置为0。与临界区问题的所有解法一样,进程必须在正确的时间调用enter_region和leave_region,解法才能奏效。如果一个进程有欺诈行为,则互斥将会失败。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上为书中原文,在70页处,我的问题是假如有两个进程0和1,此时它们都还没进入过临界区,所以lock为0。突然进程0要进入临界区,执行了enter_region函数的第一条指令tsl register,lock后,因为某种原因发生中断,此时进程0还没有执行函数的第二条指令cmp register,#0。接着到了进程1要进入临界区,执行enter_region函数,此时lock为1,所以进程1挂起不能进入临界区(注意此时的register已被设置为1,因为执行了进程1的enter_region函数的第一条指令tsl register,lock,此处lock为1)。
现在进程0继续运行,执行enter_region函数的第二条指令cmp register,#0,因为进程1的原因,register此时的值为1,所以进程0也不能进入临界区从而挂起,这样不就造成错误了吗?
请大神看看我是否有分析错误。
...全文
102 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
ckc 2017-06-15
  • 打赏
  • 举报
回复
register是已经读到寄存器的数据, tsl同时做了读数据和置数据这两步工作 然后就算被中断,读到寄存器中的数据仍然不会被改变,还是原来读到的0

427

社区成员

发帖
与我相关
我的任务
社区描述
非技术问题的乐园
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧