Linux内核源代码情景分析-内存管理

用户空间的页面有下面几种:

1、普通的用户空间页面,包括进程的代码段、数据段、堆栈段、以及动态分配的“存储堆”。

2、通过系统调用mmap()映射到用户空间的已打开文件的内容。

3、进程间的共享内存区。

这些页面的的周转有两方面的意思。

1、页面的分配,使用,回收。如进程压栈时新申请的页面,这类页面不进行盘区交换,不使用时释放得以回收。

这部分通过一个场景来解释:

Linux内核源代码情景分析-内存管理之用户堆栈的扩展。

2、盘区交换。如要执行硬盘上的对应代码段。把硬盘上的代码段换入内存才能执行。

这部分通过三个场景来解释:

Linux内核源代码情景分析-内存管理之用户页面的换入。

Linux内核源代码情景分析-内存管理之用户页面的分配。

Linux内核源代码情景分析-内存管理之用户页面的定期换出。

内核空间的页面有下面几种:

1、内核代码和内核中全局量所占的内存页面既不需要经过分配也不会被释放。这部分空间是静态的。

2、内核通过kmalloc后者vmalloc分配、用作某些临时性使用和为管理目的而设的数据结构,如vma_area_struct数据结构等,这些数据结构一旦使用完毕便无保存价值,所以立即便可释放。不过由于一个页面中往往有多个同种数据结构,所以要到整个页面都空闲时才能把页面释放。

3、内核中通过调用alloc_pages(),为某些临时使用和管理目的而分配的页面,例如,每个进程的内核栈所占的两个页面、从内核空间复制参数时所使用的页面等等。这些页面也是一旦使用完毕便无保存价值,所以立即释放。

4、在内核中还有一种页面,虽然使用完毕,但其内容仍有保存价值,因此,并不立即释放。这类页面“释放”之后进入一个LRU队列,经过一段时间的缓冲让其“老化”。如果在此期间又要用到其内容了,就又将其投入使用,否则便继续让其老化,直到条件不再允许时才加以回收。这种用途的内核页面大致有以下这些: · 文件系统中用来缓冲存储一些文件目录结构dentry的空间 · 文件系统中用来缓冲存储一些索引节点inode的空间 · 用于文件系统读/写操作的缓冲区。

时间: 2025-01-03 19:40:06

Linux内核源代码情景分析-内存管理的相关文章

Linux内核源代码情景分析-内存管理之slab-回收

在上一篇文章Linux内核源代码情景分析-内存管理之slab-分配与释放,最后形成了如下图的结构: 图 1 我们看到空闲slab块占用的若干页面,不会自己释放:我们是通过kmem_cache_reap和kmem_cache_shrink来回收的.他们的区别是: 1.我们先看kmem_cache_shrink,代码如下: int kmem_cache_shrink(kmem_cache_t *cachep) { if (!cachep || in_interrupt() || !is_chaine

Linux内核源代码情景分析-内存管理之用户页面的定期换出

我们已经看到在分配页面时,如果页面数不够,那么会调用page_launder,reclaim_page,__free_page将页面换出,并重新投入分配. 为了避免总是在CPU忙碌的时候,也就是在缺页异常发生的时候,临时再来搜寻可供换出的内存页面并加以换出,Linux内核定期地检查并且预先将若干页面换出,腾出空间,以减轻系统在缺页异常发生时的负担. 为此,在Linux内核中设置了一个专司定期将页面换出的"守护神"kswapd和kreclaimd. static int __init k

Linux内核源代码情景分析-内存管理之用户页面的分配

首先介绍几个重要的数据结构. 1.page typedef struct page { struct list_head list; struct address_space *mapping; unsigned long index; struct page *next_hash; atomic_t count; unsigned long flags; /* atomic flags, some possibly updated asynchronously */ struct list_h

Linux内核源代码情景分析-内存管理之用户堆栈的扩展

在下面几种情况下会发生,页面出错异常(也叫缺页中断): 1.相应的页面目录项或者页面表项为空,也就是该线性地址与物理地址的映射关系尚未建立,或者已经撤销.本文讨论的就是这种情况. 2.相应的物理页面不在内存中. 3.指令中规定的访问方式与页面的权限不符,例如企图写一个"只读"的页面. 首先看下进程地址空间示意图: 假设现在需要调用某个子程序,因此CPU需将返回地址压入堆栈,也就是要将返回地址写入虚拟空间地址为(%esp-4)的地方.可是,在我们这个情景中地址(%esp-4)落入了空洞中

Linux内核源代码情景分析-内存管理之slab-分配与释放

首先说缓存区的数据结构: struct kmem_cache_s { /* 1) each alloc & free */ /* full, partial first, then free */ struct list_head slabs;//指向所有的slab块链表,前面是完全块,然后是非完全块,最后是空闲块 struct list_head *firstnotfull;//指向第一个非完全块,如果没有非完全块,就指向上面的slabs unsigned int objsize;//对象的大

Linux内核源代码情景分析-内存管理之用户页面的换入

在下面几种情况下会发生,页面出错异常(也叫缺页中断): 1.相应的页面目录项或者页面表项为空,也就是该线性地址与物理地址的映射关系尚未建立,或者已经撤销. 2.相应的物理页面不在内存中. 本文讨论的就是这种情况. 3.指令中规定的访问方式与页面的权限不符,例如企图写一个"只读"的页面. 假设已经建立好了映射,但是页表项最后一位P为0,表示页面不在内存中:整个页表项如下图,offset表示页面在一个磁盘设备的位置,也就是磁盘设备的逻辑页面号:而type则是指该页面在哪一个磁盘设备中. 图

Linux内核源代码情景分析-内存管理之恢复映射

refill_inactive_scan和swap_out,把活跃的页面变成不活跃脏的页面.挑选的原则是最近没有被访问,且age小于0. page_launder,把不活跃脏的页面变成不活跃干净的页面. 不活跃脏的页面,有如下特点: 使用计数为1: page->list链入mapping->dirty_pages/clean_pages: page->next_hash和page->pprev_hash链入全局的Hash表: page->lru链入了全局的inactive_d

Linux内核源代码情景分析-共享内存

一.库函数shmget()--共享内存区的创建与寻找 asmlinkage long sys_shmget (key_t key, size_t size, int shmflg) { struct shmid_kernel *shp; int err, id = 0; down(&shm_ids.sem); if (key == IPC_PRIVATE) { err = newseg(key, shmflg, size);//分配一个共享内存区供本进程专用,最后返回的是一体化的标示号 } el

Linux内核源代码情景分析-交换分区

在Linux内核源代码情景分析-共享内存中,共享内存,当内存紧张时是换出到交换分区. 在Linux内核源代码情景分析-mmap后,文件与虚拟区间建立映射中,文件映射的页面,当内存紧张时是换出到硬盘上的文件中. 这里的交换分区,就是是swap分区,记得给电脑安装ubuntu时,就有一项是swap分区. 交换分区和文件的区别是: 文件是在一个具体的文件系统之下的,交换分区没有这个必要,它可能是一个裸分区,不需要文件系统. 需要说明一点,并不是所有从物理内存中交换出来的数据都会被放到Swap中(如果这