linux 系统的虚拟内存如何分配?

论坛 期权论坛 股票     
期权匿名问答   2023-2-11 21:23   3214   2
linux 系统的虚拟内存如何分配?
分享到 :
0 人收藏

2 个回复

倒序浏览
2#
期权匿名回答  16级独孤 | 2023-2-11 21:23:49 发帖IP地址来自 广东东莞
题主您好:
不知道题主想问内存布局,还是虚拟内存分配的过程。
这里两种都简单说一下。
内存布局:


上图摘自CSAPP。
    如何分配这个说起来比较复杂,对于Linux来说,32位地址空间代表可以访问0-4G的内存,在该进程地址空间中,存在着内核,用户栈,堆等等数据,每个进程的地址空间都是独立的,我们的物理内存只有4G,而Linux系统进程数都是按照百来计数,这样算下来肯定是不够用的,操作系统(当然,这里我们只谈论Linux)是如何解决的呢?
    Linux将虚拟存储器组成一些区域集,一个区域就是已经存在的虚拟存储器连续片,它们以某种确定的方式相关联。
    这样说比较抽象,下面我们直接上图。



图二:虚拟存储器到物理存储器

    这里的虚拟存储器(VM),被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。每字节都有一个唯一的虛拟地址,这个唯一的虚拟地址是作为到数组的索引的,磁盘上数组的内容被缓存在主存中。和存储器层次结构中其他缓存一样,磁盘(较低层)上的数据被分割成块,这些块作为磁盘和主存(较高层)之间的传输单元。VM 系统通过将虚拟存储器分割为称为虛拟页(Virtual Page, VP)的大小固定的块来处理这个问题。每个虚拟页的大小为P宇节。类似地,物理存储器被分割为物理页(Physical Page, PP),大小也为P宇节,物理页也称为页帧 (page frame)
VP如何分类?
    我们看下上面图二,任何时刻虚拟页面都分为三个部分,这三个部分不相交:
第一个部分是未分配的,它没有任何数据和它关联,不占用物理存储器空间。(这部分未在图中表示出来)
第二个部分是缓存的,缓存在物理存储器的已分配页面。
第三个部分是未缓存的,没有缓存在物理存储器的已分配页。
图中进程m的VP0,VP1,VP2,进程n的VP0,VP1均已分配,且分别对应物理存储器的PP1,PP4,PP5,PP3,PP6,这个PP就是指我们前面所说的页帧(page frame).
为了记录虚拟页和物理页的关联关系,操作系统为每个进程维护了一种数据结构,页表(Page Table),主要作用是为地址空间的每一个虚拟页面保存地址转换,从而让我们知道每个页在物理存储器的位置,简单来说,VP->PP。
    在Linux中,内核为每一个进程维护了一个单独的结构task_struct,其中包含了所需要的所有信息,其中一个条目指向了mm_struct,描述了虚拟存储器当前状态。像pgd指向了第一级页表的基地址。而mmap维护了一个区域结构链表(vm_area_structs),其中每个节点都描述了一个区域,当内核调度到该进程时,就会将pgd放入CR3控制寄存器中。
3#
期权匿名回答  16级独孤 | 2023-2-11 21:24:24 发帖IP地址来自 北京
是swap空间吧,通常为物理内存的1~1.5倍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:400157
帖子:80032
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP