操作系统-计算机体系结构及内存分层、地址生成和分配003

操作系统被加载到内存之后呢,对整个计算机系统进行管理和控制,首先管理和控制的就是内存。所以以下是操作系统如何管理物理内存

一、计算机体系结构、内存分层体系

了解了计算机体系结构、内存分层体系,才会知道操作系统如何进行管理。

1、计算机体系结构

主要包括三部分:CPU(完成程序的控制)、内存(放程序代码和处理的数据)、I/o设备(外设,键盘鼠标…)

2、内存分层体系

内存包括:CPU、cache、主存和物理内存。 速度越来越慢,存量越来越大 内存的层次结
内存的层次结构:CPU要访问的指令或数据,所处的位置在什么地方。

  • CPU可以访问的有:
    1.寄存器,2.cache(1,2位于CPU内部,所以速度很快,容量很小,操作系统不能直接管理)
    3.主存或者叫物理内存,主要用来放置操作系统本身以及运行的代码(向对寄存器和cache容量较大,速度偏慢。主存掉电后,信息消失。)
    4.硬盘,存储量大,但是偏慢。信息永久保存。

3、操作系统的内存管理范例(操作系统重点完成的目标)

操作系统的内存管理

  • 抽象
    逻辑地址空间
    希望应用程序在内存中运行中,有利于操作系统的有效管理,不用考虑底层细节(比如物理内存的地方,外设的地方),只需要访问一个连续的空间(逻辑地址空间),就可以了。

  • 保护
    独立地址空间
    在内存中可以运行多个运行程序,可能出现破快其他地址空间,需要一个有效机制,保护进程之间的地址,是需要隔离的。隔离的实现是需要操作系统来完成。

  • 共享
    访问相同内存
    除了隔离,进程之间需要交互,共享空间,安全有效进行数据的传递。

  • 虚拟化
    更多的地址空间
    当放了许多应用程序时,其实可能会出现内存不够现象。那么需要现在运行的程序获取所需空间,解决方法是:将需要放到内存的数据放到内存,暂时不访问的数据,放到硬盘。

    扫描二维码关注公众号,回复: 13613029 查看本文章
  • 有两个地址空间,逻辑和物理空间,主存和硬盘是物理地址空间。程序看到的是逻辑空间。

在这里插入图片描述

二、地址空间&地址生成

操作系统怎么去和程序的编制执行的过程,如何交互

1.地址空间的定义(逻辑和物理地址的区别)

在这里插入图片描述

  • 物理地址空间是:是和硬件直接对应的,比如说内存条所代表的的主存,硬盘所代表的的存储空间。物理内存的管理和控制是硬件来完成。
  • 逻辑地址空间是:是指运行的程序,他说看到的内存空间。一维线性地址空间,应用程序很容易去访问、控制。所有程序去访问的逻辑地址空间,其实真实的都是落实在物理地址所存在的。

2.地址空间如何生成的。

在这里插入图片描述

  • 应用程序在访问一个指令的时候,指令所处的逻辑地址,是如何对应到物理内存空间中呢?
  • 一条指令有自己的逻辑地址,那么CPU要执行这条指令,需要从内存中将指令取出来,放到物理地址什么地方?CPU开始不知道,只知道有一个逻辑地址,通过逻辑地址查询物理地址,在硬件中有mmu有一块区域,表示映射关系,会在内存中有关系。查表就会知道,具体的逻辑地址对应的 物理地址在什么地方。就会硬件从相应的物理地址中取出来。
  1. 当CPU执行指令时,ALU部件所需要指令的内容发出请求,请求参数是逻辑地址。
  2. CPU中的mmu会查找逻辑地址映射表,是否对应物理地址。
  3. CPU控制器会给主存,发出请求,所要物理地址的内容。
  4. 主存会通过总线,传给CPU。
  5. CPU得到指令内容,就会开始对指令的执行。

3.地址安全检查机制,操作系统如何保护地址

在这里插入图片描述
操作系统其中重要目标是:确保内存中的程序,相互之间互不干扰,确保每一个程序访问的地址空间是合法的。是限制在约束范围之内的。
操作系统保证程序有效访问地址空间,两部分组成:起始地址,长度
CPU执行某条指令时,会查map,map会指出来访问的某一个地址,逻辑地址是否满足区域的限制。如果满足:根据映射关系找到物理地址,将相对应的数据和指令取出来。如果不满足:我们的CPU会产生一个内存访问异常,从而操作系统进一步处理。

三、连续内存分配

操作系统有效管理连续的地址分配

1、内存碎片问题

  • 空闲内存不能被利用
    当我们给一个运行的程序,分配空间之后,出现无法在进行利用的空间。
  1. 外部碎片
    在分配单元之间的未使用内存(两个分配单元中间的碎片)
  2. 内部碎片
    已经分配单元中的未使用内存(已分配程序,单元之内中的无法使用)
  • 这两种都是希望减少出现的情况。

2、分区的动态分配

1.操作系统会将应用程序从硬盘中加载到内存中,需要在内存中分配一定的区域。让程序跑起来。
2.应用程序在运行时,需要访问数据,需要给数据分配空间。

操作系统需要管理整个内存空间。三种简单的内存空间算法。

1.首次第一适配

会直接分配第一个空闲块。
在这里插入图片描述
如果应用程序提出需求,需要分配N个byte,需要找到第一个能够满足N个byte的空闲块。将这个块分配给应用程序。

  • 总结:
  1. 简单实现
  2. 易于产生更大空闲块,向着地址空间的结尾。
  3. 需求:
    1.按地址大小,将空闲块进行排序
    2.分配需要寻找一个合适的分区
    3.重分配需要检查,看是否自由分区能合并与相邻的空闲分区。如能合并,则会形成更大的空间块,从而满足更大的需求。
  4. 劣势:
    1.容易产生外部碎片。第一次找到,第一个空间块,下一次找到下一个空间块,可能这之间有空闲块儿,可能比较小,不容易使用到。
    2.不确定性

2.最佳适配

会分配500byte的空闲块,是因为:所需的空间和空间块所差值最小。
在这里插入图片描述
在这里插入图片描述

3.最差适配

最差和最优相反。
找到一个空闲的内存块,与提出的内存分配请求大小,差距是最大的。
400byte,选择第二个2K byte
在这里插入图片描述
在这里插入图片描述

3、压缩式碎片整理(将已有的数据进行合并)

无论采用哪种算法,都可能产生碎片。那么如何弥补减少碎片。便于后序的分配。

  1. 重置程序以合并孔洞
  2. 要求所有程序是动态重置的
  3. 问题:那么何时重置和开销。

例如四个程序,五个空闲块,简单的来说进行拷贝、重定位。
在这里插入图片描述

4、交换式碎片整理

  • 将硬盘当做成备份,比如说P4占了三个块,正好P4正在等待某个事件,那么将P4所占的四块空间,挪到硬盘上去。从而主存上空闲了3块空间。P4的数据只是从主存到了硬盘。当P4运行时,再从硬盘拷贝到主存中。
  • 问题:
    1.需要选择哪一个数据块进行数据拷贝到硬盘?
    2.何时将主存数据拷贝到硬盘,何时拷贝回来呢?

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43989347/article/details/120118061