进程的结构体变量内存分配配结构

没有更多推荐了,
不良信息举报
举报内容:
Linux下进程内存空间组成/进程的内存映像
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
Linux程序存储结构与进程结构堆和栈的区别
摘要:摘要:本文主要讲述了Linux系统中,程序存储结构(代码区、数据段和BBS区)与进程的基本结构(代码区、数据段、BBS区、堆和栈),以及堆和栈的区别.Linux程序存储结构与进程结构1.Linux程序存储结构在Linux系统下,程序是一个普通的可执行文件,图1是一个Linux下ELF格式可执行文件的基本情况.图1ELF格式可执行文件的基本信息可以看出,此ELF格式可执行文件在存储时,没有调入到内存,分为代码区(text),数据区(data)和为初始化区(bss)3个部分.各段
摘要:本文主要讲述了Linux系统中,程序存储结构(代码区、数据段和BBS区)与进程的基本结构(代码区、数据段、BBS区、堆和栈),以及堆和栈的区别.
Linux程序存储结构与进程结构
1.Linux程序存储结构 在Linux系统下,程序是一个普通的可执行文件,图1是一个Linux下ELF格式可执行文件的基本情况.
图1 ELF格式可执行文件的基本信息
可以看出,此ELF格式可执行文件在存储时,没有调入到内存,分为代码区(text),数据区(data)和为初始化区(bss)3个部分.各段基本说明如下:
(1)代码区(text segment).也称正文段.存放CPU可执行的机器指令,通常代码区是可共享的(即另外的执行代码可以访问调用它)代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令.因此,常量数据在编译时在代码段中分配空间.例子1会说明这点.
代码区的指令包括操作码和操作对象(或对象的地址引用),如果是具体数值,将直接包含在代码中.如果是局部数据,将在运行时在栈区分配空间,然后再引用数据的地址;如果是BBS区和数据区,在代码中同样将引用该数据的地址.
(2)全局初始化数据区/静态数据区,或简称数据段.该区包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量和局部静态变量).但被const声明的变量以及字符串常量在代码段中申请空间.
(3)未初始化数据区,也称BBS区.存入的是未初始化全局变量和未初始化静态变量.BBS区的数据在程序开始执行之前被内核初始化为0或者空指针(NULL).
例子1,说明常量数据在编译时在代码段中分配空间.
#include &stdio.h&int main(){
char *buf =NULL;
printf(&%s/n&,buf);
return 0;}
编译后检测各段的大小:
在代码中添加一个字符常量和const数据常量:
#include &stdio.h&const int i=10;int main(){
char *buf = NULL;
printf(&%s/n&,buf);
return 0;}
重新编译后查看:代码段的数据增加了4字节的const i.
2.Linux进程结构 在Linux系统下,如果将一个ELF格式可执行文件加载到内存中运行,则将演变成一个或多个进程.进程是Linux事务的基本管理单元,所有的进程均拥有自己的独立的环境和资源.进程的环境由当前系统状态及其父进程信息决定和组成.
一个正在运行的进程在内存空间中申请的代码区、初始化数据区、未初始化数据区、上下文信息以及挂载的信号等等.
(1)代码区.加载的是可执行文件的代码段,其加载到内存中的位置由加载器完成.
(2)全局初始化数据区/静态数据区.加载的是可执行文件数据段,位置可位于代码段后也可以分开.程序在运行之初就为该数据段申请了空间,在程序退出时才释放,因此,存储于数据段的数据的生存周期为整个程序运行过程.
(3)未初始化数据区.加载的是可执行文件BBS段,位置可以分开也可以紧靠数据段.程序在运行之初为该部分申请了空间,在程序退出时才释放,存储于该部分的数据的生存周期为整个程序运行过程.
(4)栈.由编译器自动分配释放.自动变量以及每次函数调用所需要保存的信息都存放在此段中.每次调用函数时,其返回地址以及调用者的环境信息都存放在栈中.然后,最近被调用的函数在栈上为其自动和临时变量分配存储空间.通过这种方式使用栈,可以递归的调用C函数.递归函数每次调用自身时,就使用一个新的栈帧,因此一个函数调用实例中的变量集不会影响另一个函数调用实例中的变量.
(5)堆,通常在堆中进行动态存储分配.一般由程序员分配和释放,若程序员不释放,程序结束是由系统收回.堆位于非初始化数据段和栈之间.
图2 所示为ELF格式可执行文件存储结构和Linux进程基本结构的对照图.
图2 可执行文件与进程存储布局
3.为什么分这么多个区?(1)代码段和数据段分开,运行时便于分开加载,在哈佛体系结构的处理器将取得更好的流水线处理效率.
(2)代码是依次执行,由处理器的PC指针依次读入,而且代码可以被多个程序共享,数据在整个运行过程中有可能多次被使用,如果将代码和数据混合在一起将造成空间的浪费.
(3)临时数据及需要再次使用的代码在运行时放入栈中,生命周期短,便于提高资源利用率.
(4)堆区可以由程序员分配和释放,以便用户自由分配,提高程序的灵活性.
4.堆和栈的区别栈是由编译器在程序运行时分配的空间,由操作系统维护.堆是由malloc()函数分配的内存块,内存的管理由程序员手动控制,在C语言使用free()函数完成.主要区别有一下几点:
(1)管理方式不同
程序在运行时栈由操作系统自动管理,无须程序员手工控制;而堆空间的申请、释放工作由程序员控制,容易产生内存泄露.
(2)空间大小不同
栈是向低地址扩展,是一块连续的内存区域.即栈顶的地址和栈的最大容量是系统预先规定好的,当申请的空间超过栈的剩余空间时,将出现栈溢出错误.堆是向高地址扩展,是不连续的内存区域.因为系统是用链表来存储空闲内存地址的,且链表的遍历方向是由低地址高地址.
(3)产生碎片不同
对于堆来说,频繁的malloc/free势必会造成内存空间的不连续从而造成大量的碎片,使程序效率降低.对于栈来说,一定是连续的物理内存空间.
(4)增长方式不同
在X86平台上,堆的增长方向是向上,即向着内存地址增加的方向;栈的增长方向是向下的,即向着内存地址减小的方向.
(5)分配方式不同
堆都是程序中由malloc()函数动态申请分配并由free() 函数释放;栈的分配和释放是由操作系统完成的,栈的动态分配有alloca()函数完成,但是栈的动态分配和堆是不同的,其由编译器进行分配和释放,无须手工完成.
(6)分配效率不同
栈是系统提供的,操作系统会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都是专门的指令执行.堆则是C函数库提供的,它的机制很复杂,例如为了分配一块内存,则需要操作系统重新整理内存,搜索整理内存空间,这样就有机会分到足够大小的内存,然后返回.显然,堆的效率比栈要低的多.
笔者:个人能力有限,只是学习参考...读者若发现文中错误,敬请提出.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------勿在浮沙筑高台,静下心来,慢慢地沉淀---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
Linux程序存储结构与进程结构堆和栈的区别相关信息,包括
的信息,所有Linux程序存储结构与进程结构堆和栈的区别相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International博客访问: 42751
博文数量: 29
注册时间:
分类: Oracle 15:50:17
(一)结构和结构 数据库的总体结构如下图:
1:Oracle实例(Instance)
在一个中,每一个运行的都与一个数据库实例相联系,实例是我们 访问数据库的手段。
实例在中用ORACLE_SID来标识,在Oracle中用参数INSTANCE_NAME来标识,它们两个的值是相同的。数据库时,系统首先在服务器内存中分配系统全局区(SGA), 构成了Oracle的内存结构,然后启动若干个常驻内存的操作,即组成了Oracle的 进程结构,内存区域和后台进程合称为一个Oracle实例。
数据库与实例之间是1对1/n的关系,在非并行的数据库系统中每个Oracle数据库与一个 实例相对应;在并行的数据库系统中,一个数据库会对应多个实例,同一时间用户只与一个 实例相联系,当某一个实例出现故障时,其他实例自动服务,保证数据库正常运行。在任何 情况下,每个实例都只可以对应一个数据库。 2:动态内存管理
内存是影响数据库性能的重要因素,Oracle8i使用静态内存管理,Oracle 10g使用动态 内存管理。所谓静态内存管理,就是在数据库系统中,无论是否有用户连接,也无论并发用 量大小,只要数据库服务在运行,就会分配固定大小的内存;动态内存管理允许在数据库服 务运行时对内存的大小进行修改,读取大数据块时使用大内存,小数据块时使用小内存,读 取标准内存块时使用标准内存设置。
按照系统对内存使用方法的不同,Oracle数据库的内存可以分为以下几个部分:
•系统全局区:SGA(System Global Area)
•程序全局区:PGA(Programe Global Area)
•排序池:(Sort Area)
•大池:(Large Pool)
•Java池:(Java Pool) 2-1:系统全局区SGA(System Global Area)
SGA是一组为系统分配的共享的内存结构,可以包含一个数据库实例的数据或控制信
息。如果多个用户连接到同一个数据库实例,在实例的SGA中,数据可以被多个用户共享。
当数据库实例启动时,SGA的内存被自动分配;当数据库实例关闭时,SGA内存被回收。
SGA是占用内存最大的一个区域,同时也是影响数据库性能的重要因素。
SGA的有关信息可以通过下面的语句查询,sga_max_size的大小是不可以动态调整的。
=====================================
SQL> show parameter sga
------------------------------------ ----------- --------
pre_page_sga
sga_max_size
big integer 164M
sga_target
big integer 0
SQL> alter system set sga_max_size=100m;
alter system set sga_max_size=100m
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified
======================================
系统全局区按作用不同可以分为:
•数据缓冲区
•日志缓冲区
•共享池2-1-1:数据缓冲区(Database Buffer Cache)
如果每次执行一个操作时,Oracle都必须从磁盘读取所有数据块并在改变它之后
又必须把每一块写入磁盘,显然效率会非常低。数据缓冲区存放需要经常访问的数据,
供所有用户使用。修改数据时,首先从数据文件中取出数据,存储在数据缓冲区中,
修改/插入数据也存储在缓冲区中,commit或DBWR(下面有详细介绍)进程的其他条
件引发时,数据被写入数据文件。
数据缓冲区的大小是可以动态调整的,但是不能超过sga_max_size的限制。
======================================
SQL> show parameter db_cache_size
------------------------------------ ----------- -----------------
db_cache_size
big integer 24M
SQL> alter system set db_cache_size=128m;
alter system set db_cache_size=128m
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00384: Insufficient memory to grow cache
SQL> alter system set db_cache_size=20m;
System altered.
SQL> show parameter db_cache_
------------------------------------ ----------- -----------------
db_cache_size
big integer 20M
#此处我仅增加了1M都不行?
SQL> alter system set db_cache_size=25m;
alter system set db_cache_size=25m
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00384: Insufficient memory to grow cache
#修改显示格式,方便查看。
SQL> column name format a40 wrap
SQL> column value format a20 wrap
#下面语句可以用来查看内存空间分配情况,注意SGA各区大小总和。
SQL> select name,value from v$parameter where name like '%size' and value
#先将java_pool_size调小,然后再修改db_cache_size
SQL> show parameter java_pool_
------------------------------------ ----------- -----
java_pool_size
big integer 48M
SQL> alter system set java_pool_size=20m;
System altered.
SQL> alter system set java_pool_size=30m;
System altered.
#上面说明SGA中各区大小总和不能超过sga_max_size。
=====================================
数据缓冲区的大小对数据库的存区速度有直接影响,多用户时尤为明显。有些应
用对速度要求很高,一般要求数据缓冲区的命中率在90%以上。
下面给出一种计算数据缓冲区命中率的方法:
•使用数据字典v$sysstat
=====================================
SQL> select name, value from v$sysstat
where name in('session logical reads',
'physical reads',
'physical reads direct',
'physical reads direct (lob)')
------------------------------- ----------
session logical reads
physical reads
physical reads direct
physical reads direct (lob)
======================================
命中率=1-()/895243
可以让Oracle给出数据缓冲区大小的建议:
======================================
SQL> alter system set db_cache_advice=#打开该功能
System altered.
SQL> alter system set db_cache_advice=#关闭该功能
System altered.
======================================2-1-2:日志缓冲区(Log Buffer Cache)
日志缓冲区用来存储的修改信息。该区对数据库性能的影响很小,有关日
志后面还会有详细的介绍。
查询日志缓冲区大小:
SQL> show parameter log_buffer
----------
-----------
log_buffer
2-1-3:共享池(Share Pool)
共享池是对SQL,PL/SQL程序进行语法分析,编译,执行的区域。
它包含三个部分:(都不可单独定义大小,必须通过share pool间接定义)。
•库缓冲区(Library Cache)包含SQL,PL/SQL语句的分析码,执行计划。
•数据字典缓冲区(Data Dictionary Cache)表,列定义,权限。
•用户全局区(Usr Global Area)用户MTS会话信息。
共享池的大小可以动态修改:
======================================
SQL> show parameter shared_pool_size
------------------------------------ ----------- ------
__shared_pool_size
big integer 80M
shared_pool_size
big integer 80M
SQL> alter system set shared_pool_size=78m
System altered.
======================================
#上面的__shared_pool_size一行奇怪? 2-2:程序全局区PGA(Programe Global Area)
程序全局区是包含单个用户或数据和控制信息的内存区域,它是在用户连
接到并创建一个会话时由Oracle自动分配的,不可共享,主要用于用户在编程存
储变量和数组。
•Stack Space是用来存储用户会话变量和数组的存储区域;
•User Session Data是为用户会话使用的附加存储区。
|--Session Information
|--Sort Area
|--Cursor Information
注意Session information(用户会话信息)在独占服务器中与在共享服务器中所处
的内存区域是不同的。 2-3:排序区,大池,池
排序区(Sort Area)为有排序要求的SQL语句提供内存空间。使用专用的内存区
域进行数据排序,这部分空间就是排序区。在中,用户数据的排序可使用
两个区域,一个是内存排序区,一个是磁盘临时段,系统优先使用内存排序区进行排序。
如果内存不够,Orcle自动使用磁盘空间进行排序。为提高数据排序的速度,建议
尽量使用内存排序区,而不要使用临时段。
参数sort_area_size用来设置排序区大小。(好象不能动态修改?)
大池(Large Pool)用于数据库工具--恢复管理器(RMAN:Recovery Manager)。
Large Pool的大小由large_pool_size确定,可用下面语句查询和修改:
=========================================
SQL> show parameter large_pool_size
-----------------
----------- -------
large_pool_size
big integer
SQL> alter system set large_pool_size=7m;
System altered.
=========================================
Java池主要用于Java语言开发,一般来说不低于20M。其大小由java_pool_size来
确定,可以动态调整。 2-4:Oracle自动管理(Automatic Shared Memory(SGA) Management)
在Oracle 8i/9i中员必须手动调整SGA各区的各个参数取值,每个区要根据 负荷轻重分别设置,如果设置不当,比如当某个区负荷增大时,没有调整该区内存大小,则 可能出现ORA-4031:unable to allocate ...bytes of shared memory错误。
在中,将参数STATISTICS_LEVEL设置为TYPICAL/ALL,使用SGA_TARGET指 定SGA区总大小,数据库会根据需要在各个组件之间自动分配内存大小。 下面是系统自动调整的区域:
•固定SGA区及其他•共享池•数据缓冲区• Java池•大池。
注意:如果不设置SGA_TARGET,则自动共享内存管理功能被禁止。
==========================================
SQL> show parameter statistics_level
--------------------- ----------- ------------
statistics_level
SQL> alter system set statistics_level=
System altered.
#typical和all有什么区别?
SQL> alter system set statistics_level=
System altered.
SQL> show parameter sga_target
------------- ----------- ----------
sga_target
big integer 0
SQL> alter system set sga_target=170m;
alter system set sga_target=170m
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00823: Specified value of sga_target greater than sga_max_size
SQL> alter system set sga_target=20m;
System altered.
#不过后来又发现sga_target的值变成了140M? 下面是语句执行情况。
SQL> show parameter sga_target
------------- ----------- -------
sga_target
big integer 140M
SQL> alter system set sga_target=0;
System altered.
SQL> show parameter sga_target
------------------------------------ ----------- ------
sga_target
big integer 0
SQL> alter system set sga_target=20m;
System altered.
#显示的是140M
SQL> show parameter sga_target
------------------------------------ ----------- ------
sga_target
big integer 140M
#不可缩减?
SQL> alter system set sga_target=130m;
alter system set sga_target=130m
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00827: could not shrink sga_target to specified value
SQL> alter system set sga_target=141m;
alter system set sga_target=141m
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00823: Specified value of sga_target greater than sga_max_size
3:Oracle实例的进程结构(Process Structure) Oracle包含三类进程: •用户进程(User Process) •服务器进程(Server Process) •后台进程(Background Process)
3-1:用户进程和服务器进程
当数据库用户请求连接到Oracle的服务时用户进程(比如启动SQLPlus时)。
•用户进程首先必须建立一个连接。
•用户不能直接与Oracle服务器,必须通过服务器进程交互。
•服务器进程是用户进程与服务器交互的桥梁,它可以与Oracle Server直接交互。
•服务器进程可以有共享和独占两种形式。
3-2:后台(Backgroung Process)
数据库的物理结构与结构之间的交互要通过后台进程来完成。数据库的后台进程包 含两类,一类是必须的,一类是可选的:
•Mandatory background processes
|--DBWn(Database Writer):数据写入
|--PMON(Process Moniter):进程监控
|--LGWR(Log Writer):日志写入
|--SMON(System Moniter):监控
|--RECO(Recovery):恢复
|--CKPT(Chekpoint):检查点
•Optional background processes
|--ARCn(Archiver):归档
|--LCKn(Lock):锁
|--Dnnn(Dispatcher):调度
可以用下面的语句查看正在运行的后台进程:
=========================================
SQL> select * from v$bgprocess where paddr'00';
PSERIAL# NAME
DESCRIPTION
-------- ---------- ----- -------------------------------
process cleanup
Memory Manager
db writer process 0
checkpoint
System Monitor Process
distributed recovery
Job Queue Coordinator
AQ Coordinator
Manageability Monitor Process
Manageability Monitor Process 2
========================================
3-2-1:DBWR(Database Writer,数据写入进程)
将数据缓冲区的数据写入数据文件,是负责数据缓冲区管理的一个后台进程。
当数据缓冲区中的一数据被修改后,就标记为dirty,DBWR进程将数据缓冲区中“脏” 数据写入数据文件,保持数据缓冲区的”干净“。由于数据缓冲区的数据被用户修改并占 用,空闲数据缓冲区会不断减少,当用户进程要从磁盘读取数据块到数据缓冲区却无法找 到足够的空闲数据缓冲区时,DBWR将数据缓冲区内容写入磁盘,使用户进程总可以得到足 够的空闲数据缓冲区。
DBWR的作用:
•管理数据缓冲区,以便用户进程总能够找到足够的空闲缓冲区。
•将所有修改后的缓冲区数据写入数据文件。
•使用LRU(最近最少使用)算法保持缓冲区数据是最近经常使用的。
•通过延迟写来优化磁盘I/0读写。
3-2-2:LGWR(Log Writer,日志写入进程)
将日志数据从日志缓冲区写入磁盘日志文件组。数据库在运行时,如果对数据库进行修 改则产生日志信息,日志信息首先产生于日志缓冲区。当日志达到一定数量时,由LGWR将 将日志数据写入到日志文件组,再经过日志切换,由归档进程(ARCH)将日志数据写入归 档进程(前提是数据库运行在归档模式下)。数据库遵循写日志优先原则,即在写数据之前 先写日志。
•ARCH(Archiver,归档进程)
Oracle数据库有两种运行模式,归档(ARCHIVELOG),非归档(NOARCHIVELOG)模式。 以非归档模式运行时日志在切换时被直接覆盖,不产生归档日志,这是数据库默认的运行模 式。数据库运行在归档模式时,在日志切换之前,由ARCH进程将日志信息写入磁盘,也就是 自动在线日志。
Oracle数据库的Redo文件数量是有限的,所以Oracle以循环的方式向它们中写入。它顺 序写满每一个Redo文件,当达到最后一个时,再循环回去开始填写第一个Redo文件。如果为 了能恢复数据库而想保存日志文件,那么在它们被重新使用之前需要对其进行备份,归档进 程管理此工作。 点击查看大图
•CKPT(Check Point,检查点进程)
运行CKPT时,系统对全部数据文件及控制文件文件头的同步信号进行修改,以保证数据 库的同步。检查点出现在以下情况:
|--在每个日志切换时产生。
|--上一个检验点之后又经过了指定时间。
|--从上一个检验点之后,当预定义数量的日志块被写入磁盘之后。
|--数据库关闭。
|--DBA强制产生。
|--当表空间设置为OFFLINE时。
•SMON(System Moniter,系统监控进程)
SMON在实例时执行实例恢复,并负责清理不再使用的临时段。
•PMON(Process Monitor,进程监控)
PMON在用户进程出现故障时进行恢复,负责清理内存区域和释放该进程所使用的资源。
•RECO(Recovery,恢复进程)
RECO用于分布式数据库维持在分布式环境中的数据的一致性。
•LCKn(Lock,锁进程)
在并行中用于多个实例间的封锁。
•Dnnn(Dispatcher,调度进程)
Dnnn存在于服务器体系结构中,负责将用户进程连接到服务器进程,再把结果返
回给用户进程。点击查看大图[@more@]
阅读(553) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。oracle学习入门系列之五内存结构、数据库结构、进程
oracle学习入门系列之五
内存结构、结构、进程
1 数据库结构
关于这个话题,网上一搜绝对一大把,更别提书籍上出现的了,还有很多大师们的讲稿。但是我们不去管那些,按照我们自己节奏记出特性、记出精彩来。
首先插入本系列第一张图片,图一(绝对来自官网),看蛤蟆对于图片使用是多么小心的,如果大伙对这个图已有自己独到的理解,那么可直接跳过本篇笔记吧,当然温故而知新也未尝不可,知耻而后勇&.额,而来知耻?
1.1 总体结构
这个图1从总体上描述了Oracle数据库的大概了,包含有内存结构,数据库文件,进程及客户端。虽然不是非常详细但是蛤蟆觉得该图是在是理解ORACLE数据库入门的好图。
那么我们一起围观下该图到底说了些什么。
服务进程,这里展开就是服务进程是专用服务进程还是共享,后续会慢慢道来。
内存结构,内存结构中主要包含PGA和SGA,PGA是为客户端接入时候服务,SGA是数据库运行服务的,这些在机器下电后就消失了。
还有主要的6个进程PMON,SMON,DBWR,LGWR,CHPT,Arcn,在启动数据库的时候才会有这些进程。
最下面就是存放在持久化介质上文件了,有归档日志,数据文件,参数文件,密码文件等,不随机器下电而消失的。
途中有2个在Oracle中非常重要的概念,实例和数据库:
1.1.1 实例
实例是oracle 创建的进程和内存结构的组合。
1.1.2 数据库
数据库是由一组文件组成的,对数据库的所有操作都是需要通过实例来完成了。通常数据库和实例是一一对应的。例外就是RAC了,RAC下一个数据库就对应了多个实例。
实例和数据库关系打个比方就是发动机和汽车的关系。汽车就是数据库,就在那里,但是动不了,只有发动机发动了,汽车才能动起来。一般情况下一个汽车一个单缸发动机;但是也可以是多缸的嘛,如6缸发动机什么的。
接下去看逻辑数据库结构。
1.2 逻辑数据库结构
放入第二章图,如下图2,如来自互联网
这里需要提一些概念了,都是ORACLE数据库中最基本而且需要一直掌握的概念,是一直,死都不能忘了,如果担心自己忘记就记下来把。这里提到的概念是一通百通的,很多可以适用到其他数据库中的,记住后我们后续学习必将事半功倍。
我们从最下面开始介绍吧,枯燥但不乏味的哈~
1.2.1 数据块
数据块,data block,是oracle数据块的存储基础,有若干字节组成。又是若干,到底是多少个字节呢?一般常用的是8KB,4KB的了,在创建数据库的时候可以指定。一旦指定就不能改变了,不过即使在4KB的数据库中,我们也可以指定创建8KB的表空间的,只要我们内存结构中存在8KB的缓存。
数据块类似操作中的块大小,通常ORACLE数据库块大小会是操作系统块大小的整数倍,其中好处就无需多说了。
蛤蟆自身工作经验来看,在OLTP模型上,4KB、8KB及16KB下性能相差不是特别明显。
不过原则是块尺寸是处理Oracle的更新、选择或者插入数据事务的最小单位,且访问很随机,则选择块较小的块尺寸;如果行比较小且访问主要是连续,或者如果有较大的行,则用较大的块尺寸。
1.2.2 数据区间
区,extent,是两个或者多个相邻的ORACLE数据块,他是空间分配的单元。概念总是如此的明了,3点关键。
a) 2个或2个以上
b) 相邻的数据块
c) 空间分配单元
数据块是存储单元,区是分配单元。看着概念重不重要的,从概念我们就知道,ORACKE分配空间的时候至少2个数据块起步的。要是申请一个数据块,那么不好意思啦,就是不给。
就像小时候向爸爸妈妈要零花钱,
我们:&妈,给我5分钱,买个萝卜丝吃&
老妈:&!@#¥%&&,没有5分&
我们:&一毛也行&
老妈:&好吧,又买两包萝卜丝?,给你1毛&
1.2.3 数据段
段是分配给某个逻辑结构的一组区。
a) 分配给某个逻辑结构
1.2.4 对象
ORACLE数据库对象,主要就是如下10个了。
2) 约束条件:保证数据完整性。
3) 视图:虚表,命名的查询语句。
4) 索引:加速查询(加快查询的速度)。
5) 序列:一串连续递增或递减的数字,步长相同,(代理键) 。
6) 同义词:一个对象的另外一个叫法(对象的别名)。
7) 存储过程:用于操作
8) 函数:用作复杂运算的。用于计算。
9) 触发器:由事件触发的存储过程。
对数据库的操作可以基本归结为对数据对象的操作,这个对象蛤蟆也不知道如何去定义它。对象也是一个逻辑结构,是建立于段之上的,有头有脸的结构。
1.2.5 表空间
表空间是一组数据文件,通常由相关的段组成。表空间是包含物理数据文件的逻辑实体。表空间存储数据库的所有可用数据。
下节中就能看到表空间和物理数据文件的对应关系。表空间也是一个逻辑结构是,数据库下最大的逻辑结构了。
数据库创建完后会有如下表空间
a) System表空间
b) Sysaux 表空间
c) 撤销Undo表空间
d) 临时temporary表空间
1.3 物理数据库结构
上节介绍了oracle数据库的逻辑结构,那么接下去必须得看下,逻辑结构和物理存储结构是如何对应的。
首先在通常情况下我们可以这样理解,ORAC LE数据库由表空间组成;所以和物理数据库结构相关的从表空间开始了。
先看如下图3:
从上图可以看出,逻辑结构比物理结构复杂了些许。
物理结构上就两个东西 操作系统块和文件。上节中提到数据库块是操作系统块的整数倍,从图中也能反映一二。
这里蛤蟆重点解释下ORACLE数据库中的文件。
1.4 数据文件
数据文件一般是数据库最大的物理存储部分,一个数据文件只能属于一个数据库。一个或者多个数据文件构成成为表空间的实体。
我们创建一个表空间时候,让他拥有一个2G大小的数据文件,那么该表空间就能存放2G大小的数据量,有一天耗尽了这2G,那么再增加一个数据文件给这个表空间,当然也可以扩大原先数据文件的大小。
注意:上篇提到了对象如索引、表等,虽然也是存在表空间所属的数据文件中,但是这些对象本身不会指定要存放在那个数据文件上,数据文件只与表空间关联。
数据库中执行如下查看数据文件所在
SQL&selectname from v$
1.5 控制文件
一看这个文件,蛤蟆就不禁感叹:如此之小,确如此重要啊。小身材,大作用。
这个控制文件,管理了数据库的状态,非常重要,一般管理员都会进行至少3份备份。
控制文件包含了数据文件和重做日志文件的名字、位置、日志序号、备份等详细信息,以及所有重要的SCN(系统更改号)。数据库在操作过程中进程不断的更新控制文件。
控制文件中的检查点信息使ORACLE能确定从联机重做日志文件中需要返回多少以便恢复数据。此外,在启动oracle实例时,通过控制文件,确定数据库操作必须打开的所有数据文件和重做日志文件。
你看,重要不?
查看控制文件所在
SQL&selectname from v$controlfile
1.6 日志文件
日志文件其实准确的是重做日志文件,记录了对数据库做的全部更改,有助于恢复数据库。如果日志文件写满后就会进行归档,归档的日志文件叫做归档重做日志,正在记录的日志文件叫做联机重做日志文件。
Oracle要求数据库至少两个重做日志组,每个至少一个单独的日志文件。在归档的时候当前日志组就不能用了,所以需要有第二个日志组来接上。这样循环,生生不息。
考虑到日志文件恢复数据库的作用,一般建议多路复用重做日志,把日志副本存放到不同的磁盘上,保证不会轻易丢失。
查看重做日志文件所在
SQL&select member from v$
1.7 其他文件
还有一些文件,蛤蟆先简单带过一下吧,后续咱们再深入之。
SPFILE,PFILE,密码文件,告警日志文件,跟踪文件,备份文件等。
SPFILE是oracle实例的初始化参数,这个文件是二进制文件无法手动编辑,我们可以通过命令从SPFILE来生成PFILE,PFILE可以支持手动编辑。下节中内存结构中的大小都可以在SPFILE或者PFILE中进行设定。
密码文件是授予SYSDBA或SYSOPER管理权限的数据库用户名字,和数据库安全相关,后续蛤蟆会和大伙一起捣鼓捣鼓。
告警日志文件,蛤蟆喜欢叫他alert日志。捕捉了oracle实例运行期间的主要更改和事件。包含日志切换、错误、告警和其他信息,也是数据库错问题时候,蛤蟆第一时间查看地方,大伙没事可以进去看看也。Alert日志文件路径:
$ORACLE_BASE/diag/rdbms/[SID]/trace/alert_[SID].log。
跟踪文件,Oracle各类内部结构中所包含的信息转储(dump)到跟踪文件中,以便用户能根据文件内容来解决各种故障。
备份文件,顾名思义,因为备份数据操作得到的文件。
2 内存结构
内存结构也是ORACLE数据库实例的组成部分。这个内存结构可以让用户之间共享可执行代码,可以将数据库更改写入内存区域等,让数据库性能提升好几个数量级。
一图胜过千言万语啊,一看就明白了数据库内存结构包括PGA和SGA,那么问题来了,具体呢?
SGA是实例中最重要的内存部件了,特别是在OLTP数据库系统中,比PGA要大很多。在数据仓库环境下,PGA可能就是更重要的ORACLE内存区域。
2.1.1 数据库缓冲区
保存从文件中读取的数据块副本,提高读取性能。
当然数据库缓冲区本身还可以细化成:可用缓冲区,脏缓冲区,钉住缓冲区。
缓冲区的主要目的是最小数据未命中率和磁盘IO操作。
可以将一个缓冲区分成多个缓冲区提供给不同的对象使用,也可以设置多个数据库块尺寸的缓存区(如4KB,8KB,16KB的)。
2.1.2 共享池
共享池是保持可执行PL/SQL代码和SQL语句,以及数据字典表的信息。其可以分为库高速缓存和字典高速缓存。
注:数据字典是ORACLE维护的一组关键表,包含了又关数据表、用户、权限等重要的元数据。
该池可以减少相同代码的编译,减少硬解析从而减少内存和CPU资源。
蛤蟆就知道了数据字典和库高速缓存的低命中率的解决方法是相同的,即增加共享池的尺寸。
2.1.3 重做日志缓冲区
我们待会回将日志写入进程,因为日志写入进程的刷新频率,该区大小不必太大,基本几M就搞定了。
为JVM何基于JAVA的应用保留。
2.1.5 大池
在使用并行查询时候才需要使用大池。此外使用RMAN和共享服务器配置也需要建议配置大池。
2.1.6 流池
实现在不同数据库之间和不同环境之间共享数据。
用户启动会话时为每个用户创建一个程序全局区。PGA保存ORACLE为用户创建的专用服务器进程的数据和控制信息。PGA是独占的不能共享,除非使用一个共享的服务器配置。
PGA可以存放用户的游标,不与其他用户共享,此外还会涉及一些排序类的内存密集型操作。
概念介绍大伙看看乐一乐好了,当前不需要太较真。
进程是Oracle数据库实例的一部分,我们说过oracle数据库实例由内存结构和进程组成。
Oracle进程其实可以分为两种,一种是用户进程,用于连接用户和数据库;另一种是oracle进程,用于执行数据库的所有实际操作(读写数据文件,写日志等)。这里蛤蟆来聊聊最主要的几个后台进程,其他的进程咱有机会再说。
进程是什么呢?这个蛤蟆就不说了哈
咱们直接进入正题,如下进程都可以在安装ORACLE数据的系统中执行
#ps &ef | grep ora_
3.1 数据写进程 (DBWR)
这个进程的作用是将在内存中的数据写入到磁盘中,使得对数据库的修改持久化。因为考虑到性能问题,并不是对数据库的所有修改多会直接写磁盘,而是保留在内存中,等时机成熟才进行批量刷入到磁盘中,这对性能提升还是大大的。
这个时机就是如下三种情况:
a) 数据库发布检查点
b) 内存缓冲区没有可用空间
以上3点,任何一点满足即可。
考虑到有些系统每次刷入的数据量较大,ORACLE就支持多个进程一起写。通过在DB_WIRTER_PROCESSES参数在PFILE中设定,前提是系统支持异步IO,不然不如只用一个写进程。
3.2 日志写进程 (LGWR)
类似数据写进程,将重做日志在内存中的缓存写入到磁盘中。这个写特点是100%顺序写。如果日志文件不能被写入,那么数据库就会停止工作了,当然这种情况极小发生。毕竟好端端的怎么会突然不能被写入了呢。
日志写也是有时机的类似数据写进程,这进程有四个机会点了
b) 缓存区到三分之一
c) 数据写进程触发(先完成日志写进程,方进行数据写进程,针对这个有个写前协议)
d) 事务提交,将提交记录写到重做日志
注意:重做日志文件可能包含提交以及未提交的事务记录。
3.3 系统监控进程 (SMON)
这是系统监控进程了,并非一直工作,周期性巡检。主要处理
a) 实例崩溃重启后,是否一致
b) 合并可用区(我们说过区是相邻的数据块嘛)
c) 清除不必要的临时段
3.4 进程监控进程 (PMON)
这个进程用于清除失败的用户进程,保证数据库释放死进程占用的资源。这个进程和SMON一样,一般是处于不活动的,但是会周期性的进行巡检,类似魔兽世界中猪头监工,不干活,周期性的走走,看看谁在偷懒,偷懒的它就动手。
如果可以蛤蟆也希望变成PMON,SMON,他们两兄弟干活真实轻松啊,一看就是领导。
3.5 检查点进程 (CKPT)
通知数据库写进程,这个还会触发日志写进程的。该进程的作用是同步缓存区高速缓存信息与数据库磁盘上的信息。
该进程具体是做了如下4个事情:
a) 日志缓冲写到日志文件
b) 检查点记录写入日志文件
c) 刷数据缓存到磁盘中
d) 更新数据文件和控制文件的头
3.6 归档进程 (ARCn)
这个进程在系统以归档方式运行时才有,负责将填满的日志文件归档。就是将联机日志文件的内容生成一个归档日志文档。如果需要,可以同时设置多个进行进行归档操作。
这个进程在切换日志的时候开始干活。
如果我们在非归档模式运行,那么压根就没有这个进程了,不过生产系统必须以归档模式运行,不然后果不堪设想,蛤蟆自己玩的系统崩溃也没事的哈哈。
其他进程在此就不啰嗦了,后续自然会涉及。这篇到此结束~如果大伙感兴趣就看下回笔记。

我要回帖

更多关于 进程的内存结构 的文章

 

随机推荐