题目
这个题目是2019年408操作系统的一道真题。考察的是对共享段表的理解。因为复习的时候没有怎么看教材,所以对这一块的知识就淡忘了。所以做题的时候就是凭借经验去分析的,最后就导致了一个错误的理解。
错误理解
这个题目的答案选择B,但是我自己最开始做的时候,是认为B是正确的。我是这样理解的:
我们现在假设这样的一个情景:该系统采用分段存储。虚拟地址一共32位,16位的段号,16位的段内偏移。
由题可知,现在进程P1和进程P2共享段S,且共享段被共享段表所表述。我们假设进程P1中的共享段S的逻辑地址(也就是虚拟地址)为0x12345000到0x12348000一共3KB的内容;进程P2中的共享段S的逻辑地址为0x3450000到0x34553000也是3KB的内容(因为这两个进程就是共享的一个段,自然这个段的大小是一样的)
那么进程P1如果访问共享段的内容,是不是要去共享段表里面找,看看这个共享段的实际物理地址在哪里!那么进程P1如何去找呢?是不是根据逻辑地址的划分,前面16位段号,结合段表寄存器中的段表基址找到这个段表项的位置。问题就出现在这里:因为进程P1和进程P2是同一个共享段表,所以他们的段基址寄存器的内容肯定是一样的。但是他们这个共享段的逻辑地址却不一样,这就导致了最后在形成这个共享段表项的物理地址的时候,出现了不同。自然,定位到共享段表的段表项也是不同的。
所以我认为这个共享段S在不同的进程中也应该有相同的段号。
正确理解
先看教材的上一段话
我今天看到教材(P187)上给出了共享段表的使用方法。我上面的理解的错误原因在于“我认为对于共享段这段代码,进程没有用自己的段表去记录这个代码加载到内存哪里。”但是,教材的说,我们还是要把这个共享段的内存记录在进程的段表项中。那么,题目中的说的共享段表又是来干什么的呢?
按照教材上的说法,这个共享段表记录的不仅仅是像普通段表项记录的那样子,而且还会记录“共享进程计数count、存去控制字段、段号(不同的进程可以有不同的段号)”
另一种理解
在我和同学的讨论过程中,他就给我举了这样的一个例子:
比如都需要调用一个函数,程序p1需要在第一步调用,程序P2需要在第二步位置调用,这样子他们的逻辑地址肯定不一样嘛,但是最后肯定是共享的同一个。