zoukankan      html  css  js  c++  java
  • 【内存管理篇】基本分页存储管理方式

    此处暂不讲解基本分页的原理。记录一个问题:在一级页表中,为什么每个进程都需要分配一个页表,且各个页表都硕大无比?

    首先,还是用大家熟悉的32位地址空间,单页表项4B为例。以2^20为页号,2^12为偏移地址。因此页表项应该有2^20约100万条,而单页大小为2^12=4KB,即单页可存放1K条页表项,总共需要   2^20条 / 2^10(条/页) = 2^10 页。而单页大小为4KB,故存放页表所需要的空间就是2^10页 * 4KB/页 = 4MB。这就是大家经常看到的,一级页表每个页表所需内存过大,若进程增多(如100个进程),则整个内存仅存放页表的开支都会很大了(400MB)。

    那么,为什么每个进程都需要一个自己的页表呢?回答这个问题,我们就要意识到,页表的提出是为了解决连续分配管理方式中存在的问题:碎片化(无论是内部碎片还是外部碎片)。因此页表的一个原则,就是使进程可以在逻辑上连续分配内存,通过页表的映射,对上层应用软件屏蔽掉实际内存的碎片存在。如果所有进程共享一个页表,则会面临与内存空间完全一样的分配问题,无法解决碎片问题。

    第二个问题,尽管每个进程确实需要拥有自己独立的页表,但是为什么每个页表都要那么大,大到足以与每一个页框(内存中的块,页是进程中的块)?这个问题,是因为进程对内存的动态需求,也就是进程装入的时候无法确定所需内存大小。尽管在曾经的连续分配方式中,每个进程都会评估自己最大需要内存,但这样会丧失一定程度的灵活性。而页表占据整个内存大小,不仅满足了进程对内存需求的动态增长问题,还使每个进程在逻辑上都独占了内存,扩大了虚拟内存空间。利用内存页框与外存块的交换技术,可以使计算机的内存得到巨大扩增。

    计算机的研究之趣,不限于代码一隅
  • 相关阅读:
    Caffe(卷积神经网络框架)介绍
    日志log使用序列反序列加密(Serializer) DESCrypto 加密
    判断文件是否为空或者是否存在
    字符串转换为字节序列,字母,汉字存储结构
    c# 程序检测日志输出的类
    EmguCV Image类中的函数(二)使用MorphologyEx进行更多的变换
    Entity Framework 摘记
    javascript 键盘输入过滤,只能输入数字,小数一位且只能输入5
    .net framework 3.5 序列化
    SQL Server 快捷键备忘
  • 原文地址:https://www.cnblogs.com/RambleIvy/p/11651734.html
Copyright © 2011-2022 走看看