用一只麻雀来观察Linux内存分配惰性策略

结论先行

我们知道现代的计算机系统,通常分为虚存和物理内存。其中虚存和物理内存之间存在地址映射。

原则上机器的物理内存是宝贵的,所以,Linux使用懒惰的策略来进行分配物理内存,直到虚存被真实使用到!

实验设计

  • malloc来申请内存

仅体现为虚存的增长

  • malloc申请的内存进行逐字节写入访问

造成物理内存被依次分配出来,体现出阶梯状

观察手段

# notice the VIRT RES %MEM cols
top -p $(pidof a.out)

代码

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <limits.h>
#include <stdint.h>int main(int argc , char* argv[])
{printf("Hello world!\n""To see the `top` command memory statistics!\n\n");int sleeptime = 3;if(argc > 1){sleeptime = atoi(argv[1]);}printf("Using sleeptime: %d argument to watch the incresing RES(physical) statistic\n""But the VIRT statistic keeps unchanged after malloc\n\n", sleeptime);printf("You can see the program's VIRT&RES&%%MEM statistics using `top` command\n\n""The initial VIRT&RES statistics must be small\n""Enter any key to continue to malloc a big memory area\n");int c = getchar();const size_t nBigSize = 1*1024*1024*1024;char* const pbBigMem = malloc(nBigSize);if(pbBigMem == NULL){perror("Malloc a big memory");return -1;}printf("\nThe VIRT statistic is changed after malloc\n");char* const pbBigMemEnd = pbBigMem + nBigSize;char* cursor = pbBigMem;do{// Access the memory to cause the physical memory to be assignedfor(size_t i = 0; i < (100*1024*1024) && cursor < pbBigMemEnd; ++i, ++cursor){// one by onecursor[0] = (char)i;}  printf("The RES statistic is changed after the memory is really scaned one by one, cursor: %p\n", cursor);sleep(sleeptime);}while(cursor < pbBigMemEnd);printf("\n\nExit from program !\n");return 0;
}

对内存分配器设计的潜在影响

Linux下,如果您申请一个大块内存池,作为管理器的管理空间,因为物理内存并没有被真实分配,在归还给管理器内存时,关于可用内存的管理将存在不同的策略设计。

  • 如果将归还的内存放置到管理器可用列表尾部,将会导致内存空间整个被真实访问,从而强迫管理器的整个空间占用了物理内存空间。

  • 如果将归还内存放置在可用列表头部,则内存被重复利用的可能性非常大,在不同的使用场景,管理器将倾向于使用少量的物理内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/616634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python机器学习】SVM——调参

下面是支持向量机一个二维二分类数据集的训练结果&#xff1a; import mglearn import matplotlib.pyplot as plt from sklearn.svm import SVCplt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False X,ymglearn.tools.make_handcrafted_dataset()…

网络传输的七层协议是哪七层

当涉及到网络通信时&#xff0c;OSI参考模型定义了七个层级来描述网络协议和通讯过程。以下是对每个层级的详细介绍&#xff1a; 物理层&#xff08;Physical Layer&#xff09;&#xff1a; 物理层负责将比特流传输到物理媒介上。确定电压、光信号等传输细节&#xff0c;并定义…

ModuleNotFoundError: No module named ‘simple_knn‘

【报错】使用 AutoDL 复现 GaussianEditor 时引用 3D Gaussian Splatting 调用simple_knn 时遇到 ModuleNotFoundError: No module named ‘simple_knn‘ 报错&#xff1a; 【原因】 一开始以为是版本问题&#xff0c;于是将所有可能的版本都尝试了 (from versions: 0.1, 0.2…

笔试面试题——继承和组合

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、什么是菱形继承&#xff1f;菱形继承的问题是什么&#xff1f;二、什么是菱形虚拟继承&am…

笙默考试管理系统-MyExamTest----codemirror(67)

笙默考试管理系统-MyExamTest----codemirror&#xff08;67&#xff09; 目录 一、 笙默考试管理系统-MyExamTest----codemirror 二、 笙默考试管理系统-MyExamTest----codemirror 三、 笙默考试管理系统-MyExamTest----codemirror 四、 笙默考试管理系统-MyExamTest---…

Unity 鼠标点击或触摸任意拖动UGUI的方法

在Unity中&#xff0c;如果要通过鼠标拖到UI组件或者触摸移动UI组件&#xff0c;可以使用EventSystems下的方法。 具体实现如下&#xff1a; 新建一个脚本&#xff0c;DragController.cs: using System.Collections; using System.Collections.Generic; using UnityEngine; …

SqlAlchemy使用教程(一) 原理与环境搭建

一、SqlAlchemy 原理及环境搭建 SqlAlchemy是1个支持连接各种不同数据库的Python库&#xff0c;提供DBAPI与ORM&#xff08;object relation mapper&#xff09;两种方式使用数据库。 DBAPI方式&#xff0c;即使用SQL方式访问数据库 ORM, 对象关系模型&#xff0c;是用 Python…

1.1 计算机网络在信息时代的作用

1.1 计算机网络在信息时代的作用 网络&#xff08;Network&#xff09;由若干结点&#xff08;Node&#xff09;和连接这些结点的链路&#xff08;Link&#xff09;所组成。网络中的结点可以是计算机、集线器、交换机或者路由器等。 图1-1 多个网络还可以通过路由器互连起来&a…

记录一下误删除libc.so.6的经历

起因&#xff1a; 在配置环境时&#xff0c;出现’GLIBCXX_3.4.29 not found’的错误&#xff0c;在解决这个问题的过程中&#xff0c;需要删除sudo rm /usr/lib/x86_64-linux-gnu/libstdc.so.6软连接&#xff0c;但是一不小心sudo rm /lib/x86_64-linux-gpu/libc.so.6&#xf…

使用主题模型和古老的人类推理进行无监督文本分类

一、说明 我在日常工作中不断遇到的一项挑战是在无法访问黄金标准标签的情况下标记文本数据。这绝不是一项微不足道的任务&#xff0c;在本文中&#xff0c;我将向您展示一种相对准确地完成此任务的方法&#xff0c;同时保持管道的可解释性和易于调整。 一些读者可能已经开始考…

枚举的用法总结

1 背景 在java语言中还没有引入枚举类型之前&#xff0c;表示枚举类型的常用模式是声明一组具有int常量。之前我们通常利用public final static 方法定义的代码如下&#xff0c;分别用1 表示春天&#xff0c;2表示夏天&#xff0c;3表示秋天&#xff0c;4表示冬天。 public c…

docker-compose一键搭建zookeeper集群

1、setup.sh setup.sh脚本用来创建本地文件夹&#xff0c;这些文件夹会被挂载到docker容器。 #!/bin/bashmkdir -p "$PWD\zoo1\data" mkdir -p "$PWD\zoo1\datalog"mkdir -p "$PWD\zoo2\data" mkdir -p "$PWD\zoo2\datalog"mkdir -p…

计算机缺失msvcp120.dll的最新解决方法,实测可以完美修复

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp120.dll丢失”。msvcp120.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;它是运行许多基于Windows操作系统的应用程序所必需的动态链接库文件之一。如果计算机…

Jetson_yolov8_解决模型导出.engine遇到的问题、使用gpu版本的torch和torchvision、INT8 FP16量化加快推理

1、前情提要 英伟达Jetson搭建Yolov8环境过程中遇到的各种报错解决&#xff08;涉及numpy、scipy、torchvision等&#xff09;以及直观体验使用Yolov8目标检测的过程&#xff08;CLI命令行操作、无需代码&#xff09;-CSDN博客和YOLOv8_测试yolov8n.pt&#xff0c;yolov8m.pt训…

【springboot 中集成 knife4j 时,报错 No mapping for GET /doc.html】

出现这种情况可能是项目中含有继承WebMvcConfigurationSupport的类&#xff0c;这会导致 swagger 配置失效。 解决方法&#xff0c;继承WebMvcConfigurationSupport下重写addResourceHandlers方法 Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry)…

[C#]winform部署yolov5-onnx模型

【官方框架地址】 https://github.com/ultralytics/yolov5 【算法介绍】 Yolov5&#xff0c;全称为You Only Look Once version 5&#xff0c;是计算机视觉领域目标检测算法的一个里程碑式模型。该模型由ultralytics团队开发&#xff0c;并因其简洁高效的特点而备受关注。Yol…

Tampermonkey油猴插件-某红薯一键导出收藏+一键下载单个笔记内容

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列

nova组件讲解和glance对接swift

1、openstack架构 &#xff08;1&#xff09;openstack是一种SOA架构&#xff08;微服务就是从这种架构中剥离出来的&#xff09; &#xff08;2&#xff09;这种SOA架构&#xff0c;就是把每个服务独立成一个组件&#xff0c;每个组件通过定义好的api接口进行互通 &#xff…

使用递归将list转换成tree

在产品研发时遇到这样一个问题&#xff0c;对于省市区县这类三级联动的数据&#xff0c;前端插件需要一次把数据全部返回&#xff0c;单纯的使用接口查询字节的没办法满足要求。 如果一次把数据全部返回&#xff0c;前端使用起来很麻烦需要一条一条的进行查找。 常规的使用方…

软件测试|解读Python的requirements.txt文件:管理项目依赖的完整指南

简介 在Python项目中&#xff0c;管理依赖库是必不可少的。requirements.txt文件是一种常用的方式&#xff0c;用于列出项目所需的所有依赖库及其版本。本文将详细介绍requirements.txt的用法&#xff0c;帮助你更好地管理项目的依赖。 使用步骤 创建requirements.txt文件&am…