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内存管理浅析(一)

1.Linux内存管理的主要内容 a.      虚拟内存管理 b.      内核空间内存管理 c.      用户空间内存管理 2.虚拟内存和物理内存映射 ZONE_HIGH...
  • u012398362
  • u012398362
  • 2016年11月27日 19:40
  • 978

Linux内存管理详解

前一段时间看了《深入理解Linux内核》对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看法和认识。 ...
  • u010229420
  • u010229420
  • 2016年09月19日 21:29
  • 635

Linux的任督二脉:进程调度和内存管理

比如进程的调度延时是多少?Linux能否硬实时?多核下多线程如何执行?系统的内存究竟耗到哪里去了?我写的应用程序究竟耗了多少内存?什么是内存泄漏,如何判定内存是否真的泄漏?CPU速度、内存大小和系统性...
  • 21cnbao
  • 21cnbao
  • 2017年08月23日 14:45
  • 21711

linux(arm架构)内存管理学习(1)

在研究内核hibernate实现的时候,由于需要对内存管理如MMU配置、内存分布和分配有相应了解,因此进行了专门的学习。最终结果是hibernate未研究出什么成果,反倒是内存管理的学习小有心得,就此...
  • alien75
  • alien75
  • 2016年08月31日 11:11
  • 1049

linux内存管理大图

转自:
  • mrwangwang
  • mrwangwang
  • 2014年08月20日 18:10
  • 906

linux内存管理源码分析 - 概述

linux内存管理源码分析 - 概述 本文为原创,转载请注明:http://www.cnblogs.com/tolimit/  http://www.cnblogs.com/tolimit/p...
  • zdy0_2004
  • zdy0_2004
  • 2015年06月05日 22:18
  • 596

内存管理(Linux内核源码分析)

背景本篇博客试图通过linux内核源码分析linux的内存管理机制,并且对比内核提供的几个分配内存的接口函数。然后聊下slab层的用法以及接口函数。内核分配内存与用户态分配内存内核分配内存与用户态分配...
  • hty46565
  • hty46565
  • 2017年07月12日 10:03
  • 542

深入浅出Linux内核内存管理基础

1 背景知识 1.1 用户空间与内核空间内存的划分        从Linux操作系统层次上,内存可划分为用户空间内存和内核空间内存。        32位的CPU,最大寻址范围为2^32 - 1也就...
  • acs713
  • acs713
  • 2015年01月18日 16:45
  • 4182

linux内存管理总结之内存分配

1.伙伴系统     伙伴系统规定,无论是已分配内存块和空闲内存块,其大小都是2的k次幂个页面的大小,k的取值范围是0到MAX_ORDER 。当需要分配一个 大小为n个页面大小的内存块时,先计算一...
  • haichuan1988524
  • haichuan1988524
  • 2014年09月26日 17:17
  • 759

深入理解Linux内存管理-之-目录导航

日期 内核版本 架构 作者 GitHub CSDN 2016-08-31 Linux-4.7 X86 & arm gatieme LinuxDeviceDrive...
  • gatieme
  • gatieme
  • 2016年08月31日 14:45
  • 4155
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux 内存管理
举报原因:
原因补充:

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