内存管理---匿名页面管理

一、匿名页面

这些内存页面保存了一些通常所说的机动性最强的内容,或者可以认为是银行的活期存款,这些内存可以随时被使用,随时被归还。例如用户通过malloc–>>mmap申请的内存,或者通过brk/sbrk扩大的堆空间。相对于mmap文件、文件系统元数据之类的内容,这些空间对用户来说最为顺手,也最为常见。但是管理起来也比较复杂,因为这里涉及到这些页面如果被同时使用了很多,系统内存负载将会变的很重,此时系统的虚拟内存就要起作用,将这些页面换到慢速二级存储设备,例如硬盘上。但是此时同样会涉及到一个问题,因为一个页面可以被几个进程共享,例如fork出的子进程和父进程可能会共享相同的页面,此时将一个页面swap到二级存储设备上之后,此时每个进程的pte项都需要做相应的一次性修改。这些pte项指向的页面即将被周转做其它用处,而他们指向的真正数据内容将会被虚拟到二级存储设备上。
这里有两个需要直面的基本问题:
第一个问题就、是如何找到一个页面是被哪些(所有的)进程的pte指向。找到这些之后,需要将这些pte逐一修改,并让它们指向换出的二级存储设备上。
第二个问题是将哪些页面换出去?系统中可能有很多的匿名页面,可能有些正在镁光灯下呼风唤雨,有些可能在角落里被人默默遗忘。比如说当前用户正在打WAR3,那么可能这个程序使用的大量内存资源都会在一段时间内别频繁使用(一局比赛正常来说10–40mins);相反的,一个周期性运行的后台任务可能只有每隔一段时间才运行一段时间,例如某些客户端的后台更新任务。此时一个优秀的系统应该能够准确的将长时间不用的页面置换出去,最近长被使用的保留在内存中,这就是Latest Recently Used算法(最近最少被使用),也就是内核中最为常见的LRU缩写的来源。

二、匿名空间的申请

和IP地址空间一样,一个进程的地址空间也是一个重要的资源。最近据说IPV4地址已经告罄,就像之前大家觉得IPV4地址足够使用一样,在没有使用大型软件之前,可能也是觉得4G逻辑地址空间是足够使用的,但是我还是有幸遇到了地址空间被用完而导致的分配失败问题,作为无意义的测试,可以尝试不断mmap,直到自己地址被使用完。
废话了一段,大致的意思是想说,地址作为一种资源,你如果想使用的话,就必须先申请。你申请到了也可以不用,但是系统不能再将这些地址分配其它人,除非你通过munmap告诉系统这个地址空间已经使用完毕,此时才可以再次分配给其它人。虽然说大部分用户态编程都是使用malloc来分配,但是malloc的底层在linux下正是通过mmap来实现,通过strace可以明显的看到对于mmap的系统调用:

[root@Harry malloc]# cat malloc.c 
\#include <stdlib.h>
int main()
{
    printf("Hello\n");这里添加两个打印是为了在strace中起到定界的作用,从而可以知道malloc使用的系统调用
     malloc(0x100000);
    printf("world\n");
}
[root@Harry malloc]# strace ./a.out 
write(1, "Hello\n", 6Hello
)                  = 6
mmap2(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77af00
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值