linux delete内存不下降_linux内存分配管理

linux内存分配管理


一、前言

作为从事与C/C++程序开发人员,我们一直需要很好的管理内存,申请和释放;可能很多只知道使用malloc、new去申请,使用free、delete去释放,但是,去根究其内部的原理,可能就不是很清楚了;

这里主要对linux平台的内存管理进行一下总结和梳理;


二、内存申请释放

Linux虚拟内存管理相关概念请移步至详解linux虚拟内存原理;

这里主要说说的是我们的内存是怎么申请的:

在C/C++中,使用malloc进行内存分配,C++使用的new,但是其底层也是使用malloc;在系统调用上面,一般使用的是brk()mmap()函数;

我们说一说这两个函数的使用场景:

brk():

  • 当内存分配使用小于128K

    对于小于128K的小块内存,系统会使用 brk() 来分配,也就是通过移动堆顶的位置来分配内存。这些内存释放后并不会立刻归还系统,而是被缓存起来,这样就可以重复使用。

    **注:**使用brk()分配内存时,只分配虚拟空间,不对应物理内存,只有第一次读/写数据时,引起内核缺页中断,内核才分配对应的物理内存,然后在虚拟地址上建立映射关系;

  • 回收内存

    申请内存使用完毕之后,内存并不是真正的释放掉了,而是只回推了**_edata**指针,内存可以被重复利用;

    brk分配的内存需要等到高地址内存释放以后才能释放brk分配的内存需要等到高地址内存释放以后才能释放,所以会产生内存碎片;

    但是当最高地址空间超过了128k,就会执行trim(内存紧缩)操作;


mmap()

  • 大于128K

    大块内存(大于 128K),则直接使用内存映射 mmap() 来分配,也就是在文件映射段找一块空闲内存分配出去。

    注意:这个和brk()是一样的,只有第一次使用的时候才会真正分配物理内存;

  • 回收内存

    mmap回收内存时是直接释放归还,不会进行重复利用,所以这种会导致每次 mmap 都会发生缺页异常。在内存工作繁忙时,频繁的内存分配会导致大量的缺页异常,使内核的管理负担增大。这也是 malloc 只对大块内存使用 mmap 的原因。

参考:Linux内存分配小结--malloc、brk、mmap


三、linux内存管理

  • 伙伴算法

    定义:由一个母实体分成的两个各方面属性一致的两个子实体,这两个子实体就处于伙伴关系。在操作系统分配内存的过程中,一个内存块常常被分成两个大小相等的内存块,这两个大小相等的内存块就处于伙伴关系

    伙伴系统的宗旨就是用最小的内存块来满足内核的对于内存的请求。在最初,只有一个块,也就是整个内存,假如为1M大小,而允许的最小块为64K,那么当我们申请一块200K大小的内存时,就要先将1M的块分裂成两等分,各为512K,这两分之间的关系就称为伙伴,然后再将第一个512K的内存块分裂成两等分,各位256K,将第一个256K的内存块分配给内存,这样就是一个分配的过程;

    • 伙伴系统特点

      1)两个块大小相同;2)两个块地址连续;3)两个块必须是同一个大块中分离出来的;

    • 作用

      伙伴系统是以page为单位进行操作的,一般管理的是大内存分配

具体详细参考:Linux伙伴系统(一)--伙伴系统的概述

  • slab 分配器

linux内核中会采用伙伴算法进行内存分配管理,但是分配的内存区是以页框为基本单位的。对于内核中小块连续内存的请求,比 如说几个字节或者几百个字节,如果依然分配一个页框来来满足该请求,这样的话就会有内存碎片产生;

  • 定义

    slab分配器中用到了对象这个概念,所谓对象就是内核中的数据结构以及对该数据结构进行创建和撤销的操作。它的基本思想是将内核中经常使用的对象 放到高速缓存中,并且由系统保持为初始的可利用状态。比如进程描述符,内核中会频繁对此数据进行申请和释放。当一个新进程创建时,内核会直接从slab分 配器的高速缓存中获取一个已经初始化了的对象;当进程结束时,该结构所占的页框并不被释放,而是重新返回slab分配器中。如果没有基于对象的slab分 配器,内核将花费更多的时间去分配、初始化以及释放一个对象。

    slab分配器有以下三个基本目标:

    1.减少伙伴算法在分配小块连续内存时所产生的内部碎片;

    2.将频繁使用的对象缓存起来,减少分配、初始化和释放对象的时间开销。

    3.通过着色技术调整对象以更好的使用硬件高速缓存;

参考:Linux内存管理中的slab分配器

  • 作用

    • 高速缓存
    • 分配小块内存

具体详细参考:【Linux 内核】内存管理(三)slab分配器

说明:这是linux中比较重要的两个内存管理的方式,我对这块也只是了解状态,并没有深入去研究,这里只是简单概括一下,以后有时间细细研究一下,现在大概知道这个原理和概念就行了;


四、回收内存

那么上面说了内存分配相关的内容,那么,如果内存出现了紧张,那系统自己会怎么办?

其实,linux自己也做了一套机制,来进行内存回收;


回收缓存,比如使用 LRU(Least Recently Used)算法,回收最近使用最少的内存页面;

  • 原理

    LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。

  • 实现

    最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:

  1. 新数据插入到链表头部;

  2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部;

  3. 当链表满的时候,将链表尾部的数据丢弃。

  • 分析

    【命中率】

    当存在热点数据时,LRU的效率很好,但偶发性的、周期性的批量操作会导致LRU命中率急剧下降,缓存污染情况比较严重。

    【复杂度】

    实现简单。

    【代价】

    命中时需要遍历链表,找到命中的数据块索引,然后需要将数据移到头部。


Swap:回收不常访问的内存,把不常用的内存通过交换分区直接写到磁盘中;

回收不常访问的内存时,会用到交换分区,也称为Swap

Swap 其实就是把一块磁盘空间当成内存来用。它可以把进程暂时不用的数据存储到磁盘中(这个过程称为换出),当进程访问这些内存时,再从磁盘读取这些数据到内存中(这个过程称为换入),Swap 把系统的可用内存变大了。

通常只有在内存不足时,才会发生 Swap 交换。

相对于内存来说,磁盘读写的速度很慢,所以Swap 会导致严重的内存性能问题。


OOM:杀死进程,内存紧张时系统还会通过 OOM(Out of Memory),直接杀掉占用大量内存的进程。

oom内核的一种保护机制,它表示“内存用完了”。它监控进程的内存使用情况,并且使用 oom_score 为每个进程的内存使用情况进行评分:

  • 一个进程消耗的内存越大,oom_score 就越大;
  • 一个进程运行占用的 CPU 越多,oom_score 就越小。

这样,进程的 oom_score 越大,代表消耗的内存越多,也就越容易被 OOM 杀死,从而可以更好保护系统。

当然,为了实际工作的需要,管理员可以通过 /proc 文件系统,手动设置进程的 oom_adj ,从而调整进程的 oom_score

oom_adj 的范围是 [-17, 15],数值越大,表示进程越容易被 OOM 杀死;数值越小,表示进程越不容易被 OOM 杀死,其中 -17 表示禁止 OOM


五、查看内存命令

一般我们会使用free来查看内存,当然,我们还可以使用ps/top等命令

先看一下free命令吧

root@iZuf67on1pthsuih96udyfZ:~/# free
total used free shared buff/cache available
Mem: 953036 388052 65808 2860 499176 377200
Swap: 0 0 0

简单的看一下每个字段的意义:

  • total 是总内存大小;
  • used 是已使用内存的大小,包含了共享内存;
  • free 是未使用内存的大小;
  • shared 是共享内存的大小;
  • buff/cache 是缓存和缓冲区的大小;
  • available 是新进程可用内存的大小。

这就是大概是linux内存相关的一些知识点,这里写的比较乱,相当于做个笔记了~~~


想了解学习更多C++后台服务器方面的知识,请关注:微信公众号:====CPP后台服务器开发====


扫码CPP后台服务器开发46e1f309d69d74a47e228604ab60d309.png70a6a50c5396ae778df9b468a953854b.png11d4dbc13db6dcdf67bf0f67770542bb.png6077567a82646c767d1cc0033fe32620.gif2673fe51588566950d4554539c68c03c.gifd0d0c5b849f21bc30bbc3a81366569a6.png转载是一种动力 分享是一种美德

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

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

相关文章

android studio 2.3 instant run,android studio 2.3 instant run not working

可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):问题:I have updated android studio from 2.2 to 2.3,then I found Instant run not working.Error while executing: am startservice com.example.codingmaster.te…

和catch的区别_BIO、NIO、AIO 的区别是什么?

BIO、NIO、AIO 的区别是什么?同/异步、阻/非阻塞的区别是什么?文件读写最优雅的实现方式是什么?NIO 如何实现多路复用功能?带着以上这几个问题,跟着芒果一起进入IO的世界吧。在开始之前,我们先来思考一个问…

302状态码_HTTP协议详解(基础概念 方法 状态码 首部 连接 Cookie 新特性 安全)

一 、基础概念URIURI 包含 URL 和 URN。请求和响应报文1. 请求报文2. 响应报文二、HTTP 方法客户端发送的 请求报文 第一行为请求行,包含了方法字段。GET获取资源当前网络请求中,绝大部分使用的是 GET 方法。HEAD获取报文首部和 GET 方法类似&#xff0c…

flask get 参数_用它 5 分钟以后,我放弃用了四年的 Flask

“ 阅读本文大概需要 3 分钟。 ”有一个非常简单的需求:编写一个 HTTP 接口,使用 POST 方式发送一个 JSON 字符串,接口里面读取发送上来的参数,对其中某个参数进行处理,并返回。如果我们使用 Flask 来开发这个接口&…

android sse 人脸识别,基于Android Camera2之openCamera 流程

简介frameworks\base\core\java\android\hardware\camera2Camera2在Android 5.0上首次出现,主要重新定义了一套Camera 的使用接口API,设计思想出现了变化,具体的可自行搜索,此处主要介绍下Camera2的常见类以及使用流程。CameraCap…

vscode编辑python_VSCode+Python开发环境

准备开始转向用VSCode做开发,所以把一些常用的开发环境转移到VSCode上。 这次搭建的是Python3的开发环境。 其他相关博文: 一、测试环境 Windows 10 VSCode v1.11.1 Python v3.6.1 二、安装Visual Studio Code 三、安装Python这一步,记得…

html5 css3浏览器,五大主流浏览器CSS3和HTML5兼容性大比拼

五大主流浏览器CSS3和HTML5兼容性大比拼出处:快科技 2011-05-26 16:15:42 编辑:萧萧[爆料] 收藏文章各大主流浏览器对CSS3和HTML5的支持越来越完善,曾经让多少前端开发人员心碎的IE系也开始拥抱标准。就在前几天,W3C的HTML5社…

一个控制器怎么转发到另外一个控制器_楼宇自动化系统(BAS),DDC,一个最核心的控制器...

楼宇自动化系统(BAS),一个熟悉又陌生的系统楼宇自控系统(BAS系统)设有一个中央监控中心,系统配置一个或多个网络控制器,由多条总线或计算机网络将各种功能的控制器与中央工作站相连,完成对空调、给排水、通风、电梯等子系统的监控…

html封装windows,windows 系统封装,打造一份属于自己的系统!

在电脑的使用过程中,由于我们每个人的使用习惯和使用方式不同,所以我们都会对Windows系统进行自己的设置,尤其是一些搞数码软件的,如果不小心系统坏了,重装系统后,还得一一去进行重新设置,非常麻…

python语言例子_【Python】SimPy的使用示例-Go语言中文社区

使用SimPY进行离散事件仿真 SimPY是一个Python下的第三方库,可以方便的进行离散事件的仿真。仿真速度比较快。下面记录一下我的一点心得,不保证完全正确,供参考。 安装 $ pip install -U simpy pycharm可以再File | Settings | Project: Simu…

vue变量传值_VUE 学习——父组件传值给子组件

在我们编写前端代码时,经常遇到的一种场景,子组件需要使用父组件的值,这种情况下,我们可以使用props帮助我们进行父子组件间的通信。这里我们先模拟一个场景,展示如何使用。场景:在父组件修改值&#xff0c…

matlab 最小二乘法拟合_Scripy实现最小二乘法与股票K线回归

python的Scripy提供了丰富的数学工具,python的科学计算包scipy的里面提供了一个函数,可以求出任意的想要拟合的函数的参数。那就是scipy.optimize包里面的leastsq函数。函数原型是:leastsq(func, x0, args(), DfunNone, full_output0, col_de…

html 调高德地图 导航,在H5页面内通过地址调起高德地图实现导航

项目中用到的一个功能是要通过点击地址来实现打开地图app实现地址导航。如下图:实现思路就是在H5页面内通过点击marker图标然后进行当前位置与页面上地址的路程规划与导航。由于项目中用到的是高德地图,所以这里用到的是调起高德地图APP来实现该功能。首…

.jar文件如何打开_ofd发票文件如何打开

有时候大家查找文件的时候会不会觉得很心烦,因为经常能碰到OFD格式的文件,但是我们却不知道怎么打开,造成了很多困扰。我以前也常常遇到这样的情况,但是最近我发现了一个好办法,迫不及待地想分享给大家了,可…

印刷体是什么意思_家长晒出4年级小学霸课前笔记,字迹堪比“印刷体”,老师都羡慕...

目前,很多小学生都在家里上网课,为了达到最佳学习效果,要提前做好预习工作,尤其是语文这一学科,更需要预习。这不就有一位4年级学霸的家长晒出了孩子日常课前预习笔记。他不仅对文章进行了合理的布置和预习&#xff0c…

不使用自带函数求区域的周长_Excel表格中最强大求和函数______DSUM函数

在Excel表格中说起求和函数,朋友们首先会想到的是sum、sumif、和sumifs函数。这篇文章为朋友们分享最强大求和函数,数据库函数之DSUM函数。这个函数不仅能完成各种要求的求和,还可以用于查找。一.DSUM函数说明:1.语法:…

python 用if判断一个数是不是整数_Python基础教程07-函数和模块的使用

在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解。x1x2x3x48事实上,上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案。想到这一点问题的答案就呼之欲出了。可以用Python的程序来计算出这个…

前端跨域请求get_(单点登录)跨域SSO看这篇文章就够了:前端篇

前言前俩篇文章,我们从概念,聊到了服务器中设计的内容。不知道大家是否觉得通俗易懂呢?接下来的内容则有些偏向前端部分。正文三、Cookie传递3.1、通过URL参数实现跨域信息传递我们要在A域实现写入token到B域,需要在A域设计一个se…

win10 如何锁定计算机,Win10 1909 专业版怎么锁定计算机屏幕

Win10 1909 专业版怎么锁定计算机屏幕?如果我们需要暂时离开计算机,但不想关机或者注销当前登录,那么为了防止未经授权的使用,我们可以将计算机锁定。在本文中,win10之家小编给大家分享如何自动锁定Windows 10计算机。Win10 1909…

qfile指定从多少行开始_大牛进化路上之Linux基础命令,看看你了解多少?

玩转Linux系统还是要从基础命令开始,基础命令是你大牛发展之路的第一步,扎实的基本命令操作功底才能在工作中游刃有余,下面我们就来看看吧。路径切换说明Linux中分绝对路径和相对路径,绝对路径一定是从/开始写的,还可能…