操作系统与Oracle内存管理比较

2021-09-09 07:36王润中
现代计算机 2021年19期
关键词:内核进程内存

王润中

(Gina Code School of Engineering and Computer Science, Concordia University,Canada)

0 引言

最初我们接触操作系统时,我们了解到的操作系统是管理计算机硬件与软件资源的计算机程序,具有五大管理功能,其中之一就是存储管理,之二就是进程管理,但是随着Oracle的微机版的出现,从披露出来不多的内存和进程管理和在操作系统上所安装的Oracle、其对内存的占用达到80%的情况,以及以数据特征进行存储的方式上看,我们有必要探索操作系统与Oracle内存管理和进程管理并对其主要特性进行比较。

1 操作系统的内存管理

整个操作系统内核可以大致分成三个模块,其中内存管理和进程管理分别对内存和CPU进行分配和调度,如图1所示。内存是CPU直接存放处理数据的地方,是CPU与外部设备交换数据的地方,同时也是所有计算机程序的运行之所在。

1.1 进程管理

对操作系统而言,当要进行数据处理时需要将相应的程序调入到内存中运行,此时系统要进行资源分配和调度,于是进程便成为这样一个基本单位,负责程序及相关数据集合的一次运行活动,具有独立运行、独立分配资源、独立接受调度的特点,如图2所示。

图1 内存管理与进程管理

图2 进程的内容结构

操作系统管理着许多的进程,许多的进程由进程管理统一调度,包括创建与终止以及释放所占资源,通过对进程的管理可以有效地提高CPU的利用率。每一个进程由进程控制模块(PCB)、程序和数据集合组成。所有进程都必须占用一定数量的内存,内核的运行也是需要操作内存,而每个进程又要保持独立性,这就需要虚拟内存来实现,每个进程有自己的虚拟内存,通过进程控制块,按照时间片的方式,进程轮流执行,只有轮询到自己的时候,才对应由物理内存来使用,其他时间就等待。

1.2 内存管理

一般我们叙述的存储管理方案主要包括分区存储管理、分页存储管理、分段存储管理、段页式存储管理以及虚拟存储管理。分段就是将一个程序分成代码段,数据段,堆栈段等,分页存储管理则是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页,并为各页加以编号,而分段分页就是将这些段,例如代码段分成均匀的小块,图3所示,通过段表和页表,页内偏移找到程序的物理地址。分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。分页的作业地址空间是维一的,即单一的线性空间,程序员只须利用一个记忆符,即可表示一地址。现代的大多数计算机系统,都支持非常大的逻辑地址空间(232~264)。在这样的环境下,页表就变得非常大,要占用相当大的内存空间。如此复杂的存储管理已经成为阻碍网络存储广泛应用的一个重要原因。

图3 段页式存储管理

2 Oracle的内存结构和进程结构

很多的书籍和文章中都直接给出了如图4所示的Oracle的内存和进程结构图,这张图展示的Oracle内存结构包含一系列组件,用户进程、服务进程等。当客户端向服务器发送连接请求时,服务器在监听到客户端要求后,生成一个Server Process来代理用户的请求,然后向服务器进程实例发起连接,创建会话,此时PGA(程序全局区)分配内存,在这个过程中,一个进程一个PGA。

当用户进程执行一个查询语句时,用户进程先将信息存储到UGA(用户全局区)中,语句本身被解析为

图4 Oracle内存和进程结构图

ASCII码,生成hash_value,在PGA中匹配,进行快速解析,然后传递给实例,在SGA(系统全局区)的共享池中处理这条语句,在数据缓冲区中判断是否有所需要的块,如果没有从磁盘读入,然后undo缓存块会对该块做镜像,读镜像中的数据得到行的结果返回给用户,用户看到执行的结果。无论在自动内存管理模式还是手动内存管理模式,Oracle通常都会将内存的70%-80%分配给SGA,而PGA仅达到20%。

Oracle给出的不仅是清晰的内存管理与操作的功能视图,也是将存放在内存的各种处理要求不同的数据与其操作的相应进程的逻辑图,这对内存的管理比传统方式的操作系统更为有效,进而Oracle也有了自动内存管理模式。其次,PGA是将用户的请求分解为公有和私有部分,对于数据的请求全部放在SGA中,这种公私分离的模式提高了内存的使用效率,这使得即便在PC上,其查询的能力也能达到TB的数量级。

3 操作系统与Oracle内存管理比较

3.1 操作系统与Oracle相似比较

首先相似的地方是在内存的分配上,无论操作系统还是Oracle均是通过功能相似的进程分配内存的。在操作系统在启动时,例如Linux,需要加载内核映像到内存中,内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。必须先启动例程实现少量硬件设置后,对内核映像中包含的内核进行解压缩,然后将其放入高端内存中。

分配内存的时候,系统先是安排内核内存空间,这里存放各个内核进程工作的数据和系统日志数据,然后系统为用户分配用以存放用户进程的内存。无论是内核进程,还是用户进程,Linux对内存的分配都是基于进程的。

当启动Oracle一个数据实例时,Oracle数据库系统会启动多个后台进程,这些后台进程负责不同的工作,都需要一定的内存存放工作时的永久数据和临时数据,用以完成数据库数据文件、日志文件、参数文件等的读写操作。

当客户端请求连接Oracle数据库,Oracle数据库也会动态产生一个服务器进程为该客户端服务,客户要对数据库的各种操作,包括查增删改、事务提交回滚等,均委派相应的服务器进程统一处理。每一次客户端与服务器的连接,均包括多个会话,而每次会话,系统都会分配不同的会话内存空间,用于存放不同会话的不同数据。无论是后台进程,还是服务进程,Oracle对内存的分配都是基于进程的。

补充一点,对于不同的会话,无论操作系统和还是Oracle都是基于用户的。用户是根据所获取权限,对操作系统或数据库资源对象进行不同级别的使用和处理,更好地维护了数据的安全。

3.2 操作系统与Oracle不同之处

操作系统与Oracle不同的地方,突出的是操作系统通常使用的虚拟内存管理Oracle是没有的。例如在Linux中,每个用户进程都可以有4GB的虚拟空间,为了更好地管理这部分虚拟空间,Linux定义了虚拟段,虚拟段是某个进程的一段连续的虚拟空间,一个进程通常占用几个虚拟段。虚拟段不仅代表一段内存区间,也可以对应于一个文件、共享内存或者对换设备。由于几乎所有的操作系统都支持虚拟内存,不可避免的是操作系统将Oracle的SGA整个作为虚拟内存。

其次,内存区域是否共享是操作系统与Oracle的重要区别,操作系统中并不存在一个系统全局内存区供内核进程和用户进程共享,相反,操作系统中的进程在内存区域上是相对独立的,不同的进程维护不同的内存区。在Oracle中存在SGA,为系统分配着一组共享的内存结构,包含一个数据库实例的数据和控制信息。在一个数据实例中,可以有多个后台进程和服务器进程共享系统全局区中的数据;此外,Oracle不仅仅有共享的内存,而且也有PGA,跟操作系统进程一样,该内存区是专门为某以Oracle服务器进程或者后台进程服务的。

第三,Oracle从Oracle 9i开始引入自动内存管理ASMM支持动态SGA特性,使得Oracle内存管理更加灵活多样,通过组合有5种内存管理形式,即自动内存管理,自动共享内存管理,手工共享内存管理,自动PGA(Program Global Area)管理以及手动PGA管理方式。单击“自动内存管理”禁用按钮,并选择“启用自动共享内存管理”,DBA可不再通过手工设置shared pool、buffer pool、db_cache_size等若干内存池的大小的情况下,数据库自动完成并达到各SGA组件的最佳内存配置分配方式。

4 结语

传统的概念上讲,存储管理和进程管理是操作系统的五个职能中的两个,但从Oracle上我们直接看到的在上述两个区域Oracle同样执行这样的功能,比起一级一级的页表进行繁琐的寻址,Oracle给出了清晰的内存管理与操作的功能视图,便于程序员编写代码;其次Oracle将用户的请求分解为公有和私有部分,且大部分的共享数据的请求全部放在占有大多内存的SGA中,这种公私分离的模式提高了内存的使用效率;第三,Oracle的ASMM内存管理可以智能化分配SGA组件的内存。最后,Oracle的整个SGA直接映射为操作系统将虚拟内存,独到之处体现了其在操作系统下的类似自治管理方式的优势,值得借鉴。

猜你喜欢
内核进程内存
人民情怀:柳青为文为人的内核(评论)
初春
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
Dalvik虚拟机进程模型研究
“春夏秋冬”的内存
微软发布新Edge浏览器预览版下载换装Chrome内核
快速杀掉顽固进程
不留死角 全方位监控系统
中外民主法制进程专题复习
内存搭配DDR4、DDR3L还是DDR3?