linux 内存是后台开发人员,需要深入了解的计算机资源。合理的使用内存,有助于提升机器的性能和稳定性。本文主要介绍 linux 内存组织结构和页面布局,内存碎片产生原因和优化算法,linux 内核几种内存管理的方法,内存使用场景以及内存使用的那些坑。从内存的原理和结构,到内存的算法优化,再到使用场景,去探寻内存管理的机制和奥秘。
1、内存是什么?
1)内存又称主存,是 CPU 能直接寻址的存储空间,由半导体器件制成;
2)内存的特点是存取速率快,断电一般不保存数据,非持久化设备;
2、内存的作用
1)暂时存放 cpu 的运算数据
2)硬盘等外部存储器交换的数据
1、linux 内存地址空间 Linux 内存管理全貌
2、内存地址——用户态&内核态
3、内存地址——MMU 地址转换
4、内存地址——分段机制
逻辑地址的段寄存器中的值提供段描述符,然后从段描述符中得到段基址和段界限,然后加上逻辑地址的偏移量,就得到了线性地址
5、内存地址——分页机制(32 位)
6、用户态地址空间
7、内核态地址空间
8、进程内存空间
内存管理算法——对讨厌自己管理内存的人来说是天赐的礼物
Linux 内存管理框架
1、内存碎片
2、伙伴系统算法——组织结构
3、伙伴系统算法——申请和回收
4、如何分配 4M 以上内存?
5、伙伴系统——反碎片机制
6、slab 算法——基本原理
7、slab 分配器的结构
详细参考: [ 经典|图解Linux内存性能优化核心思想]
8、slab 高速缓存
9、内核态内存池
10、用户态内存池
11、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、共享内存
shmget 创建共享内存
shmat 启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间
shmdt 将共享内存从当前进程中分离
1、C 内存泄露
2、C 野指针
3、C 资源访问冲突
4、STL 迭代器失效
错误示例:删除当前迭代器,迭代器会失效
正确示例:迭代器 erase 时,需保存下一个迭代器
5、C++ 11 智能指针
(1)原理分析:
(2)数据结构:
(3)使用方法:
6、C++ 11 更小更快更安全
六、 如何查看内存
$cat /proc/meminfo
MemTotal: 8052444 kB #所有内存(RAM)大小,减去一些预留空间和内核的大小。
MemFree: 2754588 kB #完全没有用到的物理内存,lowFree+highFree
MemAvailable: 3934252 kB #在不使用交换空间的情况下,启动一个新的应用最大可用内存的大小,计算方式:MemFree+Active(file)+Inactive(file)-(watermark+min(watermark,Active(file)+Inactive(file)/2))
Buffers: 137128 kB #块设备所占用的缓存页,包括:直接读写块设备以及文件系统元数据(metadata),比如superblock使用的缓存页。
Cached: 1948128 kB #表示普通文件数据所占用的缓存页。
SwapCached: 0 kB #swap cache中包含的是被确定要swapping换页,但是尚未写入物理交换区的匿名内存页。那些匿名内存页,比如用户进程malloc申请的内存页是没有关联任何文件的,如果发生swapping换页,这类内存会被写入到交换区。
Active: 3650920 kB #active包含active anon和active file
Inactive: 1343420 kB #inactive包含inactive anon和inactive file
Active(anon): 2913304 kB #anonymous pages(匿名页),用户进程的内存页分为两种:与文件关联的内存页(比如程序文件,数据文件对应的内存页)和与内存无关的内存页(比如进程的堆栈,用malloc申请的内存),前者称为file pages或mapped pages,后者称为匿名页。
Inactive(anon): 727808 kB #见上
Active(file): 737616 kB #见上
Inactive(file): 615612 kB #见上
SwapTotal: 8265724 kB #可用的swap空间的总的大小(swap分区在物理内存不够的情况下,把硬盘空间的一部分释放出来,以供当前程序使用)
SwapFree: 8265724 kB #当前剩余的swap的大小
Dirty: 104 kB #需要写入磁盘的内存去的大小
Writeback: 0 kB #正在被写回的内存区的大小
AnonPages: 2909332 kB #未映射页的内存的大小
Mapped: 815524 kB #设备和文件等映射的大小
Shmem: 732032 kB #共享内存大小
Slab: 153096 kB #内核数据结构slab的大小
SReclaimable: 99684 kB #可回收的slab的大小
SUnreclaim: 53412 kB #不可回收的slab的大小
KernelStack: 14288 kB
PageTables: 62192 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 12291944 kB
Committed_AS: 11398920 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
HardwareCorrupted: 0 kB
AnonHugePages: 1380352 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 201472 kB
DirectMap2M: 5967872 kB
DirectMap1G: 3145728 kB
当前系统的buddy状态可以通过 cat /proc/buddyinfo
命令查看
cat /proc/buddyinfo
Node 0, zone DMA 23 15 4 5 2 3 3 2 3 1 0
Node 0, zone Normal 149 100 52 33 23 5 32 8 12 2 59
Node 0, zone HighMem 11 21 23 49 29 15 8 16 12 2 142
可以通过 cat /proc/slabinfo 命令查看
cat /proc/slabinfo
slabinfo - version: 2.1
# name <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
bridge_fdb_cache 0 0 64 59 1 : tunables 120 60 0 : slabdata 0 0 0
nf_conntrack_expect 0 0 240 16 1 : tunables 120 60 0 : slabdata 0 0 0
nf_conntrack_ffffffff81f6f600 0 0 304 13 1 : tunables 54 27 0 : slabdata 0 0 0
iser_descriptors 0 0 128 30 1 : tunables 120 60 0 : slabdata 0 0 0
ib_mad 0 0 448 8 1 : tunables 54 27 0 : slabdata 0 0 0
fib6_nodes 22 59 64 59 1 : tunables 120 60 0 : slabdata 1 1 0
ip6_dst_cache 13 24 320 12 1 : tunables 54 27 0 : slabdata 2 2 0
ndisc_cache 1 10 384 10 1 : tunables 54 27 0 : slabdata 1 1 0
ip6_mrt_cache 0 0 128 30 1 : tunables 120 60 0 : slabdata 0 0 0
可以通过 /proc/sys/vm/drop_caches来释放
#To free pagecache, use
echo 1 > /proc/sys/vm/drop_caches
#To free dentries and inodes, use
echo 2 > /proc/sys/vm/drop_caches
#To free pagecache, dentries and inodes, use
echo 3 >/proc/sys/vm/drop_cache
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/biuw4zAmmjbESRw9SRmXww
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。