Day10 分页与分段的记忆体管理

前言

前几天讲完了行程管理的部分,其中有个部分讲到,所谓的ready 或者说 task_running 的状态,代表着行程的资料已经被移到记忆体,准备好可以执行了,从今天开始就来了解所谓的记忆体到底是怎麽演变以及运行的,在这个部分会了解MMU、page、page table、实体记忆体等等的内容,希望可以对记忆体有更多的了解。

记忆体管理的远古时期

在远古时期的记忆体是十分有限而且笨重的,简单来说就是只要空间足够就会直接把行程放进去,这代表着记忆体里面的每个区域都可能被某个行程使用,因此这个古老的方法有两个显而易见的大缺点

  1. 行程地址空间的保护问题:
    因为整个记忆体是对所有的行程开放,所以对於任何行程而言,可以任意更动到记忆体内部的任何区域的资料,这对有心的恶意人士而言是犯罪的温床,可以轻松的藉着改动其他区域的资料达成自己不怀好意的目标,为了这个问题後续出现分段管理的方式,在稍後会介绍到。
  2. 记忆体的使用率不良:
    因为行程的排放方式不固定,也因此如果排放的方式不良,很容易就造成严重的空间浪费。
    因应上述的两个问题,分段以及分页的机制就此出现。

分段管理

分段管理是为了解决记忆体内位址空间的保护问题而产生的机制,主要结构如下

在记忆体里会有一个分段表(segment table)进行查表,每个cpu所产生的位址可以分成高位段的segment base与低位段的segment limit,在上图分别以 s 跟 d 表示,会利用 s 查表,再将该栏的资料取出,分别为限制大小(limit)与基底(base),首先确认cpu 产生的d ,是否小於分段表中取出的 segment limit,如果为否,那就引发定址错误;如果是的话,就将分段表中取出的base 加上d,正确的存取实体记忆体。
分段机制虽然解决了记忆体保护的问题,但是在分段管理中,仍以行程的角度对记忆体进行使用,当实体记忆体不足的时候,取出的会是整个行程,因此如果有多个行程要使用,记忆体会与硬碟不停进行行程资料的交换,会造成严重的效能损耗。

分页管理


<<:  NSLayoutConstraint使用 Day21

>>:  在程序里避开踩雷:安全引用空虚值、例外处理和延後、惰性初始化 Null Safety, Exception, lateinit, lazy

Day 23: 不同的环境,不同的Driver,利用Driver 驾驭SQLDelight

Keyword:SQLDelight,Driver 到23日,引入SQLDelight,到在Andr...

ProxmoxVE PVE VM 安装 ChromeOS

ProxmoxVE PVE VM 安装 ChromeOS ChromeOS 版本 Download ...

企划实现(21)

接续上篇继续提到关於有限公司以及股份有限公司的差别。 有限公司以及股份有限公司除了制度会有差别外,责...

[Day 09] tinyML开胃菜Arduino IDE上桌(下)

书接上回[Day 08] tinyML开胃菜Arduino IDE上桌(上)。 单机版IDE Ard...

【Day23】I2C Master(Write)的实现

上一篇我们设计了 I2C Master 的状态机,那麽我们今天要来引用上次完成的状态机模块来实现 I...