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 来开发这个接口&…

傲梦python笔试题_python笔试题

冒泡排序的原理:每次对相邻的两个元素进行比较,若前者大于后者,这将两者的位置交换。第一轮就可以将最大的元素置于列表的最后。几轮循环 冒泡排序的前提条件:有序的列表 import unittest # 冒泡排序 def bubble_sort(arr): for i…

python pexpect pxssh scp_python Pexpect 实现输密码 scp 拷贝的方法

在服务器A上的程序用到服务器B上的文件data,并且需要定期更新文件。 但是直接在bash文件中使用scp -P 1000 192.168.199.10:/temp/data /temp由于权限限制,不能免ssh密码拷贝,会要求输入B机器的密码。本想直接在bash文件中使用Pexpect 来实现…

python的类方法_python 类不实例化,调用类方法:@staticmethod 和 @classmethod

staticmethod 和 classmethod 用法 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。 而使用staticmethod或classmethod,就可以不需要实例化,直接类名.方法名()来调用。 这有利于组织代码,把某些应该属于…

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

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

fetch 不是xhr_春招|前端2019应届春招:不是被大厂选,而是选大厂(字节跳动,美团,网易)...

作者:Thescavenger链接:https://www.nowcoder.com/discuss/163165来源:牛客网你需要的前端面经个人情况本科,成都双非大学,大三开始正式学习前端,主攻 react,目前大四。已拿美团、字节跳动 offe…

vscode编辑python_VSCode+Python开发环境

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

多帧点云数据拼接合并_PCL点云处理实践(二):点云的处理和拼接

滤除背景我们获得的点云可能包含一部分背景的点云。要去除背景&#xff0c;只保留人体信息&#xff0c;最简单的方式是使用直通滤波器滤除较远点。这部分代码如下&#xff1a;123456pcl::PassThrough<:pointxyz>pass; //设置滤波器对象pass.setInputCloud(cloud); //设置…

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

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

自学python 编程基础知识_python学习-基础知识-1

1、计算机历史 计算机使用高低电压的两种状态来描述信息。计算机可以理解的只有二进制数据即010100011....&#xff0c;1个比特位可以表示的状态只有2种&#xff0c;n个比特位可以表示的状态有2的n次方种。 所以如果想要描述天气状态&#xff1a;天晴、下雨、刮风、下雪、霜冻&…

comparator 字符串比较大小_Java中Comparable和Comparator实现对象比较

当需要排序的集合或数组不是单纯的数字型时&#xff0c;通常可以使用Comparator或Comparable&#xff0c;以简单的方式实现对象排序或自定义排序。A comparison function, which imposes a total ordering on some collection of objects. Comparators can be passed to a sort…

html中属性的作用,html的标签中 unselectable=on 属性的作用

在IE浏览器中&#xff0c;当input获得焦点时&#xff0c;点击有unselectable"on"属性的标签时&#xff0c;不会触发onblur事件。加上该属性的元素不能被选中。< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">< html>< h…

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

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

秒表计时器怎么读_秒表怎么读数

展开全部秒表的大圈为秒&#xff0c;小圈为分。若大圈是30分格(顶上写的是30&#xff0c;可能有60格&#xff0c;表明精度到半秒)&#xff0c;小圈里62616964757a686964616fe59b9ee7ad9431333431366239一分钟就分为两小格&#xff0c;读完整的几分&#xff0c;若过了一小格&…

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

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

daoi php_聊聊这些年用过的AOI

外面下着雨&#xff0c;我在家里宅&#xff0c;听着歌喝着去年的茶&#xff0c;无聊的很&#xff0c;开个话题聊下这些年用过的AOI。某年进入AOI这行&#xff0c;我的很多老同事都早已转行了&#xff0c;由于我没什么过人之处&#xff0c;只会死干&#xff0c; 现在还在做AOI。…

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

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