【转】 物理内存和线性空间

原地址:http://blog.csdn.net/newjerryj/article/details/4616819

在硬件工程师和普通用户看来,内存就是插在或固化在主板上的内存条,它们有一定的容量——比如64 MB。但在应用程序员眼中,并不过度关心插在主板上的内存容量,而是他们可以使用的内存空间——他们可以开发一个需要占用1 GB内存的程序,并让其在OS平台上运行,哪怕这台运行主机上只有128 MB的物理内存条。而对于OS开发者而言,则是介于二者之间,他们既需要知道物理内存的细节,也需要提供一套机制,为应用程序员提供另一个内存空间,这个内存空间的大小可以和实际的物理内存大小之间没有任何关系。 
   
  我们将主板上的物理内存条所提供的内存空间定义为物理内存空间;将应用程序员看到的内存空间定义为线性空间。物理内存空间大小在不同的主机上可以是不一样的,随着主板上所插的物理内存条的容量不同而不同;但为应用程序员提供的线性空间却是固定的,不会随物理内存的变化而变化,这样才能保证应用程序的可移植性。尽管物理内存的大小可以影响应用程序运行的性能,并且很多情况下对物理内存的大小有一个最低要求,但这些因素只是为了让一个OS可以正常的运行。 
   
  线性空间的大小在32-bit平台上为4 GB的固定大小,对于每个进程都是这样(一个应用可以是多进程的,在OS眼中,是以进程为单位的)。也就是说线性空间不是进程共享的,而是进程隔离的,每个进程都有相同大小的4 GB线性空间。一个进程对于某一个内存地址的访问,与其它进程对于同一内存地址的访问绝不冲突。比如,一个进程读取线性空间地址1234ABCDh可以读出整数8,而另外一个进程读取线性空间地址1234ABCDh可以读出整数20,这取决于进程自身的逻辑。 
   
  在任意一个时刻,在一个CPU上只有一个进程在运行。所以对于此CPU来讲,在这一时刻,整个系统只存在一个线性空间,这个线性空间是面向此进程的。当进程发生切换的时候,线性空间也随着切换。所以结论就是每个进程都有自己的线性空间,只有此进程运行的时候,其线性空间才被运行它的CPU所知。在其它时刻,其线性空间对于CPU来说,是不可知的。所以尽管每个进程都可以有4 GB的线性空间,但在CPU眼中,只有一个线性空间的存在。线性空间的变化,随着进程切换而变化。 
   
  尽管线性空间的大小和物理内存的大小之间没有任何关系,但使用线性空间的应用程序最终还是要运行在物理内存中。应用所给出的任何线性地址最终必须被转化为物理地址,才能够真正的访问物理内存。所以,线性内存空间必须被映射到物理内存空间中,这个映射关系需要通过使用硬件体系结构所规定的数据结构来建立。我们不妨先称其为映射表。一个映射表的内容就是某个线性内存空间和物理内存空间之间的映射关系。OS Kernel一旦告诉某个CPU一个映射表的位置,那么这个CPU需要去访问一个线性空间地址时,就根据这张映射表的内容,将这个线性空间地址转化为物理空间地址,并将此物理地址送到地址线,毕竟地址线只知道物理地址。 
   
  所以,我们很容易得出一个结论,如果我们给出不同的映射表,那么CPU将某一线性空间地址转化的物理地址也会不同。所以我们为每一个进程都建立一张映射表,将每个进程的线性空间根据自己的需要映射到物理空间上。既然某一时刻在某一CPU上只能有一个应用在运行,那么当任务发生切换的时候,将映射表也更换为响应的映射表就可以实现每个进程都有自己的线性空间而互不影响。所以,在任意时刻,对于一个CPU来说,也只需要有一张映射表,以实现当前进程的线性空间到物理空间的转化。 
   
  -------------------------------------------------------------------------------- 
   
   
   
  2. OS Kernel Space & Process Space 
   
   
  由于OS Kernel在任意时刻都必须存在于内存中,而进程却可以切换,所以在任意时刻,内存中都存在两部分,OS Kernel和用户进程。而在任意时刻,对于一个CPU来说只存在一个线性空间,所以这个线性空间必须被分成两部分,一部分供OS Kernel使用,另一部分供用户进程使用。既然OS Kernel在任何时候都占用线性空间中的一部分,那么对于所有进程的线性空间而言,它们为OS Kernel所留出的线性空间可以是完全相同的,也就是说,它们各自的映射表中,也分为两部分,一部分是进程私有映射部分,对于OS Kernel映射部分的内容则完全相同。 
   
  从这个意义上来说,我们可以认为,对于所有的进程而言,它们共享OS Kernel所占用的线性空间部分,而每个进程又各自有自己私有的线性空间部分。假如,我们将任意一个4 GB线性空间分割为1 GB的OS Kernel空间部分和3 GB的进程空间部分,那么所有进程的4 GB线性空间中1 GB的OS Kernel空间是共享的,而剩余的3 GB进程空间部分则是各个进程私有的。Linux就是这么做的,而Windows NT则是让OS Kernel和进程各使用2 GB线性空间。 
   
  -------------------------------------------------------------------------------- 
   
   
   
  3. Segment Mapping & Page Mapping 
   
   
  所有的线性空间的内容只有被放置到物理内存中才能够被真正的运行和操作。所以,尽管OS Kernel和进程都被放在线性空间中,但它们最终必须被放置到物理内存中。所以OS Kernel和所有的进程都最终共享物理内存。在现阶段,物理内存远没有线性空间那么大——线性空间是4 GB,而物理内存空间往往只有几百兆,甚至更小。另外即使物理内存有4 GB,但由于每个进程都可以有3 GB线性空间(假如进程私有线性空间是3 GB的话),如果把所有进程的线性空间内容都放在物理内存中,明显是不现实的。所以OS Kernel必须将某些进程暂时用不到的数据或代码放在物理内存之外,将有限的内存提供给当前最需要的进程。另外,由于OS Kernel在任何时候都有可能运行,所以OS Kernel最好被永远放在物理内存中。我们仅仅将进程数据进行换入换出。 
   
  从线性空间到物理空间的映射需要映射表,映射表的内容是将某段线性空间映射到相同大小的物理内存空间上。从理论上,我们可以使用两种映射方法:变长映射,和定长映射。变长映射指的是根据不同的需要,将一个一个变长段映射到物理内存上,其格式可以如下(线性空间段起始地址,物理空间段起始地址,段长度)。假如一个进程有3个段:10M的数据段,5M的代码段,和8K的堆栈段,那么就可以在映射表中建立3项内容,每一项针对一个段。这看起来没有问题。但假如现在我们的实际的内存只有32M,其中10M被内核占用,留给进程的物理空间只有22M,那么此进程在运行时,就占据了10M+5M+8K的内存空间。随后当进程发生切换时,假如另一个进程和其有相同的内存要求,那么剩余的22M-(10M+5M+8K)明显就不够用了,这时只能将原进程的某些段换出,并且必须是整段的换出。这就意味着我们必须至少换出一个10M的数据段,而换出的成本很高,因为我们必须将这10M的内容拷贝到磁盘上,磁盘I/O是很慢的。 
   
  所以,使用变长的段映射的结果就是一个段要么被全部换入,要么被全部换出。但在现实中,一个程序中并非所有的代码和数据都能够被经常访问,往往被经常访问的只占全部代码数据的一部分,甚至是一小部分。所以更有效的策略是我们最好只换出那些并不经常使用的部分,而保留那些经常被使用的部分。而不是整个段的换入换出。这样可以避免大块的慢速磁盘操作。 
   
  这就是定长映射策略,我们将内存空间分割为一个个定长块,每个定长块被称为一个页。映射表的基本格式为(物理空间页起始地址),由于页是定长的,所以不需要指出它的长度,另外,我们不需要在映射表中指定线性地址,我们可以将线性地址作为索引,到映射表中检索出相应的物理地址。当使用页时,其策略为:当换出的时候,我们只将那些不活跃的,也就是不经常使用的页换出,而保留那些活跃的页。在换入的时候,只有被请求访问的页才被换入,没有被请求访问的页将永远不会被换入到物理内存。这就是请求页(Demand Page)算法的核心思想。 
   
  这就引出一个页大小的问题:首先我们不可能以字节为单位,这样映射表的大小和线性空间大小相同——假如整个线性空间都被映射的话——我们不可能将全部线性空间用作存放这个映射表。由此,我们也可以得知,页越小,则映射表的容量越大。而我们不能让映射表占用太多的空间。但如果页太大,则面临着和不定长段映射同样的问题,每次换出一个页,都需要大量的磁盘操作。另外,由于为一个进程分配内存的最小单位是页,假如我们的页大小为4 MB,那么即使一个进程只需要使用4 KB的内存,也不得不占用整个4 MB页,这明显是一种很大的浪费。所以我们必须在两者之间进行折衷,一般平台所规定的页大小为1 KB到8 KB,IA-32所规定的页大小为4 KB。(IA-32也支持4 MB页,你可以根据你的OS的用途进行选择,一般都是使用4 KB页)。

【转】 物理内存和线性空间

时间: 2024-10-11 20:09:04

【转】 物理内存和线性空间的相关文章

kvm宿主机物理内存预留方案

正常一个kvm虚拟机的管理内存大约为1.2GB左右,正常不会超过2GB 标准虚机机可用内存计算方法: 宿主机物理内存 - 系统保留内存4GB - N个虚拟机物理内存 - (N个虚拟机 * 2GB虚拟机管理内存) 可能存在的内存浪费: 系统正常内存使用量为:2.5GB,空闲1.5GB 虚拟机管理内存通常为:1.2GB,空闲0.8GB 虚拟机内部业务未使用的物理内存:大小不定   (通常不能复用) 避免内存浪费方法: 增加虚拟内存,使用swap分区. swap分区大小如何设置? 正常大小应该设置为可

高维度下的数据科学—线性空间(上)

使得集合Y的元素和集合X的元素相对应起来的规则f. 广义的概念: 电影票也是一种映射,发工资也是一种映射,男女朋友也是映射.只要有对应关系,我么就可以认为是映射.映射这个概念就是发明用来对自然界和社会上对应关系的一种抽象. 非常需要注意的是:一定要记住:映射的概念是非常广泛的一个概念,任何两种有关系的事物都可以用映射的概念进行描述,比如张三映射到高三一班,高纬度向量映射到低维度空间. 映射与线性空间的概念对于数据科学来说至关重要,因为现实世界的数据总是包含着许许多多的维度.因此线性空间这个数学工

linux物理内存管理

1.为什么需要连续的物理内存: Linux内核管理物理内存是通过分页机制实现的,它将整个内存划分成无数个4k(在i386体系结构中)大小的页,从而分配和回收内存的基本单位便是内存页了.利用分页管理有助于灵活分配内存地址,因为分配时不必要求必须有大块的连续内存[3],系统可以东一页.西一页的凑出所需要的内存供进程使用.虽然如此,但是实际上系统使用内存时还是倾向于分配连续的内存块,因为分配连续内存时,页表不需要更改,因此能降低TLB的刷新率(频繁刷新会在很大程度上降低访问速度). 1.物理内存页和p

运行hadoop的时候提示物理内存或虚拟内存溢出的解决方案running beyond physical memory或者beyond vitual memory limits

当运行中出现Container is running beyond physical memory这个问题出现主要是因为物理内存不足导致的,在执行mapreduce的时候,每个map和reduce都有自己分配到内存的最大值,当map函数需要的内存大于这个值就会报这个错误,解决方法: 在mapreduc-site.xml配置里面设置mapreduce的内存分配大小 <property> <name>mapreduce.map.memory.mb</name> <va

Linux系统下如何查看物理内存占用率

Linux系统下如何查看物理内存占用率 Linux下看内存和CPU使用率一般都用top命令,但是实际在用的时候,用top查看出来的内存占用率都非常高,如:Mem:   4086496k total, 4034428k used,    52068k free,   112620k buffersSwap: 4192956k total,   799952k used, 3393004k free, 1831700k cached 接近98.7%,而实际上的应用程序占用的内存往往并没这么多, PI

跟我一起写操作系统(五)——分配物理内存

转载注明出处:http://www.cnblogs.com/lucasysfeng/p/4847662.html 上一讲地址:http://www.cnblogs.com/lucasysfeng/p/5059767.html 项目地址:https://github.com/lucasysfeng/lucasOS 上一讲我们获取到了物理内存,本讲我们来看如何分配物理内存.为简化问题,我们不使用伙伴内存分配算法,而是把可用内存按页存入栈中,每次分配从栈中取就可以了. 本讲的主要代码在lib/pmm.

[转载]Windows下的分页模式- 页目录和页表从物理内存到虚拟映射求值

标 题: [原创]Windows下的分页模式-  页目录和页表从物理内存到虚拟映射求值 作 者: hrpirip 时 间: 2012-12-06,12:45:36 链 接: http://bbs.pediy.com/showthread.php?t=159554 昨天在网上看到一段代码令大为不解,大家都知道一个虚拟地址到物理地址的转换伪公式为:*(*(*PD[(VirtualAddress>>22)] & FFFFF000) [(VirtualAddress & 3FF000)

windows server 2008 R2 x64 服务器系统升级-解决服务器物理内存不能完全使用问题。

windows server 2008 R2 物理内存限额 版本 限额 windows server 2008 R2 Datacenter 2TB windows server 2008 R2 Enterprise 2TB windows server 2008 R2 for Itanium-Based Systems   windows server 2008 R2 Foundation 8GB windows server 2008 R2 Standard 32GB windows HPC

[PeterDLax著泛函分析习题参考解答]第5章 赋范线性空间

1. (a) 证明 (6) 定义了范数. (b) 证明他们在 (5) 式移一下是等价的. 证明: $$\bex |(z,u)|'\leq |(z,u)|\leq 2|(z,u)|',\quad |(z,u)|''\leq |(z,u)|\leq \sqrt{2}|(z,u)|''. \eex$$ 2. 证明定理 2. 证明: 对 $y_1,y_2\in \bar Y$, $$\bex \exists\ Y\ni y_{1n}\to y_1,\quad Y\ni y_{2n}\to y_2, \e