0%

操作系统内存管理

os内存管理的目标是做到高效分配回收内存,支持多进程并发使用,又要做到进程之间的隔离。内存是一堆三极管,电容等器件组成的电路模块。每个内存单元有两个属性,对程序开发特别重要,一个是地址,一个是单元内保存的数据。

物理内存管理

分页机制

分页是CPU和操作系统共同实现的内存管理方式。目的是为了尽可能的减少内存碎片,同时可以让多个进程共享内存。把一个逻辑地址,通过页表转换为一个物理内存地址。转换过程是依靠CPU中的MMU单元。页表的数据是由操作系统来生成。x86架构是在80386推出时(1985年),实现的页机制。

物理内存管理上,只要启动分页机制,就是“虚拟”内存,这一层是CPU的机制(MMU单元的功能)。

OS在此基础上,对每个用户进程进行了隔离,在x86_32上,每个进程都可以访问4G的空间,但其实物理机器上有可能只有1G的内存,这个是通过swap机制实现的。

分页机制可以减少内存碎片。可以把不连续的逻辑地址,可以分配成连续物理内存空间。也可以把连续的逻辑地址,分配成不连续的物理空间。

分页机制可以把不同逻辑地址,映射到相同的物理地址上。

伙伴系统

slub:内核申请内存空间的算法,基于first-fit

虚拟内存管理

在分页机制上,OS增加一层内存管理,主要是可以把不常用的内存,按页换到磁盘上。这样逻辑上,可以使用超过物理内存总数的内存。这个概念是1956年德国人发明。1961年,B5000实现了段式虚拟内存管理。x86是在80386上实现了页机制和页式虚拟内存管理。

  • vma创建

这一层内存分配,主要是面向应用进程的。每个进程会对应各自的页表,这些保存在struct mm中。mm还保存了一个链表,struct vma_struct,vma保存了用户进程所有需要用到的逻辑地址的start和end。vma可以判断page fault时候,是否权限正常,是否属于本进程。其实每个vma对应应用进程的一个段,如代码段、数据段等

每次做进程调度的时候,就会切换页表。每个进程有了自己的页表后,整个内存空间就可以被共享。

  • swap机制

每次申请一个新页时,swap manager在一个链表中记录这个页,当内存不够用或者其他情况,就会按一定规则把一部分内存的数据写到磁盘上去。当下次再访问到这个页时,会通过中断page fault把磁盘的数据再次调回内存。

新进程加载

?? 新进程加载时,如何分配内存。

新进程加载时,根据elf header,把各个端的逻辑地址写入vma,并不真正加载磁盘,只有当访问内存时,出现page fault后,才会把磁盘数据加回来。同时会把剩余的内存空间分给stack和heap。网上很多文档把进程内存布局,和操作系统内存布局写的很清楚。

?? malloc,kmalloc,堆到底在哪

kmalloc是操作系统分配内核对象时使用的函数,直接管理物理页,用户物理内存分配算法对这块区域进行分配。

malloc是glibc,在用户进程的heap上做内存管理。会调用sbrk syscall。

mmap是什么

共享内存怎么弄

32位机用户进程内存2G限制,是因为用户空间被限制在这个地址空间中0x00800000-0xB0000000