首页 > 系统相关 >03-计算机体系结构及内存分层体系

03-计算机体系结构及内存分层体系

时间:2023-06-01 20:22:12浏览次数:49  
标签:03 分区 碎片 地址 内存 分配 空闲 体系结构

03-计算机体系结构及内存分层体系

计算机体系结构/内存分层体系

计算机体系结构

CPU/内存/IO

内存分层体系

CPU
寄存器
一级缓存 寄存器和一级缓存是在CPU内部的,速度很快3.6GHz,容量很小
二级缓存 在微处理器内部 速度稍快
主存 速度快 1.3GHz
硬盘(虚拟内存)速度慢 5ms(寻道时间)

在操作系统的内存管理范例

操作系统内核的职责

  • 抽象 对逻辑地址空间的抽象
  • 保护 独立地址空间
  • 共享 访问相同内存
  • 虚拟化 更多的地址空间

在操作系统中管理内存的不同方法

  • 程序重定位
  • 分段
  • 分页
  • 虚拟内存
  • 按需分页虚拟内存

实现高度依赖于硬件

  • 必须知道内存架构
  • MMU(内存管理单元):硬件组件负责处理CPU的内存访问请求

地址空间 & 地址生成

地址空间定义

物理地址空间-硬件支持的地址空间
起始地址0,到地址$Max_sys$ 包括主存和磁盘
逻辑地址空间-一个运行的程序所拥有的内存范围
起始地址0,到地址$Max_prog$

地址生成

CPU方面

  1. 运算器需要在逻辑地址的内存内容
  2. 内存管理单元寻找在逻辑地址和物理地址之间的映射
  3. 控制器从总线发送在物理地址的内存内容的请求
    内存方面
  4. 内存发送物理地址内存的内容给CPU

操作系统方面
在以上4步之前简历逻辑地址和物理地址的映射

地址安全检查

操作系统需要设置逻辑地址空间的基址和界限
在程序执行之前会判断所需要的程序或数据是否在地址范围内

连续内存分配

内存碎片问题

空闲内存不能被利用
外部碎片 在分配单元间的未使用内存
内部碎片 在分配单元中的未使用内存

分区的动态分配

简单的内存管理方法
1)当一个程序准许运行在内存中时,分配一个连续的区间
2)分配一个连续的内存区间给运行的程序以访问数据
操作系统需要跟踪内存的状态
满块
空块(孔洞)

三种简单的算法进行内存分配

  • 第一适配
    为了分配n字节,使用第一个可用空闲块以致块的尺寸比n大
    需求:
    按地址排序的空闲块列表
    分配需要寻找一个合适的分区
    重分配需要检查,看是否分区能合并于相邻的空闲分区(若有)
    优势
    简单
    易于产生更大空闲块,向着地址空间的结尾
    劣势
    外部碎片
    不确定性
  • 最佳适配
    找到比所需空间大的,但是差值最小的空闲块
    为了避免分割大空闲块
    为了最小化外部碎片产生的尺寸
    需求:
    按尺寸排列的空闲块列表
    分配需要寻找一个合适的分区
    重分配需要搜索及合并于相邻的空闲分区,若有

优势:
当大部分分配是小尺寸时非常有效
比较简单

劣势:
外部碎片
重分配慢
易产生很多没用的微小碎片(不怎么好)

  • 最差适配
    为了分配n字节,使用最大可用空闲块,以致块的尺寸比n大
    为了避免由太多微小的碎片
    需求:
    按尺寸排列的空闲块列表
    分配很快(获得最大的分区)
    重分配需要合并于相邻的空闲分区,若有,然后调整空闲块列表
    优势:
    假如分配是中等尺寸效果最好
    劣势:
    重分配慢
    外部碎片
    易于破碎大的空闲块以致大分区无法被分配

压缩式碎片整理

重置程序以合并孔洞
要求所有程序是动态可重置的
议题
何时重置?在程序停止的时候进行
开销 如果频繁拷贝,开销会比较大,而且有可能导致功能出问题

交换式碎片整理

运行程序需要更多的内存
抢占等待的程序 & 回收他们的内存
虚拟内存

标签:03,分区,碎片,地址,内存,分配,空闲,体系结构
From: https://www.cnblogs.com/Oh-mydream/p/17450099.html

相关文章

  • glibc堆内存分配算法
    对于小于64字节的空间申请是采用类似于对象池的方法;对于大于512字节的空间申请采用的是最佳适配算法;对于大于64字节而小于512字节的,它会根据情况采取上述办法中的最佳折中策略;对于大于128KB的申请,它会使用mmap机制直接向操作系统申请空间。 空闲链表(最佳适配算法)将堆中各个空......
  • P4036 [JSOI2008] 火星人
    暴力水过了wwwwwwwwwwwwwww#include<bits/stdc++.h>//================================================//#defineLOCALFLANDREKAWAII#ifndefLOCALconstexprintSIZE(1<<20);charin[SIZE],out[SIZE],*p1=in,*p2=in,*p3=out;#definegetchar(......
  • volatile与java内存模型
    一、结论先说结论,volatile能保证可见性和有序性,不能保证原子性。二、volatile的内存语义当写一个volatile变量时,会将变量值刷新回主内存当读一个volatile变更时,会从主内存中读取最新值三、内存屏障是什么?内存屏障是一类同步屏障指令,是cpu或编译器在对内存随机访问操作的一......
  • 二级指针内存模型
    二级指针做输出模型#define_CRT_SECURE_NO_WARNINGS#include<stdlib.h>#include<string.h>#include<stdio.h>//指针做输出:被调用函数分配内存-----OK//指针做输入:主调用函数分配内存//求文件中的两段话的长度intgetMem(char**myp1,int*mylen1,char**myp2,in......
  • IDEA虚拟内存优化
      按照自己需求更改即可(下面是本人的,本人电脑16G内存):   ......
  • tar 命令压缩时报错 Removing leading `/' from member names 解决方法
    原文:https://www.cnblogs.com/operationhome/p/9802554.html在使用tar命令进行压缩打包的时候我们常常会遇到下面的错误。虽然它不会影响我们最后的压缩打包,但是间接说明了我们的命令是有问题的。接下来我们来看看解决的方法。报错内容报错内容:$tar-zcvf/home/shenweiyan......
  • 如何查看redis占用内存大小
    http://www.daixiaorui.com/read/209.html#Memoryused_memory:13490096//数据占用了多少内存(字节)used_memory_human:12.87M//数据占用了多少内存(带单位的,可读性好)used_memory_rss:13490096 //redis占用了多少内存used_memory_peak:15301192//占用内存的峰值(字节)used_memory_p......
  • 20180315~20180322每天复习
    MPUSH架构图: 系统调用关系图: mpush目前支持如下消息类型 publicenumCommand{HEARTBEAT(1),//心跳HANDSHAKE(2),//握手LOGIN(3),LOGOUT(4),BIND(5),//绑定用户UNBIND(6),//解绑用户......
  • Oracle:OpenEuler 22.03 安装oracle11g
    见本人文章:“国产操作系统openEuler\UOSserver,以及openSUSE:都成功安装单实例的oracle11g\12c” ......
  • couldn't clear tomcat cache java.lang.NoSuchFieldException: resourceEntries
    2015-09-2500:17:11,435WARN[dqapp24http-nio-8002-exec-22]com.opensymphony.xwork2.util.LocalizedTextUtilcouldn'tcleartomcatcachejava.lang.NoSuchFieldException:resourceEntriesatjava.lang.Class.getDeclaredField(Class.java:2062)~[na:1.8......