第一章 cpu和内存分段分页知识总结

这是自己真正意义上写的第一篇博文,想通过博文锻炼下自己的文字表达能力,更多的是对所学的到的知识进行归纳总结,述清脉络。
常言道:自己懂了未必真的懂,只有能够把别人讲懂了,才是真正的懂。这也是自己的目标,为以后的事情打下坚实的基础

 

无论是pc 设备和各种嵌入式设备,硬件模型无非就是cpu, 内存和IO设备三大类。

1、CPU-南桥和北桥

 

早期的cpu 处理频率比较低和内存处理速度差不多,因此使用同一条总线(bus)进行连接,各个IO设备通过各自的IO控制器和总线进行连接。随着CPU的频率的增加,以及图形处理器的发展,内存,CPU的频率相差越来越大,后来设计师们通过增加一个高速处理的芯片来中转,来连接CPU和内存,图形处理器。这个高速处理的芯片就是我们所谓的“北桥”,如果IO等低俗处理的设备也连接到高速处理的北桥,那么北桥芯片的设计就相当复杂,既要处理快速处理,又要处理高速,因此又设计出了一个用来处理低速设备的“南桥”芯片。因此现在的硬件连接,类似于下面这张图。

2、多核cpu(SMP)

为了提高设备的处理速度,有以下几种方式:

1、提高单核cpu的处理频率,现在应该是4GHZ,但现在单核的处理频率受制于工业设计,短期内无法提高更多

2、设备上增加多个cpu,也即(对称处理器)SMP,提高速度,但cpu是昂贵的,因此会大大增加成

3、在一个cpu 中增加多个核,,也即简约版的SMP,现在的cpu 大部分都是多核处理器。

2、内存的分页和分段

   进程的总体目标是希望每个进程从逻辑上都可以独占资源,操作系统的多任务功能可以使cpu能够在多个进程之间很好的分享,那么对于内存,如何做到让计算机有限的物理内存分配给多个程序使用,举个简单的例子,假如我们计算机有128M内存,程序A运行需要10M,程序B运行需要110M,程序C需要20M,如果我们需要同时运行程序A和程序B,那么比较直接的做法就是把内存的10M分配给A,10-120M分配给B,那么久能够实现程序A和程序B同时运行,但这种分配有以下几个问题,

1) 空间不隔离。所有程序都直接访问物理地址,那么就说其他的任何一个程序都可以修改该程序的内存地址,比如修改数据呀严重的导致程序的崩溃。以达到破坏的目的。这种问题用户肯定不能接受。

2)内存使用率低。由于没有有效的内存管理机制,通常有一个程序监控其他的程序运行。已上面的例子为例,假如我们要运行程序c ,其实现在是没有内存的。那么此时的办法就是把B所占用的内存暂时保存在磁盘中,释放内存,让c 占用,那么这个内存的转移就会降低了内存的使用效率。

3) 程序运行的地址不确定,因为程序每次需要运行是我们都会从内存中分配一个地址,这个地址是不确定的。这给程序的编写造成了一定的麻烦。因为在程序编写是访问数据和指令的跳转的目标地址都是固定的。这就牵扯到后面提到的链接重定向问题。

为了解决上面的问题,我们需要增加一个中间层,即增加一个虚拟地址,通过某种映射的方法将这个虚拟地址转换成物理地址。我们只要控制了这个映射关系就可以确保任意一个程序所能访问的物理地址都是不会重叠的。以达到地址隔离的效果

内存的隔离:

               程序的运行应该逻辑上都是独立的环境,有一个独立的内存地址空间。所谓的地址空间即使很大的数组,每个数组的元素都是一个字节。数组大小由空间地址长度决定。比如32位cpu ,的地址空间最大为0x00000000—0xffffffff.地址空间分为物理地址、虚拟地址。

物理地址是真实存在的。虚拟空间是通过映射关系和物理地址映射出的空间。

                 内存分段和分页

                           

         物理地址到虚拟地址的转换都是通过cpu 中的mmu硬件处理单元进行处理。从图片中可以看出,Cpu 访问都是虚拟地址,经过mmu进行转换,访问到真实的物理地址。

内存的分段

早期的内存都是分段,也就还是以程序为单元进行分配内存,比如下图:

         程序A和B都分别占用了虚拟地址的某一段空间,这样做可以解决上述的第一个和第三个问题,

1) 解决空间地址不独立的问题,以程序为单元分配固定大小的内存后,A和B所占用的内存就不会重叠。当A程序试图去访问非程序A空间的地址时,硬件单元就会检测到,会产生一个异常通过操作系统或者其他监控程序。比如windows下经常看到的“访问地址不合法”的提示弹窗

2) 解决程序运行地址不固定的问题。程序A和B在虚拟地址分配的内存地址空间起始是固定的,我们不关心转换后的物理地址是否允许。

刚才提到分段的方式分配内存是以程序为单元,仍然无法解决内存使用率低的问题。事实上,根据程序的局限性原理,当一个程序在运行时,在某一个时间段内,只是使用到内存中的一段数据,也就是很多数据在很长的时间段内不需要的,那么我们可以把这段内存暂不申请,就可以余下内存供其他的内存使用。那在程序启动时我们怎么去不申请那么大的内存,答案显而易见,我们可以使用更小的内存分配粒度,是程序的局部性原理得到充分的利用。大大提高内存的使用效率,这种方法就是分页(paging)

内存分页:

分页的基本方法就是把地址空间分为固定大小的页,每一页的大小由硬件决定。一般都是4kb,128个字节等。

具体的运行思路如下:把进程的虚拟地址空间按页分配分割后,把常用的数据和代码加载到内存中。把不常用的代码和数据保存在磁盘中。当需要的时候就从磁盘中读取出来。比如当程序运行中需要某一页内存的数据时,发现该页不存在内存中,硬件就会捕捉到这个错误,产生所谓的页错误(page Fault), 然后操作系统接管进程,负责将缺失的页从磁盘中读取出来装入内存,之后将内存中该页和进程的该页建立映射关系。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值