统全局区(SGA)
Oracle有一个很大的内存块,称为系统全局区(SGA),在这里它会做以下工作:
q 维护所有进程需要访问的多种内部数据结构;
q 缓存磁盘上的数据,另外重做数据写至磁盘之前先在这里缓存;
q 保存已解析的SQL计划;
q 等等。
Oracle有一组“附加到”SGA的进程,附加机制因操作系统而异。在UNIX环境中,这些进程会物理地附加到一个很大的共享内存段,这是操作系统中分配的一个内存块,可以由多个进程并发地访问(通常要使用shmget()和shmat())。
在Windows中,这些进程只是使用C调用(malloc())来分配内存,因为它们实际上是一个大进程中的线程,所以会共享相同的虚拟内存空间。Oracle还有一组供数据库进程/线程读写的文件(只允许Oracle进程读写这些文件)。这些文件保存了所有的表数据、索引、临时空间、重做日志等。
如果在一个UNIX系统上启动Oracle,并执行ps命令,会看到运行着许多物理进程,还会显示出这些进程的名字。在前面的例子中,我们已经观察到了pmon、smon以及其他一些进程。我会在第5章逐一介绍这些进程,现在只要知道它们通称为Oracle后台进程(background process)就足够了。这些后台进程是构成实例的持久性进程,从启动实例开始,这些进程会一直运行,直至实例关闭。
有一点要注意,这些都是进程,而不是单个的程序。UNIX上只有一个Oracle二进制可执行文件;根据启动时所提供的选项,这个可执行文件会有多种不同的“个性”。执行ora_pmon_ora10g进程要运行这个二进制可执行文件,执行ora_ckpt_ora10g进程时运行的可执行文件仍是它。二进制可执行文件只有一个,就是oracle,只是会以不同的名字执行多次。