操作系统存储管理和oracle数据库(第三篇)

在之前的一篇博文中讨论了分页存储,http://blog.itpub.net/23718752/viewspace-1435671/
今天看了下分段存储,尽管这部分内容都是大学的课程内容,但是感觉好像没学过一样:)
分段式存储管理系统中,会为每个段分配一个连续的分区,而进程中的各个段可以离散地移入内存中不同的分区中,这一点上所说的段和数据库中的段还是有着很大的区别,数据库中的段是可以包含多个分区的,各个段
说起分段就会联想到分页,在这一点上自己的认识也很浅薄,查找了下资料,个人认为下面的这段描述还是很到位的。
http://blog.163.com/clevertanglei900@126/blog/static/111352259201121734555459/
分页与分段的主要区别
分页和分段有许多相似之处,比如两者都不要求作业连续存放.但在概念上两者完全不同,主要表现在以下几个方面:
(1)页是信息的物理单位,分页是为了实现非连续分配,以便解决内存碎片问题,或者说分页是由于系统管理的需要.段是信息的逻辑单位,它含有一组意义相对完整的信息,分段的目的是为了更好地实现共享,满足用户的需要.
(2)页的大小固定,由系统确定,将逻辑地址划分为页号和页内地址是由机器硬件实现的.而段的长度却不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时根据信息的性质来划分.
(3)分页的作业地址空间是一维的.分段的地址空间是二维的.

从数据库的角度来看,感觉和数据库中的段概念还是比较类似的。数据库中段包含多个分区。各个分区也可以在不相邻的分区中。
上一个图来说明。
在分段情况下,会要求每个进程的地址空间划分为若干个段,每个段都有自己的段名,对应到下图中就是一个段号。每个段的地地址空间都是从0开始,是一个连续的地址空间,
从地址的存储情况来说,段和页的存储方式都是类似的,都会包含两部分。分段存储中是段号和段内地址,和分页存储中的页号和页内地址类似。



由于一个进程由很多段组成,而且各个段可能被分配在主存中的多个不相邻的分区中,为了将进程的逻辑地址转换为物理地址,需要有一个短标来指出进程的某段放在主存中的位置以及段长。
这一点从数据库层面来说有类似的方面,首先是进程由多个段组成,数据库中可以理解为一个表包含多个段,数据段,索引段,lob段,lob索引段等等。这些都是独立的段,在存储的时候也可能分布在不同的表空间中,所以可能不是一个相邻的分区。
而段的信息在操作系统层面是通过段表来维护的,数据库层面则是通过数据字典,user_segment,user_extents来维护的,每个表包含的段,每个段包含的区都是很详实的。

从分段和分页的优点来说,因为它们涉及的层面和应用方向不同,但是还是有一定的可比性,在段共享方面,分段存储还是很有优势,谁让它是段共享呢。
从操作系统层面举个例子就是一个多用户系统,有一个应用程序可能包含的程序段是100K,数据段是40K,按理说需要40K*40+100k*40=1600+4000=5600k
在分段存储中则需要100k+40k*40=1700k,从这一点上来说还是很大的改进。
从这一点上来说,数据库中的同义词就有点分段存储的味道,每个同义词都可以访问源表,相当于共享了数据,同义词占用的存储空间很小,几乎可以忽略。

可能分段存储和分页存储都各有千秋,但是都是在不断的使用和改进中主键发展起来的,分段存储没有段内碎片,只有外部碎片,简单分段技术也是基于多重分区技术的发展而来。另外简单分页对于用户是不可见的,用户无法了解进程被分页或者分页的细节,但是简单分段对于用户基本是可见的,当进程被交换出内存的时候,对应的页表和段表也需要随着进程一起撤出内存。

当然分页分段方式还在不断的发展中,要不怎么有后续的段页式存储呢,在后续章节继续分享,需要多充充电,补补操作系统方面的东西。理解透了才能准确的类比数据库层面的东西。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。