13.5.5 区域表(RT)
区域表可用于共享区域。读者已经知道一个编辑器程序包括文本区、数据区和堆栈区。编辑器(例如,VI)的文本部分可以由多个运行该软件的用户使用。然而,对每个用户而言,数据区根据正在编辑的文件或数据有所不同。因此,某些区域可以共享,某些不可以。操作系统通过区域表就能做到这一点。在区域表中,对每个共享的区域如编辑器或编译器的文本区只有一个条目。图13-27描述了进程1和2共享区域号等于0的区域。然而,对未共享的或"私有"区域而言,在P区和区域表中都保存不同的条目。区域表包含一个指向帮助实现内存中逻辑页面到物理页面转换的内存映射表的指针。如果内核采用的是连续内存管理方案而不是分页方案,那么区域表包括一个指向该区域内存地址的指针。
最终从可执行文件的内容加载内存中的区域(这是由编译器生成的)。该文件也是UNIX文件系统的一部分,内核可以用索引节点号唯一地标识它。因此,区域表还包括一个指向该索引节点的指针,它可以追溯区域加载的原始位置。
总而言之,区域表包含以下信息:
(1) 区域类型(文本、数据或堆栈)
(2) 区域大小
(3) 在主存中的位置(直接的或通过页面映射)
(4) 区域状态,如锁存、正在加载、有效的(已经加载的)等
(5) 提供共享区域进程数量的引用计数(每创建一个共享该区域的进程时,计数器递增1。当进程结束时,计数器递减1。当计数器值为0时,释放区域)
(6) 指向索引节点的指针
(7) 指向P区表的指针
区域表条目大小固定,因此,一旦内核知道区域id或区域号就可以直接访问它。所以,区域id或区域号实际上并不是区域表中的一个字段。这里给出了它,只是为了便于读者更好地理解。
任何时候,区域表都包括一些正在使用的条目和一些空闲条目。空闲条目通过指针链表链接在一起。当区域空闲时,UNIX包括将条目添加到空闲链表的程序。图13-29解释了实现区域表分配/释放的方法。
(点击查看大图)图13-29 区域表:空闲链表 |