操作系统-计算机体系结构及内存分层003
操作系统被加载到内存之后呢,对整个计算机系统进行管理和控制,首先管理和控制的就是内存。所以以下是操作系统如何管理物理内存
一、计算机体系结构、内存分层体系
了解了计算机体系结构、内存分层体系,才会知道操作系统如何进行管理。
1、计算机体系结构
主要包括三部分:CPU(完成程序的控制)、内存(放程序代码和处理的数据)、I/o设备(外设,键盘鼠标…)
2、内存分层体系
内存包括:CPU、cache、主存和物理内存。 速度越来越慢,存量越来越大
内存的层次结构:CPU要访问的指令或数据,所处的位置在什么地方。
- CPU可以访问的有:
1.寄存器,2.cache(1,2位于CPU内部,所以速度很快,容量很小,操作系统不能直接管理)
3.主存或者叫物理内存,主要用来放置操作系统本身以及运行的代码(向对寄存器和cache容量较大,速度偏慢。主存掉电后,信息消失。)
4.硬盘,存储量大,但是偏慢。信息永久保存。
3、操作系统的内存管理范例(操作系统重点完成的目标)
-
抽象
逻辑地址空间
希望应用程序在内存中运行中,有利于操作系统的有效管理,不用考虑底层细节(比如物理内存的地方,外设的地方),只需要访问一个连续的空间(逻辑地址空间),就可以了。 -
保护
独立地址空间
在内存中可以运行多个运行程序,可能出现破快其他地址空间,需要一个有效机制,保护进程之间的地址,是需要隔离的。隔离的实现是需要操作系统来完成。 -
共享
访问相同内存
除了隔离,进程之间需要交互,共享空间,安全有效进行数据的传递。 -
虚拟化
更多的地址空间
当放了许多应用程序时,其实可能会出现内存不够现象。那么需要现在运行的程序获取所需空间,解决方法是:将需要放到内存的数据放到内存,暂时不访问的数据,放到硬盘。 -
有两个地址空间,逻辑和物理空间,主存和硬盘是物理地址空间。程序看到的是逻辑空间。
二、地址空间&地址生成
操作系统怎么去和程序的编制执行的过程,如何交互
1.地址空间的定义(逻辑和物理地址的区别)
- 物理地址空间是:是和硬件直接对应的,比如说内存条所代表的的主存,硬盘所代表的的存储空间。物理内存的管理和控制是硬件来完成。
- 逻辑地址空间是:是指运行的程序,他说看到的内存空间。一维线性地址空间,应用程序很容易去访问、控制。所有程序去访问的逻辑地址空间,其实真实的都是落实在物理地址所存在的。
2.地址空间如何生成的。
- 应用程序在访问一个指令的时候,指令所处的逻辑地址,是如何对应到物理内存空间中呢?
- 一条指令有自己的逻辑地址,那么CPU要执行这条指令,需要从内存中将指令取出来,放到物理地址什么地方?CPU开始不知道,只知道有一个逻辑地址,通过逻辑地址查询物理地址,在硬件中有mmu有一块区域,表示映射关系,会在内存中有关系。查表就会知道,具体的逻辑地址对应的 物理地址在什么地方。就会硬件从相应的物理地址中取出来。
- 当CPU执行指令时,ALU部件所需要指令的内容发出请求,请求参数是逻辑地址。
- CPU中的mmu会查找逻辑地址映射表,是否对应物理地址。
- CPU控制器会给主存,发出请求,所要物理地址的内容。
- 主存会通过总线,传给CPU。
- CPU得到指令内容,就会开始对指令的执行。
3.地址安全检查机制,操作系统如何保护地址
操作系统其中重要目标是:确保内存中的程序,相互之间互不干扰,确保每一个程序访问的地址空间是合法的。是限制在约束范围之内的。
操作系统保证程序有效访问地址空间,两部分组成:起始地址,长度
CPU执行某条指令时,会查map,map会指出来访问的某一个地址,逻辑地址是否满足区域的限制。如果满足:根据映射关系找到物理地址,将相对应的数据和指令取出来。如果不满足:我们的CPU会产生一个内存访问异常,从而操作系统进一步处理。
三、连续内存分配
操作系统有效管理连续的地址分配
1、内存碎片问题
- 空闲内存不能被利用
当我们给一个运行的程序,分配空间之后,出现无法在进行利用的空间。
- 外部碎片
在分配单元之间的未使用内存(两个分配单元中间的碎片) - 内部碎片
已经分配单元中的未使用内存(已分配程序,单元之内中的无法使用)
- 这两种都是希望减少出现的情况。
2、分区的动态分配
1.操作系统会将应用程序从硬盘中加载到内存中,需要在内存中分配一定的区域。让程序跑起来。
2.应用程序在运行时,需要访问数据,需要给数据分配空间。
操作系统需要管理整个内存空间。三种简单的内存空间算法。
1.首次第一适配
会直接分配第一个空闲块。
如果应用程序提出需求,需要分配N个byte,需要找到第一个能够满足N个byte的空闲块。将这个块分配给应用程序。
- 总结:
- 简单实现
- 易于产生更大空闲块,向着地址空间的结尾。
- 需求:
1.按地址大小,将空闲块进行排序
2.分配需要寻找一个合适的分区
3.重分配需要检查,看是否自由分区能合并与相邻的空闲分区。如能合并,则会形成更大的空间块,从而满足更大的需求。 - 劣势:
1.容易产生外部碎片。第一次找到,第一个空间块,下一次找到下一个空间块,可能这之间有空闲块儿,可能比较小,不容易使用到。
2.不确定性
2.最佳适配
会分配500byte的空闲块,是因为:所需的空间和空间块所差值最小。
3.最差适配
最差和最优相反。
找到一个空闲的内存块,与提出的内存分配请求大小,差距是最大的。
400byte,选择第二个2K byte
3、压缩式碎片整理(将已有的数据进行合并)
无论采用哪种算法,都可能产生碎片。那么如何弥补减少碎片。便于后序的分配。
- 重置程序以合并孔洞
- 要求所有程序是动态重置的
- 问题:那么何时重置和开销。
例如四个程序,五个空闲块,简单的来说进行拷贝、重定位。
4、交换式碎片整理
- 将硬盘当做成备份,比如说P4占了三个块,正好P4正在等待某个事件,那么将P4所占的四块空间,挪到硬盘上去。从而主存上空闲了3块空间。P4的数据只是从主存到了硬盘。当P4运行时,再从硬盘拷贝到主存中。
- 问题:
1.需要选择哪一个数据块进行数据拷贝到硬盘?
2.何时将主存数据拷贝到硬盘,何时拷贝回来呢?