linux 内存管理

原创 2011年01月15日 17:28:00

只是大概谢谢,笔记类型的。

1. 以页位单位

struct page {
         page_flags_t flags;                 //标记:是否需要写出,是否被锁在内存等,在linux/page-flags.h 中定义
         atomic_t _count;          //页面引用计数
         atomic_t _mapcount;             //有多少个页表项映射到了此页面
         unsigned long private;            //私有数据区,我们在以后将要看到的交换和磁盘高速缓存中会有关于这个成员的使用
         struct address_space *mapping;     //用于磁盘高速缓存,以后分析
         pgoff_t index;                        //同上
         struct list_head lru;                //LRU链表,链至管理区的相应链表中
         #if defined(WANT_PAGE_VIRTUAL)
         void *virtual;                         //这个页的虚拟地址,如果没有,例如高位的内存(动态映射),这个值是NULL

}

这个结构体是定义物理内存的,不是虚拟内存,因此这个结构体对应用程序来讲是透明的。

内核用这个结构体来记录和保持所有页的状态。

对每一个页都会分配这样的一个结构体,因此会有内存使用方面的问题,但也不大,差不多百分之一,1G会占据10M

 

2. 内存区域

由于硬件的限制,所有内存不能同等的对待,例如dma只能使用某些内存,为了便于管理,内核将内存划分为三个区域

a. dma 区域

b. 普通区域

c. 高内存区域

具体就不在讨论

 

3. 内存分配

以页为单位 和 以byte为单位的两种接口

options:

a. GFP_IO: 是否可以进行IO,例如发现内存不够,是否可以将dirty page写回来释放内存

b. GFP_WAIT: 是否可以sleep,例如是否可以被重新调度,在中断处理器里不能设置,不能再中断

c. GFP_FS: 是否可以进行文件系统io操作

 

4. vmalloc:

分配虚拟地址连续的内存,不需要物理地址连续,user空间使用这个分配器,当物理地址不连续时,在tlb中需要额外的映射,因此会有性能方面的损耗

5. slab 内存分配

一些基本原则:

a. 经常使用到的数据对象会被频繁地分配和释放,所以需要cache他们

b. 频繁地分配和释放会导致内存碎片,为了避免这个问题,缓存的空闲列表应该被组织为连续的

c. 使用空闲列表,分配和释放都变得非常简单,只需要拿走或者返还对象就可以

d. 如果cache能够事先知道对象大小,页大小,以及总的cache大小,就有可能做更多的优化

e. 在smp下,可以每个cpu一个cache,这样就不存在锁的情况,在多线程的程序中,可以每个线程一个cache,这样也不就存在锁的问题

 

linux的实现:

不同大小的对象叫做caches,例如进程描述符cache,inode cache。 cache被组织为slab,一个slab包含一个或者多个连续的页,每个slab都包含多个对象,每个slab有三种状态,full,partial,empty

6 从栈上分配内存

1. 每个进程的栈大小有限制,ulimit -s, 一般为10M

相关文章推荐

深入理解Linux虚拟内存管理.pdf

  • 2017年09月30日 09:44
  • 44.64MB
  • 下载

linux 内存管理讨论

  • 2014年06月11日 14:22
  • 84KB
  • 下载

《LINUX3.0内核源代码分析》第四章:内存管理(7)

原文地址:【http://blog.chinaunix.net/uid-25845340-id-3251137.html】 摘要:本文主要讲述linux如何处理ARM cortex A9多核处理器的...

Linux 内存管理

  • 2012年12月16日 23:19
  • 8KB
  • 下载

linux内存管理总结

  • 2013年04月02日 08:40
  • 537KB
  • 下载

linux内存管理伙伴算法(一:基本概念介绍)

原文地址:【http://blog.csdn.net/hs794502825/article/details/7887915】 在系统初始化进行到伙伴系统分配器能够承担内存管理的责任后,必须停用...

Linux内存管理详解.ppt

  • 2011年09月01日 22:46
  • 730KB
  • 下载

Linux011-内存管理

  • 2007年05月25日 10:50
  • 184KB
  • 下载

【Linux 内核】内存管理(二)伙伴算法

通常情况下,一个高级操作系统必须要给进程提供基本的、能够在任意时刻申请和释放任意大小内存的功能,就像malloc 函数那样,然而,实现malloc 函数并不简单,由于进程申请内存的大小是任意的,如果操...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux 内存管理
举报原因:
原因补充:

(最多只允许输入30个字)