当前位置: 首页 > news >正文

操作系统内存碎片

大家好,我叫徐锦桐,个人博客地址为www.xujintong.com,github地址为https://github.com/jintongxu。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家访问。

一、前言

内存碎片是指无法被利用的内存,分为外部碎片内部碎片。分段机制会导致外部碎片,分页机制会导致内部碎片。

二、外部碎片

分段机制就是一个进程需要多大的内存空间就给该进程多大的连续物理空间。但是会产生一种情况,就是总的空闲内存大小大于进程要申请的空间大小,但是因为这些内存是不连续的所以就不能分配个该进程,就像下图所示:

分段外部碎片.webp

由图,总的空闲物理内存大小为256MB大于新进程申请的内存大小,但是因为这两块内存不是连续的所以不能分配给该进程,这就是外部碎片。分段是将整个进程内存完整的存到物理内存上,由于每个段的长度不固定,多个段未必能恰好使用所有的内存空间,所以会产生多个不连续的小物理内存,导致新的程序无法被装载,这时就会出现外部碎片的问题。

在分页机制中不会产生外部碎片,分页机制中将物理内存分成一页一页(每一页大小都相同且固定)的,每一页的大小为4KB(在Linux中)。

系统为了隔离各个进程,防止不同进程运行的时候地址覆盖,引入虚拟内存的概念。每个都有一个进程空间,在进程眼里整个内存都是由自己独享的。操作系统将虚拟地址和物理地址都分成一页一页的,然后通过一个元件MMU,将虚拟内存的页映射到物理内存的页上。

内存碎片1

由图可以看出来,在不同进程的虚拟空间中,相同的虚拟页映射到了不同的物理页,所以不同进程可以实现隔离。可以看到分页将一个进程内存分割成了一页一页的,然后再映射到物理内存上。虚拟地址和物理地址的最小分配内存大小都是4KB,这样就不会出现总的空闲内存大小够分配但是因为是不连续的所以不能分配内存的这种情况。

简单来说就是分段是直接把进程在物理内存中找个合适的位置塞进去,分页是把进程切成一小片一小片的,然后再塞进物理内存中。

三、内部碎片

分页会导致内部碎片,因为最小的内存分配单位是一页,也就是4KB,但是如果一个程序申请的内存不到一页,系统也得给它分配一页的物理内存,这多出来的就是内部碎片。如图所示:

内部碎片

图上多出来的这3KB就是内部碎片。

四、解决内部碎片办法

TODO

http://www.lryc.cn/news/275681.html

相关文章:

  • 三菱plc学习入门(二,三菱plc指令,触点比较,计数器,交替,四则运算,转换数据类型)
  • Spring学习之——代理模式
  • 【Linux】之搭建 PostgreSQL 环境
  • docker 安装elasticsearch、kibana、cerebro、logstash
  • C/C++ 联合体
  • 基于SSM的基金投资交易管理网站的设计与实现
  • JS数据类型转换成Boolean型
  • uni-app页面数据传参方式
  • 计算机网络实验(二):Wireshark网络协议分析
  • Spark内核解析-数据存储5(六)
  • ASP.NET Core高级之认证与授权(一)--JWT入门-颁发、验证令牌
  • 实例:NodeJS 操作 Kafka
  • AI实景无人直播创业项目:开启自动直播新时代,一部手机即可实现增长
  • YOLOv5改进 | 损失函数篇 | InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等损失函数
  • 构建高效PythonWeb:GraphQL+Sanic
  • 【通义千问】大模型Qwen GitHub开源工程学习笔记(5)-- 模型的微调【全参数微调】【LoRA方法】【Q-LoRA方法】
  • PCL 大地坐标转空间直角坐标(C++详细过程版)
  • Linux之Shell编程
  • Unity组件开发--传送点
  • vue结合Cesium加载gltf模型
  • 逆置算法和数组循环移动算法
  • 【MATLAB】数豆子
  • QT C++中调用python脚本时,import第三方库失败问题解决
  • 【AI视野·今日Robot 机器人论文速览 第七十期】Thu, 4 Jan 2024
  • Flutter中的布局组件介绍及使用
  • 【面试高频算法解析】算法练习2 回溯(Backtracking)
  • 认识Git
  • @RequestParam,@RequestBody和@PathVariable 区别
  • vue3组件传参
  • React16源码: React中创建更新的方式及ReactDOM.render的源码实现