操作系统内存分配

Posted rookiejw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统内存分配相关的知识,希望对你有一定的参考价值。

when why what how

为什么 OS 需要中断、系统调用、异常?

why? 现实中有不少恶意应用,如果它能随意调用系统的一些指令,那后果不堪设想。那么就需要有个人确保其安全,操作系统可以信任其安全所以如果一些应用需要调用系统的一些指令通过操作系统来检查确保其安全。

中断:是指CPU对系统发生的某个事件做出的一种反应,CPU暂停正在执行的程序,保留现场后自动地转去执行相应的处理程序,处理完该事件后再返回断点继续执行被“打断”的程序。 如果某一个程序运行了足够长用完了分配给它的时间片,CPU决定切换到另一个进程运行,就会产生一个时钟中断,切换到下一个进程运行。

系统调用:应用程序请求操作提供服务

异常:非法指令或者其他原因导致当前指令执行失败比如除数为 0

技术分享图片

响应方式

中断:异步

异常:同步

系统调用:异步或同步

处理

中断:持续,对用户应用程序时透明的

异常:杀死或者重新执行意想不到的应用程序指令

系统调用:等待和持续


内存分配

内存层次

技术分享图片

逻辑地址:应用程序在内存中运行的时候有利于操作系统的有效管理,不用考虑一些细节(物理内存在哪里、外设在哪里),访问连续的地址空间。

物理地址:CPU地址总线传来的地址,由硬件电路控制(现在这些硬件是可编程的了)其具体含义。物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存、Bios等)。在没有使用虚拟存储器的机器上,虚拟地址被直接送到内存总线上,使具有相同地址的物理存储器被读写;而在使用了虚拟存储器的情况下,虚拟地址不是被直接送到内存地址总线上,而是送到存储器管理单元 MMU,把虚拟地址映射为物理地址。

简单说

程序的地址范围:地址空间(其中的地址是逻辑地址)

内存的地址范围:内存空间(其中的地址是物理地址)


连续地址空间分配

技术分享图片

动态分区分配:分配策略

  1. 最先匹配(First-fit)

    优势:简单、易于产生更大空闲块、在高地址空间有大块的空闲分区

    劣势:外部碎片、分配大块时较慢

  2. 最佳匹配(Best-fit)

    优势:当大部分分配时小尺寸时非常有效

    劣势:外部碎片、释放分区较慢、易产生很多没用的微小碎片(不怎么好)

  3. 最差匹配(Worst-fit)

    优势:假如分配时中等尺寸效果最好、避免出现太多的小碎片

    劣势:重分配慢、外部碎片、易于破碎大的空闲块以致大分区无法被分配

系统中的碎片

内存中无法被利用的存储空间称为碎片。

内部碎片:指分配给作业的存储空间中未被利用的部分,如固定分区中存在的碎片。

单一连续区存储管理、固定分区存储管理、分页式存储管理和请求页式存储管理都会出现内部碎片。

外部碎片:指系统中无法利用的小的空闲分区。如分区与分区之间存在的碎片。这些不连续的区间就是外部碎片。

内部碎片无法被整理,但作业完成后会得到释放。它们其实已经被分配出去了,只是没有被利用。

外部碎片才是造成内存系统性能下降的主要原因。外部碎片可以被整理后清除。

碎片整理

压缩式碎片整理

在内存中运行的程序能调整他的位置。什么时候移动?运行时不行,等待可以,但是开销大不大。

交换式碎片整理

运行程序需要更多的内存,抢占等待的程序回收他们的内存。把等待的程序放到磁盘上(虚拟内存)。


非连续分配

连续内存分配的缺点

  1. 分配给一个程序的物理内存是连续的
  2. 内存利用率较低
  3. 有外碎片、内碎片的问题
  4. 内存分配的动态修改困难

非连续分配的设计目标:提高内存利用效率和管理灵活性

  1. 允许一个程序的使用非连续的物理地址空间
  2. 允许共享代码与数据
  3. 支持动态加载和动态链接

缺点:如何建立虚拟地址和物理地址之间的转换

  1. 软件方案(灵活,开销大)
  2. 硬件方案(够用,开销小)

非连续分配的硬件辅助机制

段式存储管理 (segmentation)

页式存储管理 (paging)

段式存储管理

技术分享图片

技术分享图片

技术分享图片

页式存储管理

分页和分段的最大区别是分页尺寸时固定的分段式可以变化的。

页帧(帧、物理页面, Frame, Page Frame)

  1. 把物理地址空间划分为大小相同的基本分配单位
  2. 2的n次方,如512, 4096, 8192

页面(页、逻辑页面, Page)

  1. 把逻辑地址空间也划分为相同大小的基本分配单位
  2. 帧和页的大小必须是相同的

技术分享图片

技术分享图片

页表结构

每个进程都有一个页表

  1. 每个页面对应一个页表项
  2. 随进程运行状态而动态变化
  3. 页表基址寄存器(PTBR: Page
    Table Base Register)

技术分享图片

技术分享图片

上面通过页表来访问,访问一个内存单元需要 2 次内存访问,第一次访问:获取页表项,第二次访问获取数据。

存在问题?

64位机器如果每页1024字节,那么一个页表的大小会是多少?

2的54次,那么这个页表将会非常大!!!

优化方案?

  1. 缓存
  2. 间接访问

技术分享图片

技术分享图片

技术分享图片

多级页表存在问题?

如果有 5 级页表,那么要获取数据是不是需要访问 6 次内存。

能不能反置页面:将原来通过页号来找帧号换成通过帧号找页号,这样空间大小就可以减少,但是如果通过帧号来找页号呢? Hash

技术分享图片

技术分享图片


两者优缺点

段式管理的优点是:没有内碎片(因为段大小可变,改变段大小来消除内碎片)。但段换入换出时,会产生外碎片(比如4k的段换5k的段,会产生1k的外碎片)

页式存储管理的优点是:没有外碎片(因为页的大小固定),但会产生内碎片(一个页可能填充不满)

两者的不同点:

(1) 分页仅仅是由于系统管理的需要而不是用户的需要。段则是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好地满足用户的需要。

(2) 页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而在系统中只能有一种大小的页面;而段的长度却不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时,根据信息的性质来划分。

(3) 分页的作业地址空间是一维的,即单一的线性地址空间,程序员只需利用一个记忆符,即可表示一个地址;而分段的作业地址空间则是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。


段页式存储管理

段式存储在内存保护方面有优势,页式存储在内存利用和优化转移到后备存储方面有优势。

技术分享图片

技术分享图片

参考

操作系统_清华大学(向勇、陈渝)

https://blog.csdn.net/bupt_tinyfisher/article/details/8939689

以上是关于操作系统内存分配的主要内容,如果未能解决你的问题,请参考以下文章

清华大学操作系统(陈渝,向勇)课程笔记——连续内存分配

BUPT复试专题—内存分配(2014-2)

内存连续分配管理方式

为啥操作系统说内存足够时无法为jvm分配内存

内存的分配方式

操作系统-内存内存的分配和管理方式