深入解析Linux内存页管理机制(linux内存页)

Linux操作系统被广泛使用,因为其稳定性和开放性,使其成为许多企业和个人的首选。在Linux系统中,内存管理是一个非常重要且复杂的任务。在这篇文章中,我们将,了解该机制对Linux应用程序的性能和稳定性的影响。

创新互联建站长期为近千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为建邺企业提供专业的网站建设、成都网站制作建邺网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。

1. 什么是内存页管理?

内存页管理是一种Linux内核提供的管理内存页面的方法。在Linux中,内存被分为许多小的页面(通常为4KB),并且每个页面都有一个唯一的标识符,称为页帧号(PFN)。内存页管理的主要目的是为内核和用户空间应用程序提供透明的内存分配和管理机制。

2. Linux内核中的内存页管理

Linux内核中的内存页管理机制由以下三个部分组成:

– 物理内存:这是计算机中实际的内存,通常是随机访问存储器(RAM)。

– 逻辑内存:这是系统中应用程序使用的内存,它分为用户空间和内核空间。

– 内存管理单元(MMU):这是负责将逻辑内存映射到物理内存的硬件组件。

Linux内核中的内存页管理机制包括以下几个重要的功能:

– 内存页面分配:当用户空间应用程序需要内存时,Linux内核会使用页帧号(PFN)来映射空闲的物理页面,并为应用程序分配逻辑内存。

– 页面交换:当Linux内核需要更多的内存来运行应用程序时,它会将一些内存页面交换到磁盘上以释放物理内存。

– 页面缓存:为了加快访问文件和文件系统数据的速度,Linux内核维护了一个页面缓存,其中包含最近访问过的数据页面。

– 页表:该页表是负责管理物理内存和逻辑内存之间的映射关系的数据结构。

3. Linux中的内存分配器

Linux中有多个内存分配器,包括SLAB分配器、SLUB分配器和SLOB分配器。它们都有各自的优点和缺点。

– SLAB分配器:SLAB分配器是Linux内核中最古老的分配器,它可以提供高速的分配,但需要大量的内存来管理分配。因此,它通常用于分配大块内存(例如文件系统缓存)。

– SLUB分配器:SLUB分配器是Linux内核中较新的分配器,它提供了较快的分配速度和较低的内存利用率。由于它使用的内存比较少,因此通常用于分配小块内存(例如内核数据结构)。

– SLOB分配器:SLOB分配器是最简单的分配器,它旨在处理低内存环境中的内存分配。它可以实现简化的内存管理,但可能会导致更高的内存碎片。因此,它通常用于嵌入式系统或其他具有非常受限内存的系统。

4. 内存管理的性能和稳定性

在Linux系统中,内存管理的性能和稳定性是至关重要的。如果内存管理不良,则可能会导致系统崩溃或出现其他问题。

Linux中的内存管理器需要处理多个因素,包括内存压力、内存碎片和页面交换。它必须平衡这些因素,并通过使用适当的分配器和算法来优化内存使用。

此外,Linux系统中的内存页管理机制具有高度的灵活性和可配置性。管理员可以使用不同的内存分配器和管理器来优化内存使用,而不会对系统的可靠性和稳定性产生负面影响。

Linux内存页管理机制是一个非常复杂但又非常重要的部分,对于系统的性能和稳定性有着巨大的影响。理解内存页管理机制的工作原理可以帮助管理员优化内存使用,并确保系统的可靠性和稳定性。

成都网站建设公司-创新互联为您提供网站建设、网站制作、网页设计及定制高端网站建设服务!

为什么linux kernel默认的页面大小是4K,而不是4M或8M

太多了,我就做一次搬运工了。

相信很多人在看内核内存管理部分的时候,都有这样一个疑问,为什么物理页面的大小选择4K,而不是大一些或者小一些呢?

这个问题没有固定的答案,仁者见仁智者见智,每个人的关注点不一样。所以这篇文章不是说给出一个固定的答案,更多的只是一篇讨论性的文章。

内核的页面大小首先跟CPU有关,不同的架构支持的页面大小也不相同,但有一个共同点,那就是肯定支持4K的页面大小。为什么处理器在设计

的时候会选择4K,而不是其他,这个只有熟悉CPU历史的人才能给出答案,本人才疏学浅,回答不上来,有兴趣的自己找一找。当然处理器的设计者在考虑页面

大小的时候,也不是凭空就选择了这个大小,除了历史因素,肯定综合了考虑了大页面、小页面的优缺点,所以这里主要列出这些优缺点,通过这些比较来发现内核

为什么将默认的页面大小选择为4K。

现在更多争论的是大页面还是维持现在的页面4K大小,所以小页面的情况我们就不考虑了,通过比较前两者也可以得出小页面的情况。支持大页面的人通常认为大页面有以下好处:

1、减小page table占用的内存。

假设内存一定的话,页面大桐袭旅小越大,管理页面占用的内存也越小。现在内核中每个页面假设是4K的话,这4K不是全都可用,还有一部分用作

struct

page(大约是64bytes),如果是2.6.32的话,每个页还有一个page_cgroup(32bytes),也就是说内存大小的2.3%

(96/4096)会被内核固定使用。如果页面大小是4M的话,这个比率大约是0.0006%。假设内存时64G的话,页面大小是4K,管理页占用的内存

为1.472G,而页面大小是4M,管理页面占用的内存为0.393M。所以页面比较大时,节省的内存比较多。

2、提高TLB的命中率

每次访问内存的时候,都要将

虚拟

地址转换为

物理地址

,如果每次都访问页表的话,消耗比较大。因此,通常使用TLB来加速这个过程。但是

TLB的可以直接转换的地址范围是有限的(具体就是项数乘以页面大小),一旦出现TLB

miss,这时就必须去页表中查找。所以,如果是大页面的话,同样TLB项数的情况下,可以跟踪更大的内存。

3、提高磁盘I/O

我们知道在访问磁盘时,最耗时的操作就是查找写入盘区的起始位置,也就是在磁盘盘片上将读写头置于正确的位置上。所以如果是大页面的话,可以减少写入磁盘的次数。比如要写入4M的缓存,页面大小是4M的话,局凳只需写入1次,而页面大小是4K的话,则需要写入4次。

4、提供缓存利用率

如果是大页面的话,可以减少访问伙伴系统的次数。调用伙伴系统的操作队系统的数据和指令

高速缓存

有相当的影响。内核越浪费这些资源,这些资源对用户空间进程就越不可用。

除了上面提高的好处,肯定还有的好处,就不一一列举了。那既然有这么好处,而且现在内存越来越大,为什么不更多地采用大页面呢?比如4M?

软件开发中,从来不会有

非常完美

的方案,都是在优缺点之间找到平衡点。同样,大页面有这样那样的好处,缺点也很明显。

1、更大的问题就是内存浪费,而且这个问题非常严重。比如这时要分配的内存是4M+1byte,这时需要两个页面才能满足分配的需要,这个

时候浪费的内存为4M-1byte。如果页面是4K的话,浪费的内存数量为4k-1byte。页面太大,可能导致每个页面都只使用了部分空间,剩余的空间

就被浪费了。当然对于数据库这样的系统来说,页面越大会越好,但是内核要考虑到通用的情况,而不是专注于特殊的应用场景。再比如,现在系统都是只分配虚拟

地址空间,虚拟地址空间只有在真正被访问的时候,才映射物理页面,而且为了减少物理页面的浪费,对不访问的部分,则不作映射。如果页面太大,在映射很小的

部分时,分配的内存会越大,浪费也就越大。系统在运行时,会频繁地请求内存页的操作,这样导致潜在的浪费会非常严重。这样的浪费会完全抵消减小page

table的优势。

2、页面太大,会导致大量的内存碎片。因为底层的内存管理是以页面为单位。如果系统运行了很长时间,空闲的内存很多,但是连续的内存块都小

于要分配的页面数。这时可以通过移动内存块或者利用swap来获取可用内存,但是会导致分配内存的操作很慢,这种慢会形成恶性循环,严重影响系统的禅嫌性能。

如果是小页面的话,内存的利用会比较紧凑,分配页面时需要的连续内存块的大小不像大页面那样需要的那么大。

3、如果CPU崩溃,TLB可以访问的内存越大,对系统的影响也越大。这时一把

双刃剑

,大页面可以提供TLB访问的内存数量,但是CPU崩溃时,会导致很多内存访问要去页表中请求物理地址。

4、兼容性问题。X86处理器支持的页面大小只有4K,所以如果页面过大的话,会导致兼容性问题。

5、如果页面太大,在将内存页换出到swap分区时,需要换出的内存也就越大,会影响性能。

总之,这个页面大小4K是在计算机发展过程中选择的,也是在实践中经过检验的,现在看来这个页面是合适的。

linux内核0.11 获取之一个空闲物理内存页的函数 get_free_page函数 问题

198 unsigned long get_free_page(void)

199{

200 unsigned long result;

201

202repeat:

203 __a__(“std ; repne ; sca\此判n\t”

204 “jne 1f\n\t”

205 “movb $1,1(%%edi)\n\t”

206 “sall $12,%%ecx\n\t”

207 …

215 :”0″ (0),”i” (LOW_MEM),”c” (PAGING_PAGES),

216 “D” (mem_map+PAGING_PAGES-1)

217 :”di”,”cx”,”dx”);

223 }

224 if (!result && swap_out())

225 goto repeat;

226 return result;

227}

在这段代码中, 没有存在中断屏蔽cli , 而在fork系统调用中直接使用这个函数, 如果在执行到204的时森弯改候被中断, 并且其他进闹桥程也调用fork系统调用执行完这个函数, 这样就会导致同一页被引用两次, 而mark数值 1 而造成数据重复的错误. 不知道会不会造成这样子的错误.

问题关键在于理解以下棚敏槐指令:

“std ; repne ; sca\n\t”

1、std:方向位DF置位,即DI进行自减操作。

2、repne; sca

这两条组合指令实现循环比较。ecx初值为15*1024,al=0,di初值为&mem_map,即从数组mem_map的最后一项开始,依次与al(=0)进行比较。假设数组第i项mem_map==0,则结束循环,此时ecx=i, edi=&mem_map(因为ecx初值为15*1024,di初值为数组最后一项15*1024-1的地址)。找到空闲页面后,将该数组项置1,即*(edi+1)=mem_map=1,即语链友句“movb $1,1(%%edi)”实现的功能。此时,ecx即为空闲页面索引。

几点说明:

1、rep循环结束条件拿春:

Repeat Prefix Termination Condition 1 Termination Condition 2

REPRCX or (E)CX = None

REPE/REPZRCX or (E)CX = ZF = 0

REPNE/REPNZ RCX or (E)CX = ZF = 1

2、rep循环执行顺序:

WHILE CountReg ≠ 0

DO

Service pending interrupts (if any);

Execute associated string instruction; // 1、执行相关指令。例如scan指令,除了执行al与*di的比较外,di也会被影响,即di自减1(当DF==1时)或自加1(当DF==0时)

CountReg ← (CountReg – 1); // 2、ECX自减

IF CountReg = 0 // 3、判断ECX是否已减到0

THEN exit WHILE loop; FI;

IF (Repeat prefix is REPZ or REPE) and (ZF = 0) // 4、最后才判断其他相关标志。

or (Repeat prefix is REPNZ or REPNE) and (ZF = 1)

THEN exit WHILE loop; FI;

OD;

3、sca指令对di的影响:

After the comparison, the (E)DI register is incremented or decremented automatically according to the setting of

the DF flag in the EFLAGS register. If the DF flag is 0, the (E)DI register is incremented; if the DF flag is 1, the (E)DI

register is decremented. The register is incremented or decremented by 1 for byte operations, by 2 for word operations, and by 4 for doubleword operations.

linux 内存页的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux 内存页,深入解析Linux内存页管理机制,为什么linux kernel默认的页面大小是4K,而不是4M或8M,linux内核0.11 获取之一个空闲物理内存页的函数 get_free_page函数 问题的信息别忘了在本站进行查找喔。

创新互联-老牌IDC、云计算及IT信息化服务领域的服务供应商,业务涵盖IDC(互联网数据中心)服务、云计算服务、IT信息化、AI算力租赁平台(智算云),软件开发,网站建设,咨询热线:028-86922220

本文题目:深入解析Linux内存页管理机制(linux内存页)
URL分享:http://www.shufengxianlan.com/qtweb/news47/273647.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联