关于共享段与SGA的一点理解

上一篇 / 下一篇  2008-02-20 21:38:35 / 精华(1)

查看( 26 ) / 评论( 58 )
上一周买了两本书,google了不少文档资料,看了看部分linux源代码终于有了以下一些理解。

一 各类地址概念

1 逻辑地址:我们一般在用汇编语言写程序时可能用到 seg register :offset
2 线形地址:0x00000000~0xffffffff,用来描述进程的地址空间
3 x86上逻辑地址到线形地址的转换规则:线形地址=[seg register]+offset
4 现代操作系统进程的线形地址到物理地址的转换一般是通过分页机制来完成的

[注]:
seg register 表示段寄存器里的值,[seg register]表示段寄存器里的值指向的段描述符(seg descriptor)的baseAddress值

            
二 OS进程段的概念

1 段是OS进程为管理进程运行时的空间组织而产生的一个东东。
2 x86 CPU在硬件上支持(且强制使用)分段;power等大多数RISC系列的CPU在硬件上都不支持。
3 x86 硬件分段实际使用情况:
  我们熟知的x86上的操作系统(包括windows,linux)都有限的使用了硬件分段,一般都是用的OS软件分段。
  方法:是将segment descriptor里的baseAddress和endAddress设置为0x00000000和0xffffffff
  原因和目的:
        a 对高级语言各类特征或标准提供更好的支持以提高性能,比如如C语言里的指针(见三)
        b 利用segment descriptor提供硬件上的内核保护
        c 使得虚拟空间管理起来简单高效统一

分段的原因:

一个程序文件要在进程里运行,那么的必须有指令,存储数据的空间,stack信息等等,
这些东西是如何组织起来并正确运行的呢?OS扮演了这个组织者的角色,通过分段技术。

比如在LINUX命令行:sqlplus "/as sysdba" 此时shell会为我们创建一个进程来运行
可执行文件sqlplus。首先读取sqlplus文件并根据sqlplus文件里的"相关信息"在进程
空间的相关位置(线形地址)创建建段如TEXT,DATA,BSS,STACK等等,这里提到的"相关
信息"是在程序编译链接时产生并记录在可执行文件里的 一般UNIX提供了不同的编译链
接参数其中部分就是用来影响这些"相关信息"的

LINUX里就是用一些vm_area_struct结构来记录并管理这些段的。

这种软件分段出了起组织程序运行的功能外,还有个优点是不必为总个进程空间分配
pagetable项注意pagetable项与physical page的关系,有时进程有了pagetable项但
系统还没为此项分配physical page 如果此时访问则会产生page faults 触发OS进行
相应的处理,如果访问不存在的pagetable项(极特殊情况除外)则会产生segment fault
系统异常程序exit。

共享段是在进程运行过程中通过系统调用生成的并能被其他进程共享(LINUX里就是为进程增加一个vm_area_struct结构)

补充1:
PowerPC-32
有些文档上将其32位地址说成[seg-4位][disp-28位],最大段为256M。这容易使读者产生误解。
其实这里的32位就是线形地址不是我们常说的seg:disp逻辑地址。之所以IBM文档上这样讲是
因为powerpc将线形地址转为物理地址时与intel处理方式并不一样,转换的中间有个virtual
address的概念

IBM《PowerPC Operating Environment Architecture Book III Version 2.02》讲的比较详细

三 使用逻辑地址还是线形地址(需特别注意-本文重点)?

现代通用操作系统windows,linux,aix等在运行时都是使用线形地址而不是逻辑
地址来访问数据,即使在硬件一级上强制用逻辑地址,但是OS都会通过将这个逻
辑地址的OFFSET=线形地址的手段处理掉这个逻辑地址问题。不使用逻辑地址的
原因有很多,读者可以考虑考虑。

下面是个证实不使用逻辑地址访问数据的方法:

想一想如果程序运行时用的是逻辑地址那么高级语言C里的“指针”如何实现呢?
第一种:使用seg:disp来存指针变量
        但是指针在32/64平台里都是32/64位的--可以建立一个指针数组然后计
        算它的大小就知道了,所以排除了用seg:disp来存指针变量
第二种:由一,所以存线形地址,但访问时先将线形地址转为逻辑地址然后访问        
        这种代价太大了,且多次一举。所以不可能进行这个转换

目前一些OS教材上经常提到的“逻辑地址”有点误导读者。其实即使我们用汇
编语言写程序时用到了逻辑地址的概念,但是OS的汇编语言编译器在编译汇编
语言程序时会对汇编语言程序进行处理,从而使得程序运行时全都通过线形地
址来访问数据。简而言之,忘记逻辑地址这个概念。


由此得出结论:
1 oracle sga 里存储的那些addr值(其实就是指针)是线形地址
2 共享sga的后台进程,以及server porcess都会将sga绑定在进程里的相同线形地址上
  如果不这样,那么这些进程不可能通过addr来访问在sga里的对象
3 ibm文档上说的"段"最大为256M只会影响进程分配多少pagetable项,并不会影响OS段的大小
4 shmmax的最大值只受OS管理段时的数据结构的一些限制
5 由于使用线形地址,sga分为多个共享段只会影响空间的使用,对性能几乎没有影响

TAG:

catchwo的个人空间 catchwo 发布于2007-08-21 16:24:34
辛苦了一周啊,欢迎探讨!
catchwo的个人空间 catchwo 发布于2007-08-21 17:00:37
坚决不沉
catchwo的个人空间 catchwo 发布于2007-08-21 17:27:16
up
棉花糖ONE发布于2007-08-21 17:43:41
虽然看不懂,还是帮你up
catchwo的个人空间 catchwo 发布于2007-08-21 18:31:31

QUOTE:

最初由 棉花糖ONE 发布
[B]虽然看不懂,还是帮你up [/B]

一亩三分西瓜地 BTxigua 发布于2007-08-21 18:34:36
老大,你狠,还看linux源代码。
这里的大部分都没这个水平的啊。
所以希望你能把你的结果给整理一下,讲的通俗一点。
一亩三分西瓜地 BTxigua 发布于2007-08-21 18:34:56
不关怎么说,帮你顶!
catchwo的个人空间 catchwo 发布于2007-08-21 18:44:38

QUOTE:

最初由 BTxigua 发布
[B]老大,你狠,还看linux源代码。
这里的大部分都没这个水平的啊。
所以希望你能把你的结果给整理一下,讲的通俗一点。 [/B]
我也是被逼得没法子了,网上有些帖子讲这个但是我觉得都有问题,所以干脆自己查。还费了我100多¥买了两本书。
linux 源代码也没看太多啦!就是看了些与虚拟存储相关的结构和函数。

我的语文水平比较次,下次仔细整理后再贴上来。
yg_java发布于2007-08-21 19:03:01
高手啊,学习ING
bluemoon0083发布于2007-08-21 19:08:01
就算看不懂也要顶
secooler的个人空间 secooler 发布于2007-08-21 20:46:09
up 你
yinwei1985发布于2007-08-21 20:46:38
前些天也是在看这个oracle的内存部分,看得头都大了,看得都没有兴趣学了
happytime1559发布于2007-08-21 20:47:16
好厉害哦,加油顶一下
jhfenggu发布于2007-08-21 21:09:30
动不动就说看什么OS源代码,我不敢苟同!
如果你是专业OS开发,底层开发的可以去了解这些东西,如果你是面向应用或者Oracle DBA,这些根本就不需要知道,研究也是浪费时间,知道OS的内部结构有实际意义吗?了解到内存的组成和体系结构就行了。
catchwo的个人空间 catchwo 发布于2007-08-21 21:20:48

QUOTE:

最初由 jhfenggu 发布
[B]动不动就说看什么OS源代码,我不敢苟同!
如果你是专业OS开发,底层开发的可以去了解这些东西,如果你是面向应用或者Oracle DBA,这些根本就不需要知道,研究也是浪费时间,知道OS的内部结构有实际意义吗?了解到内存的组成和体系结构就行了。 [/B]
大哥,我就是看了看LINUX源代码里的一小部分关于内存组织的结构和函数啊!我也没那么牛去专门研究OS源代码--仅仅为了“了解到内存的组成和体系结构”
catchwo的个人空间 catchwo 发布于2007-08-21 21:37:48
把组织好的内容已更新在帖子上了
yublaze发布于2007-08-21 21:42:51

QUOTE:

最初由 jhfenggu 发布
[B]动不动就说看什么OS源代码,我不敢苟同!
如果你是专业OS开发,底层开发的可以去了解这些东西,如果你是面向应用或者Oracle DBA,这些根本就不需要知道,研究也是浪费时间,知道OS的内部结构有实际意义吗?了解到内存的组成和体系结构就行了。 [/B]
了解一下毕竟还是有意义的,如果想深入了解oracle,我认为对操作系统的了解越深入越好。个人观点
夜的交响曲 joeldavid 发布于2007-08-21 21:48:11

QUOTE:

最初由 yublaze 发布
[B]

了解一下毕竟还是有意义的,如果想深入了解oracle,我认为对操作系统的了解越深入越好。个人观点 [/B]
个人比较赞同。
多面手本来就没有错的说
oracle也是要和os结合的
自己多了解只会有益无害吧
catchwo的个人空间 catchwo 发布于2007-08-21 22:03:32
欢迎来顶!
yublaze发布于2007-08-21 22:06:39
楼主给我们用浅显的语言具体介绍一下吧,我对OS方面的知识一直很想深入了解,但无奈自己水平有限
catchwo的个人空间 catchwo 发布于2007-08-21 22:11:51

QUOTE:

最初由 yublaze 发布
[B]楼主给我们用浅显的语言具体介绍一下吧,我对OS方面的知识一直很想深入了解,但无奈自己水平有限 [/B]
“用浅显的语言”的话太多东西要介绍了

看看OS教材--仔细了解
看看X86,Power CPU体系结构--了解X86,看看Power的相关部分就行
看看OReilly Understanding the Linux Kernel 3rd Edition----看看感兴趣的部分就行
catchwo的个人空间 catchwo 发布于2007-08-22 09:10:10
up
biti_rainy的个人空间 biti_rainy 发布于2007-08-22 09:38:48
http://bitirainy.itpub.net/post/330/1657
http://bitirainy.itpub.net/post/330/1658

以前曾经写过关系  sga  和 pga 之间的关系的帖子,实际上对应了 你的 1,2 两点

至于  page 大小影响 page 数量的问题,在linux上我遇见过 AS3.5 的 bug,当os内存有8g以上的时候,oracle运行一段时间出现out of  memory一类的问题,经过检查是kernel 在处理 pagetable 时候的bug,当数量超出一定范围的时候处理出错,由于升级kernel 已经来不及了,我就采用了4m 大小的page 而降低page数量来解决了这个问题。
当然,在aix上由于内存大小已经达到64g 以上,我也在想是否使用 big page 会有性能提升(减少page数量是否会带来页表访问的提升?),但由于aix上使用 big page实际上还是比较麻烦的也担心出现问题,生产系统终究没有去使用。


关于 共享内存段 数量和性能之间的关系,以前我们也争论过,一般情况下,应该对性能是没有影响的。
catchwo的个人空间 catchwo 发布于2007-08-22 09:53:48

QUOTE:

最初由 biti_rainy 发布
[B]http://bitirainy.itpub.net/post/330/1657
http://bitirainy.itpub.net/post/330/1658

以前曾经写过关系  sga  和 pga 之间的关系的帖子,实际上对应了 你的 1,2 两点

至于  page 大小影响 page 数量的问题,在linux上我遇见过 AS3.5 的 bug,当os内存有8g以上的时候,oracle运行一段时间出现out of  memory一类的问题,经过检查是kernel 在处理 pagetable 时候的bug,当数量超出一定范围的时候处理出错,由于升级kernel 已经来不及了,我就采用了4m 大小的page 而降低page数量来解决了这个问题。
当然,在aix上由于内存大小已经达到64g 以上,我也在想是否使用 big page 会有性能提升(减少page数量是否会带来页表访问的提升?),但由于aix上使用 big page实际上还是比较麻烦的也担心出现问题,生产系统终究没有去使用。


关于 共享内存段 数量和性能之间的关系,以前我们也争论过,一般情况下,应该对性能是没有影响的。 [/B]
前几天为这个问题困惑时,在C noug上读过老大的一个帖子“关于 共享内存段 的设置 和 unix下内存的段页式 管理”。但是没查到这两个,待会仔细看看
stronghearted的个人空间 stronghearted 发布于2007-08-22 10:09:17
5 由于使用线形地址,sga分为多个共享段只会影响空间的使用,对性能几乎没有影响[/COLOR]


一般一个共享段应大于sga,当然sga大于一个共享内存段,sga仍然可以创建成功,但在日志文件会出现warning!
性能方面问题,一般没影响!
catchwo的个人空间 catchwo 发布于2007-08-22 10:27:27

QUOTE:

最初由 biti_rainy 发布
[B]http://bitirainy.itpub.net/post/330/1657
http://bitirainy.itpub.net/post/330/1658

以前曾经写过关系  sga  和 pga 之间的关系的帖子,实际上对应了 你的 1,2 两点

至于  page 大小影响 page 数量的问题,在linux上我遇见过 AS3.5 的 bug,当os内存有8g以上的时候,oracle运行一段时间出现out of  memory一类的问题,经过检查是kernel 在处理 pagetable 时候的bug,当数量超出一定范围的时候处理出错,由于升级kernel 已经来不及了,我就采用了4m 大小的page 而降低page数量来解决了这个问题。
当然,在aix上由于内存大小已经达到64g 以上,我也在想是否使用 big page 会有性能提升(减少page数量是否会带来页表访问的提升?),但由于aix上使用 big page实际上还是比较麻烦的也担心出现问题,生产系统终究没有去使用。


关于 共享内存段 数量和性能之间的关系,以前我们也争论过,一般情况下,应该对性能是没有影响的。 [/B]
IBM《PowerPC Operating Environment Architecture Book III Version 2.02》介绍了:64位AIX的线形地址到物理地址的转换是通过一个hash算法来访问页表的。所以减少page数量对性能可能不会有太大的提高。
biti_rainy的个人空间 biti_rainy 发布于2007-08-22 11:02:29

QUOTE:

最初由 catchwo 发布
[B]

IBM《PowerPC Operating Environment Architecture Book III Version 2.02》介绍了:64位AIX的线形地址到物理地址的转换是通过一个hash算法来访问页表的。所以减少page数量对性能可能不会有太大的提高。 [/B]
os 跟oracle访问 buffer  cache 一样都会通过hash 来做,os 的pagetable 类似于 oracle  cache  buffer  chain 的hash table。但我不知道os的hash bucket 数量是如何确定的,冲突的几率多大。只能是在想降低page数量也许能降低冲突的概率。
这是一个方面,另一个方面是,如果内存有128g 大致来讲:
ops$admin@OCNDB>select  128*1024*1024/4  from dual;

128*1024*1024/4
---------------
       33554432

几千万个页,还是比较大的,因为我们发现os 在大内存下自身的消耗其实还是很大的,比如 AIX 下 maxpin  ,默认是80% ,但oracle 的sga 如果lock 在内存中,就不能超过 70%,否则将可能造成os  kernel 内存出现问题,也就是说 消耗还是蛮大的,我怀疑 页  太多是造成 os kernel 消耗内存过多的一个重要原因。128g的  内存这就是10多G啊。
catchwo的个人空间 catchwo 发布于2007-08-22 11:41:24
前面我的结论有误,只考虑了线形地址到物理地址的转换,没考虑OS管理pagetable的消耗,biti老大确实考虑得全面。

128G 确实大! 这种情况下应该是对线形地址到物理地址的转换影响不大,但是增加了OS管理pagetable(太多了)的负担,从而影响性能的。这种情况下用bigpage应该会有比较好的优化效果
wangfans的个人空间 wangfans 发布于2007-08-22 11:49:33
学习
catchwo的个人空间 catchwo 发布于2007-08-22 13:49:59

QUOTE:

最初由 wangfans 发布
[B]学习 [/B]
是啊。在看文档时遇到模糊的地方,如果不弄清楚(至少要能合理的联系起来)的话感觉特别不爽
我来说两句

(可选)

日历

« 2008-09-07  
 123456
78910111213
14151617181920
21222324252627
282930    

我的存档

数据统计

  • 访问量: 118
  • 日志数: 2
  • 建立时间: 2008-02-19
  • 更新时间: 2008-02-20

RSS订阅

Open Toolbar