0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

内存就是插在或固化在主板上的内存条吗?程序空间还有什么理解?

GReq_mcu168 来源:未知 作者:易水寒 2018-07-17 17:35 次阅读

硬件工程师和普通用户看来,内存就是插在或固化在主板上的内存条,它们有一定的容量——比如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页)。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    8

    文章

    2996

    浏览量

    73867
  • OS
    OS
    +关注

    关注

    0

    文章

    91

    浏览量

    34727
  • 内存条
    +关注

    关注

    0

    文章

    143

    浏览量

    19498

原文标题:硬件工程师对于程序空间的理解

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    DDR内存条对比分析

    DDR内存条经历了DDR内存条、DDR2内存条、DDR3内存条三个时代。这里给出了DDR内存条、DDR2
    发表于 12-29 14:21 3507次阅读

    主板内存条出了问题,电脑会什么反应

    问题(不要用酒精等清洗),还有就是内存损坏主板内存槽有问题也会造成此类故障。 由于
    发表于 05-22 09:03

    内存条维修DIY

    的修理办法是:  一、用程序报错的地址推算出损坏的芯片,更换单个的芯片,这种方法可以使它完全恢复。手工焊接并非不可能,水货内存条都是在手工作坊内生产的。  二、去掉外围电路的元件割断金手指的连线,使
    发表于 01-05 16:50

    内存条维修技巧

    没有完全插入插槽,也或许是带电拔插内存条,造成内存条的金手指因为局部大电流放电而烧毁。   只有极少数内存条正常使用过程中,因为意外过压
    发表于 01-05 16:55

    内存条是如何诞生的?内存条容量是怎样变化的?

    内存条是如何诞生的?内存条容量是怎样变化的?DDR4还是很年轻?还有发展空间吗?
    发表于 06-18 07:24

    主板支持内存的最大容量

    主板支持内存的最大容量 主板所能支持内存的最大容量是指最大能在该主板插入多大容量的
    发表于 12-24 14:59 1858次阅读

    FPGA对DDRSDRAM内存条的控制

    首先介绍了内存条的工作原理,内存条电路设计的注意事项,以及如何使用FPGA实现对DDR内存条的控制,最后给出控制的仿真波形。 1 内存条的工作原理   
    发表于 06-29 15:37 2511次阅读
    FPGA对DDRSDRAM<b class='flag-5'>内存条</b>的控制

    对物理内存空间与线性空间了解

    硬件工程师和普通用户看来,内存就是插在固化
    的头像 发表于 06-30 10:58 3532次阅读

    内存条的作用

    简单来说内存在电脑中的作用相当于一座桥梁,基本作用就是储存硬盘主板的数据,还有就是交换处理器之
    的头像 发表于 12-07 16:27 14.7w次阅读

    内存条需要注意什么

    安装新的内存条时不要为追求高性能而安装与原内存条差距过大的内存条。比如我们1gb内存条旁边加装4gb的
    的头像 发表于 12-08 09:46 12.9w次阅读

    如何更换或为电脑增加内存条详细方法说明

    内存条”可谓是我们电脑中的重要组成部分,怎么说呢?内存条电脑中的作用就是一个中间通道,进行着主板、显卡等之类的的数据与电脑处理器之间的数
    的头像 发表于 01-30 09:07 7479次阅读

    如何选择合适的内存条内存条的什么属性最重要

    买电脑内存条主要看什么呢?由于内存条的种类和品牌非常的多,消费者选择内存条的时候就需要认识内存的主要配置,特别是DIY配置电脑的时候,如果
    的头像 发表于 04-12 09:14 7264次阅读

    内存条坏了会出现什么状况_内存条坏了如何解决

    内存条大家应该知道吧1它是电脑运行不可缺少的一种零件,大家可能光是知道这个东西,却不知道它到底有哪些方面的作用。简单的来说内存条就是一电脑的一个缓冲区,把一些临时处理的信息储存在内存条
    发表于 06-01 10:22 1.2w次阅读

    内存条故障原因及解决

    内存是电脑必不可少的组成部分,CPU可通过数据总线对内存寻址。历史上的电脑主板上有主内存内存条是主内存
    发表于 06-09 10:44 8092次阅读

    服务器内存条和普通内存条的区别

    服务器内存条和普通内存条的区别  服务器内存条和普通内存条是计算机中常见的两种内存设备。它们
    的头像 发表于 02-19 10:19 8656次阅读