非计算内存和计算内存的概念
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通俗的说法:
凡是硬盘上有对应的数据,占用的内存,就是非计算内存,非计算内存需要被别的进程用到时,其中的数据无需
page out,因为再次需要读取的时候从硬盘文件中拿出来即可。
凡是硬盘上没有数据对应的内存占用叫做计算内存,例如用C写个程序,分配一块1MB的内存,这部分内存不管其中
数据是否有意义,硬盘上没有文件对应,叫做计算内存。
以上所谓“硬盘上有无对应数据”的前提是:计算内存、非计算内存是操作系统的分类,所以操作系统知道硬盘上
有对应,才叫非计算内存。虽然任何数据库的内存占用绝大部分是磁盘缓冲,按理说其中的数据硬盘上有对应,但
是,这些内存是数据库管理的,操作系统只知道这些内存是DBMS主动向操作系统申请的,其中放的什么,操作系统
并不知道,所以是计算内存
breakdown:
计算内存、非计算内存都是指物理内存占用,而物理内存的情况,由于VMM机制,是时刻在变化的,所以只能说某
一瞬间,计算内存、非计算内存各占用多少。
●计算内存:
凡是进程/程序运行中用程序代码向操作系统申请的内存,全部是计算内存,也就是说除非这个程序运行起来,除
了自身代码占用的内存,一点额外的内存也不用,否则它几乎必然会造成计算内存占用的。说“几乎”,是因为计
算内存、非计算内存都是指物理内存,如果一个程序申请了1MB内存,但一段时间没有用这部分内存,很可能在其
他进程需要内存,且物理内存比较紧张时,按照LRU算法(Latest Recently Unused,最近最少使用),被操作系
统部分或全部page out到paging space中,如果全部被page out了,可以说这个时刻,此进程没有使用计算内存。
换句话说,就是程序申请了1MB内存,那么它在某一时刻占用的计算内存从0字节~1MB都有可能。
进程主动向操作系统申请分配的内存,从程序编码上来看,以C为例,典型的就是malloc,当然,还有程序语言中
的隐式分配,反正对于操作系统来说都一样,例如char *string1="ABCDEFG"; int number=22222; 前者会导致自
动向操作系统申请8个字节,后一个会申请一个字(两个字节)
当进程退出,或者意外崩溃,对于操作系统来说,它知道进程不在了,而进程申请的内存,
第 1 页
操作系统明确知道是哪
些的,在资源回收的过程中,会自动把这个进程申请的内存释放掉,这个过程是很快的。所以我们可以看到:如果
计算内存高企,我们把应用一停,也就是把使用计算内存最多的进程停止,计算内存占用率立刻就下来了。
●非计算内存:
操作系统明确知道这部分内存的用途是放硬盘对应数据的,所以,显然这部分内存不是任何进程可以控制,也就是
说不可能一个程序主动要求分配多少非计算内存或者释放多少。这部分完全是操作系统在直接管理:分配、记录状
态、使用、释放,其他进程只可能用间接手段影响非计算内存,例如读写文件。
非计算内存我们常见的是如下用途:
——程序代码:当运行程序时,代码初始装入到物理内存的什么地方、重定位到什么地方,是操作系统管理的,它
会记住程序代码放在物理内存什么地方,及其对应程序文件的位置。当程序代码占用的page frame需要被其他用途
使用时,操作系统直接把这个page frame转给要使用这部分内存的进程,并记录标志,下次要是这个page原来的内
容需要被引用,从对应程序文件中的对应位置读取进入物理内存。有些进程的某些计算内存占用是不能被替换的,
例如执行VMM管理任务的操作系统核心进程,所以这部分会有操作系统机制设置标志,这个就是常说的pin住某些内
存不准替换掉。
——磁盘访问缓冲区:这个不是常说的缓存区,缓存区(英文Cache)的目的是用来提高性能,而缓冲区(英文
Buffer),是为了块设备访问特点的要求,比如硬盘块设备、逻辑卷块设备,必须读写的基本单位是一个块,一般
是512字节,哪怕你只读写一个字节,也必须一次读进512字节,修改特定的那一个字节,然后再整个512字节块全
部写出到硬盘。这就需要缓冲区的存在。缓冲区的总个数,是不固定的,操作系统可以根据同时在访问的块的数量
随时调整。
——NFS访问缓冲区,原理基本同上;
——文件系统缓存:这个肯定是每一个字节都有硬盘文件对应的,显然是非计算内存。
第 2 页