<< 返回文章列表

使用C语言直接访问SGA

2017年12月20日
姜刚
1803
基于的事实:

1、数据库启动后会分配共享内存(在ORACLE中称为System Global Area[SGA])

2、数据库中X$开头的表都是内存映射表

3、在Linux/Unix下提供了C的Lib库可以访问共享内存(shmat,shmdt,shmget等)


以GV$SESSION_WAIT为例


查看GV$SEESSION_WAIT的定义


image.png


通过上述创建视图信息,我们知道v$session_wait是建在X$KSUSECST和X$KSLED两个内存映射表上的,其访问路径是类似下图:


image.png

共享内存结构


image.png


获取SGA起始地址语句如下:


select ‘0x’||addr from X$KSMMEM where rownum<2;


X$KSUSECST在内存中的位置


image.png


获取X$KSUSECST起始地址:


Select min(addr) as BEGIN_ADDR from X$KSUSECST


获取在内存中的记录数:


Select count(*)  as RECORD_SZ from X$KSUSECST


X$KSUSECST在内存区域的范围


image.png


每个记录数的长度:


Select to_dec(e.addr)-to_dec(s.addr) as LENGTH from

(select min(addr) as addr from X$KSUSECST where rownum<2) s,

(select max(addr) as addr from X$KSUSECST where rownum<3) e


image.png


获取每个字段的偏移量:

      

image.png


通过上述几个信息收集,我们获得了以下信息:

image.png


附录
C语言代码:

image.png

image.png

image.png

参考资料:

http://www.doc88.com/p-113695303367.html

http://oraperf.sourceforge.net/