操作系统内存分配

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

原文地址:https://www.cnblogs.com/rookieJW/p/9575810.html

时间: 2024-10-15 10:06:34

操作系统内存分配的相关文章

内存分配算法 之 首次适应-最佳适应

程序在向操作系统申请内存空间的时候,操作系统会扫描空闲块链表并从中取出一块足够大的分配,与之对应的算法有 首次适应 和 最佳适应,顾名思义,首次适应就是把首次遇到的足够大的空闲块分配给应用程序,最佳适应就是扫描完空闲块链表把大小与申请空间最匹配的空闲块分配给应用程序. mem.h        程序用到的头文件 main.c       主函数 fit.c        具体的实现函数 这里使用make来编译使用,若是读者还没接触过make的, 请移步参考我写的这篇文章:http://netca

内存分配及堆与栈的区别

1.内存分配方式 内存分配方式有三种: 1.从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. 2.从堆栈上分配.函数内的局部变量的存储单元,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. 3.从堆上分配,亦称动态内存分配.程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存.动态内存的生存期由程序员决定

jvm 内存分配 (转)

深入理解JVM-JVM内存模型 http://www.cnblogs.com/dingyingsi/p/3760447.html 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等待成本,但是随着CPU的发展,内存的读写速度也远远跟不上CPU的读写速度,因此,为了解决这一纠纷,CPU厂商在每颗CPU上加入了高速缓存,用来缓解这种症状,因此,现在CP

[问题贴]小白请教几个关于Java虚拟机内存分配策略的问题

最近在看周志明所著的<深入理解Java虚拟机>,有几个问题不太明白,希望大家帮我回答一下.先说一下我进行试验的环境: 操作系统:Mac OS X 10.11.6 EI Capitan Java环境: java version "1.8.0_92" Java(TM) SE Runtime Environment (build 1.8.0_92-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.92-b14, mixed mode

【转】深入JVM系列(一)之内存模型与内存分配

http://lovnet.iteye.com/blog/1825324 一.JVM内存区域划分 大多数 JVM 将内存区域划分为 Method Area(Non-Heap),Heap,Program Counter Register, Java Method Stack,Native Method Stack 和Direct Memomry(注意 Directory Memory 并不属于 JVM 管理的内存区域).前三者一般译为:方法区.堆.程序计数器.但不同的资料和书籍上对于后三者的中文译

SQLite剖析之动态内存分配

SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.以及保存查询结果.我们做了很多努力来让SQLite的动态内存分配子系统可靠.可预测.健壮并且高效.本文概述SQLite的动态内存分配,软件开发人员在使用SQLite时可以据此获得最佳性能. 1.特性    SQLite内核和它的内存分配子系统提供以下特性:    (1)对内存分配失败的健壮处理.如果一个内存分配请求失败(即malloc()或realloc()返回NULL),SQ

Java内存分配全面浅析

进入正题前首先要知道的是Java程序运行在JVM(Java  Virtual Machine,Java虚拟机)上,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM实现了Java的平台无关性,由此可见JVM的重要性.所以在学习Java内存分配原理的时候一定要牢记这一切都是在JVM中进行的,JVM是内存分配原理的基础与前提.          简单通俗的讲,一个完整的Java程序运行过程会涉及以下内存区域: l  寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制. l  栈:保存

SQL Server -&gt;&gt; Memory Allocation Mechanism and Performance Analysis(内存分配机制与性能分析)之 -- Minimum server memory与Maximum server memory

Minimum server memory与Maximum server memory是SQL Server下配置实例级别最大和最小可用内存(注意不等于物理内存)的服务器配置选项.它们是管理SQL Server内存的途径之一. Minimum server memory与Maximum server memory Minimum server memory(MB): 最小服务器内存.一旦超过这个线就不会再把内存换回去.但是也不是说SQL Server一启动马上就申请这么多的内存. Maximum

Java 内存分配全面浅析

本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程序运行在JVM(Java Virtual Machine,Java虚拟机)上,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM实现了Java的平台无关性,由此可见JVM的重要性.所以在学习Java内存分配原理的时候一定要牢记这一切都是在JVM中进行的,JVM是内存分配原理的基础与前提. 简