linux 内存分配?linux压缩软件
超详细|Linux 如何进行内存分配
Linux操作系统中的虚拟内存管理分为内核空间和用户空间两大部分。在32位和64位系统中,地址空间范围不同,每个进程拥有独立的虚拟内存,内核地址关联相同物理内存,便于进程切换至内核态访问。用户空间内存分布,以32位系统为例,从低到高分为6种不同的内存段。
申请内存空间通常有两种方式:malloc和mmap。使用malloc时,系统可能调用brk或mmap函数。当分配小型内存(小于或等于128kb),malloc会通过brk函数移动堆顶指针获取新空间;分配大型内存(大于128kb)时,mmap通过私有匿名映射在文件映射区分配内存。
malloc分配的是虚拟内存,未被访问的虚拟内存不会映射到物理内存,不占用物理内存资源。访问已分配虚拟地址空间时,操作系统通过查找页表建立虚拟内存与物理内存映射关系。缺页中断发生在虚拟内存不在主存时,系统将文件映射为分页交换文件。
分配内存后使用free释放内存,malloc通过brk系统调用在堆空间预分配内存,内存释放缓存在内存池,下次申请时直接取用,减少了系统调用和缺页中断次数,降低CPU消耗。相反,使用mmap分配内存每次释放时归还给操作系统,频繁使用mmap分配内存会导致CPU消耗较大,且增加运行态切换和缺页中断次数。
通过brk分配内存时,连续申请并释放大块内存后,堆内可能产生不可用的碎片,导致内存泄露。随着频繁的malloc和free操作,尤其是对小块内存的使用,系统内将累积越来越多不可用的碎片,引发“内存泄露”问题,这种现象在使用valgrind时无法检测。因此,malloc默认分配大块内存(128KB)时使用mmap分配空间,以优化内存管理。
linux共享内存分配
在Linux系统中,进程通过调用 shmget(共享内存获取)函数来申请一块可以供多个进程共享的内存区域。这个函数的使用需要三个关键参数。
首先,第一个参数是一个唯一的键值,用于标识共享内存。为了创建一个独占的内存块,进程可以使用IPC_PRIVATE常量作为键值。然而,如果其他进程也选择相同的键值,可能会导致冲突。通过指定一个已存在的键值,进程可以访问已存在的共享内存块,前提是权限允许。
第二个参数是所请求内存的大小。系统会以页面大小为单位进行分配,所以实际分配的内存大小会是页面大小的整数倍。这意味着,即使请求的大小不是页面的整数倍,也会向上取整分配。
第三个参数是一组标志,通过按位或操作来控制共享内存的行为。IPC_CREAT标志用于创建新的共享内存块,如果键值已被占用,只有当同时使用IPC_EXCL标志时,函数才会失败并拒绝创建。IPC_EXCL可以确保进程获得的是一个独占的内存块,而非共享现有资源。
权限控制由模式标志(通常由S_IRUSR, S_IWUSR, S_IROTH, S_IWOTH等常量组合)完成,这些标志决定了属主、属组和其他用户对内存块的访问权限。例如,S_IRUSR和S_IWUSR允许属主读写,S_IROTH和S_IWOTH则允许其他用户只读或只写。在创建共享内存时,可以设置这些标志来限制访问权限。
如果shmget调用成功,它会返回一个标识符,用于后续对共享内存的操作。如果内存块已存在,系统会检查权限和销毁标记。这样,进程就能有效地管理和共享内存资源。
内存管理:一文读懂Linux内存组织结构及页面布局
1、内存是什么?
1)内存又称主存,是 CPU能直接寻址的存储空间,由半导体器件制成;
2)内存的特点是存取速率快,断电一般不保存数据,非持久化设备;
2、内存的作用
1)暂时存放 cpu的运算数据
2)硬盘等外部存储器交换的数据
3)保障 cpu计算机的稳定性和高性能
1、linux内存地址空间 Linux内存管理全貌
2、内存地址——用户态&内核态
3、内存地址——MMU地址转换
4、内存地址——分段机制
1)段选择符
更多Linux内核视频教程文档资料免费领取后台私信【内核】自行获取。
内核学习网站:
Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈-学习视频教程-腾讯课堂
2)分段实现
5、内存地址——分页机制(32位)
6、用户态地址空间
7、内核态地址空间
8、进程内存空间
内存管理算法——对讨厌自己管理内存的人来说是天赐的礼物
1、内存碎片
1)基本原理
2)如何避免内存碎片
2、伙伴系统算法——组织结构
1)概念
2)外部碎片
3、伙伴系统算法——申请和回收
1)申请算法
2)回收算法
3)条件
4、如何分配 4M以上内存?
1)为何限制大块内存分配
2)内核中获取 4M以上大内存的方法
5、伙伴系统——反碎片机制
1)不可移动页
2)可回收页
6、slab算法——基本原理
1)基本概念
2)内部碎片
7、slab分配器的结构
详细参考:
经典|图解Linux内存性能优化核心思想
8、slab高速缓存
1)普通高速缓存
2)专用高速缓存
9、内核态内存池
1)基本原理
2)内核 API
10、用户态内存池
1) C++实例
11、DMA内存
1)什么是 DMA
2) DMA信号
out of memory的时代过去了吗?no,内存再充足也不可任性使用。
1、内存的使用场景
2、用户态内存分配函数
a)如果当前连续内存块足够 realloc的话,只是将 p所指向的空间扩大,并返回 p的指针地址。这个时候 q和 p指向的地址是一样的
b)如果当前连续内存块不够长度,再找一个足够长的地方,分配一块新的内存,q,并将 p指向的内容 copy到 q,返回 q。并将 p所指向的内存空间删除
3、内核态内存分配函数
4、malloc申请内存
5、缺页异常
6、用户进程访问内存分析
7、共享内存
1)原理
2) shm接口
1、C内存泄露
2、C野指针
3、C资源访问冲突
4、STL迭代器失效
错误示例:删除当前迭代器,迭代器会失效
正确示例:迭代器 erase时,需保存下一个迭代器
5、C++ 11智能指针
(1)原理分析:
(2)数据结构:
(3)使用方法:
6、C++ 11更小更快更安全
六、如何查看内存
可以通过 cat/proc/slabinfo命令查看
可以通过/proc/sys/vm/drop_caches来释放