非计算内存和计算内存的概念[zz]
2012-12-01 12:20
183 查看
非计算内存和计算内存的概念[zz]
标签: 计算 内存 3秒前看到有XD发帖说这个问题,我也想详细给大家一个说明,请各位老手新手指教。
通俗的说法:
凡是硬盘上有对应的数据,占用的内存,就是非计算内存,非计算内存需要被别的进程用到时,其中的数据无需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个字节,后一个会申请一个字(两个字节)
当进程退出,或者意外崩溃,对于操作系统来说,它知道进程不在了,而进程申请的内存,操作系统明确知道是哪些的,在资源回收的过程中,会自动把这个进程申请的内存释放掉,这个过程是很快的。所以我们可以看到:如果计算内存高企,我们把应用一停,也就是把使用计算内存最多的进程停止,计算内存占用率立刻就下来了。
●非计算内存:
操作系统明确知道这部分内存的用途是放硬盘对应数据的,所以,显然这部分内存不是任何进程可以控制,也就是说不可能一个程序主动要求分配多少非计算内存或者释放多少。这部分完全是操作系统在直接管理:分配、记录状态、使用、释放,其他进程只可能用间接手段影响非计算内存,例如读写文件。
非计算内存我们常见的是如下用途:
——程序代码:当运行程序时,代码初始装入到物理内存的什么地方、重定位到什么地方,是操作系统管理的,它会记住程序代码放在物理内存什么地方,及其对应程序文件的位置。当程序代码占用的page frame需要被其他用途使用时,操作系统直接把这个page
frame转给要使用这部分内存的进程,并记录标志,下次要是这个page原来的内容需要被引用,从对应程序文件中的对应位置读取进入物理内存。有些进程的某些计算内存占用是不能被替换的,例如执行VMM管理任务的操作系统核心进程,所以这部分会有操作系统机制设置标志,这个就是常说的pin住某些内存不准替换掉。
——磁盘访问缓冲区:这个不是常说的缓存区,缓存区(英文Cache)的目的是用来提高性能,而缓冲区(英文Buffer),是为了块设备访问特点的要求,比如硬盘块设备、逻辑卷块设备,必须读写的基本单位是一个块,一般是512字节,哪怕你只读写一个字节,也必须一次读进512字节,修改特定的那一个字节,然后再整个512字节块全部写出到硬盘。这就需要缓冲区的存在。缓冲区的总个数,是不固定的,操作系统可以根据同时在访问的块的数量随时调整。
——NFS访问缓冲区,原理基本同上;
——文件系统缓存:这个肯定是每一个字节都有硬盘文件对应的,显然是非计算内存。
相关文章推荐
- 可取性、适用性、可行性:内存计算技术的影响[zz]
- zz 计算java内存使用
- zz 计算java内存使用
- 彻底理解内存概念(zz)
- 非计算内存和计算内存的概念
- Spark的误解-不仅spark是内存计算,hadoop也是内存计算
- cpu,io密集型计算概念
- AIX 与oracle优化(非计算内存与计算内存)
- java对象的内存布局(一):计算java对象占用的内存空间以及java object layout工具的使用
- 云计算基本概念
- 如何计算C++类占用内存大小
- 云计算基础知识-1. 云计算相关概念
- java 基础概念 -- 数组与内存控制
- 协方差矩阵的概念及matlab计算
- RDD:基于内存的集群计算容错抽象
- Android中图片占用内存的计算
- [zz]浅析C++多线程内存模型
- Spark RDDs(弹性分布式数据集):为内存中的集群计算设计的容错抽象
- C++类所占内存大小计算
- 计算Linux系统和进程和线程的CPU及内存使用率(c++源码)