前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CSAPP 虚拟存储器 笔记

CSAPP 虚拟存储器 笔记

作者头像
wywwzjj
发布于 2023-05-09 06:37:05
发布于 2023-05-09 06:37:05
5720
举报

一个系统中的进程是与其他进程共享 CPU 和主存资源的。然而,共享主存会形成一些特殊的挑战。

虚拟内存提供了三个重要的能力:

  • 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在主存之间来回传送数据,通过这种方式,它高效地使用了主存。
  • 它为每个进程提供了一致的地址空间,从而简化了内存管理
  • 它保护了每个进程的地址空间不被其他进程破坏。

内存管理要干些啥?

  • 内存空间的分配与回收
  • 内存空间的扩充
    • 覆盖技术
    • 交换技术
    • 虚拟存储
  • 地址转换:逻辑 => 物理
  • 存储保护:保证各进程只在自己的内存空间访问,不会越界
    • 上下界寄存器
    • 重定位寄存器 + 界地址寄存器

学习资源

LWN.net 上有一系列的 “What every programmer should know about memory” 文章你需要读一下。当然,你可以直接访问一个完整的 PDF 文档。下面是这个系列文章的网页版列表。读完这个列表的内容,你基本上就对内存有了一个比较好的知识体系了。

连续分配

分类:

  • 单一连续:只支持单道程序,内存分为系统区和用户区
  • 固定分区
  • 动态分区:在程序被装入内存时,根据进程的大小动态调整分区
    • 首次适应
    • 最佳适应
    • 最坏适应
    • 邻近适应

缺点:

  • 分配给一个程序的物理内存是连续的
  • 内存利用率低
  • 有内外碎片问题

非连续分配

优点:

  • 一个程序的物理地址空间是非连续的
  • 更好的内存利用和管理
  • 允许共享代码与数据(共享库等)
  • 支持动态加载和动态链接

缺点:

  • 如何建立虚拟地址和物理地址之间的转换
    • 软件方案
    • 硬件方案

分段

段是信息的逻辑单位。

分段的目的是更好地满足用户需求。

一个段通常包含着一组属于一个逻辑模块的信息,更容易实现信息的共享和保护。

分段对用户是可见的,用户编程时需要显式给出段名。

段的大小不固定,取决于用户编写的程序(低级语言)。

  • 程序text段
    • 用户代码
  • 程序数据段
  • 运行栈

段表:段号、段长、基址

分页

页是信息的物理单位。分页的目的是为了实现离散分配,提高内存利用率。

分页仅仅是系统管理上的需要,完全是系统行为,对用户不可见。

页表

作用:记录进程中各个页与所占用内存块的关系,形成映射。

快表

多级页表

单页表遇到的问题:

  • 页表必须连续存放,若页表项小,总的页表太占空间;页表项过大,内碎片影响大。
  • 没有必要让所有页表常驻内存,进程在一段时间内可能只需要访问几个特定的页面。

实现对页表本身的虚拟存储。

注意:

  • 各级页表的大小不能超过一个页面。若两级不够,可分成多级
  • 多级页表访存次数(无快表) = 页表级数 + 1

段页

进程分段 =》段分页 =》内存分块

维护一个段表和若干个页表

虚拟内存

程序不需全部装入即可运行,运行时根据需要动态调入数据,若内存不够,还需换出一些数据。

请求调页

访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存

页表结构:内存块号 中断位P 访问位A 修改位M 外存地址

缺页中断与一般的 I/O 中断区别:

  • 缺页中断是指令执行时中断,而普通的是两条指令执行之间。
  • 缺页中断是运行状态,而普通的是阻塞态。

页面置换

内存空间不够时,将内存中暂时用不到的信息换出到外存,换出时注意清掉快表中的缓存。

理想置换算法要求:被换出的页面在以后的运行中不需要。

  • 先进先出(FIFS) 往下挤。实现简单,性能差,可能出现 Belady 现象,即增加内存块后,缺页中断却增加。
  • 最近最久未使用(LRU) 依然是往下挤,区别在于,一旦命中,提到栈顶。
  • 最近最不常用(LFU) 记录访问次数,淘汰访问次数最小的,但这样实现太麻烦,所以直接在对应的内存块上计数。
  • 最近未使用(NRU) 搞一个定时器,定期清除访问位。
  • 二次机会(Second Chance) 一般来说不用管改进算法,只要 A 请求调页时,不算访问,之后的命中才算,而且从时间最久开始,遇到0就直接淘汰,遇1置0。 置换掉的页作为最新页放顶上,注意是按时钟旋转,而不是直接往下挤。 改进后的算法加了一个判断位——修改位M,减少了I/O,也降低了抖动现象。
  • 页缓冲

内存管理

  • 简化链接
  • 简化加载
  • 简化共享
  • 简化内存分配

物理和虚拟寻址

计算机系统的主存被组织成一个由 M 个连续的字节大小的单元组成的数组。每个字节都有一个唯一的物理地址。

在物理地址与虚拟地址间加个地址翻译就构成了虚拟寻址。

地址空间

地址空间是一个非负整数地址的有序集合。

地址空间的概念是很重要的,因为它清楚地区分了数据对象(字节)和他们的属性(地址)。

缓存

内存成了对硬盘的缓存,虚拟页面可划分为未分配的、未缓存的和已缓存的。

地址翻译

逻辑地址到物理地址

内存映射

回到本章前言,“虚拟内存是强大的”。

  • 你知道可以通过读写内存位置读或者修改一个磁盘文件的内容吗?
  • 可以加载一个文件的内容到内存中,而不需要进行任何显示地复制吗?

将一个文件或其他对象映射到进程的地址空间,实现文件磁盘地址和进程地址空间中一段虚拟地址的一一对应。

实现了这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用 read、write 等系统调用函数。

相反,内核空间对这段区域的修改也直接反应用户空间,从而可以实现不同进程的文件共享。

简单总结,有如下特点:

  • 提高数据的读、写和传输的时间性能
    • 减少了数据拷贝次数
    • 用户空间和内核空间的高效交互(通过映射区域直接交互)
    • 用内存读写代替 I/O 读写
  • 提高内存利用率:通过虚拟内存、共享对象

动态内存分配

为什么要动态分配内存?因为很多时候只有在运行时才知道某些数据结构的大小。

malloc 与 mmap、munmap 区别是什么?

分配器

这一部分可以借鉴操作系统为进程分配内存的操作。

垃圾收集

一个进程终止后,其占用的内存由操作系统来释放和重新分配。

进程存活时,释放掉不用的内存就得交给程序本身了,C / C++ 把这活交给了程序员,Java 这类的有自己的垃圾回收器。

回收器

C 中常见的内存错误

  • 间接引用坏指针
  • 读未初始化的内存
  • 允许栈缓冲区溢出
  • 假设指针和他们指向的对象是相同的大小
  • 造成错位错误
  • 引用指针,而不是它所指向的对象
  • 误解指针运算
  • 引用不存在的变量
  • 引用空闲堆块中的数据
  • 引起内存泄露
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
操作系统之存储器管理
(2)把程序计数器中存放的逻辑地址中的页号部分与控制寄存器中的页表长度比较,检查地址越界
_咯噔_
2022/03/22
1K0
操作系统第六篇【存储器管理】
存储器的基础知识 首先,一般的存储器我们就会认为它包含着三部分: 寄存器 速度最快,但是造价高 主存储器 速度次之,被通俗称为内存 外存 速度最慢,用于存储文件数据,因为上边两种一旦断电,数据就会丢失。这个用来做持久化存储的。 因此,我们的存储器往往是使用三层结构的。 程序的装入和链接 在操作系统的角度而言,我们面对存储器就是面对程序的装入和连接 一般地,用户程序向要在系统上运行,就要经历下面几个步骤: 编译:对用户源程序进行遍历,形成若干个目标模块 链接:将目标模块以及他们所需要的库函数链接在一起,形成完
Java3y
2018/06/11
1.5K0
存储器及其管理方式
“计算机存储器包括主存和辅存,本文中存储器管理的对象主要是主存,也称内存。它的主要功能包括分配和回收主存空间、提高主存利用率、扩充主存、对主存信息实现有效保护。”
搬砖俱乐部
2019/07/08
1.7K0
存储器及其管理方式
Linux虚拟内存和缺页中断
为了防止不同进程同一时刻在物理内存中运行而对物理内存的争夺和践踏,采用了虚拟内存。
海盗船长
2020/08/28
6.3K0
操作系统学习笔记-虚拟内存
那么我们由此可以思考:如果保有上述这两个特点,在程序执行中,不需要进程的所有部分(页或段)都被加载到内存中,如果内存中保存有待取的下一条指令的所在块(页或段)以及待访问的下一个数据单元所在的块,那么进程可以持续运行下去。
花猪
2022/02/16
1.2K0
操作系统学习笔记-虚拟内存
操作系统(五)虚拟存储器管理
一次性和驻留性严重地降低内存的利用率,显著地减少了系统吞吐量。 研究表明,程序在执行过程中呈现局部性原理。
看、未来
2020/08/25
2K0
操作系统内存管理,你能回答这8个问题吗?
大家早上好,我是程序喵!今天为大家总结整理了关于操作系统内存管理的知识点,更文不易,请各位兄弟别忘分享或者点个在看,多谢
GorgonMeducer 傻孩子
2020/12/22
1.2K0
操作系统内存管理,你能回答这8个问题吗?
漫谈虚拟内存
如上图,程序1、程序2、程序3装入到内存,而程序2运行完成被换出,内存空闲出20k,然后进来程序4,大小为25K,此时,只有两处空闲块,10K和20K,没有一处是符合条件的,应该怎么办?一个明显的办法就是将两块空闲区域进行合并,形成一个大小为30K的空闲块满足程序4。
木可大大
2018/04/03
5.2K6
漫谈虚拟内存
Linux 内存管理
      程序到运行主要经过程序(外存)编译,链接,装入(内存)。《程序如何运行:编译、链接、装》:
黄规速
2022/06/15
8K0
Linux 内存管理
深入剖析虚拟内存工作原理
作者:allanpan,腾讯 IEG 后台开发工程师 导言 虚拟内存是当今计算机系统中最重要的抽象概念之一,它的提出是为了更加有效地管理内存并且降低内存出错的概率。虚拟内存影响着计算机的方方面面,包括硬件设计、文件系统、共享对象和进程/线程调度等等,每一个致力于编写高效且出错概率低的程序的程序员都应该深入学习虚拟内存。 本文全面而深入地剖析了虚拟内存的工作原理,帮助读者快速而深刻地理解这个重要的概念。 计算机存储器 存储器是计算机的核心部件之一,在完全理想的状态下,存储器应该要同时具备以下三种特性:
腾讯技术工程官方号
2021/05/08
3.3K0
图文详解: 操作系统之内存管理 ( 内存模型,虚拟内存,MMU, TLB,页面置换算法,分段等)
每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页 (Page, 4KB)。
一个会写诗的程序员
2021/12/16
2.2K0
图文详解: 操作系统之内存管理 ( 内存模型,虚拟内存,MMU, TLB,页面置换算法,分段等)
浅谈计算机中的存储模型(二)虚拟存储器
现代系统都是多任务系统,而我们的进程是在内存中运行的,内存是有限的,我们如何保证可以安全而又高效的在有限的内存中运行多个程序呢?于是系统给每个进程抽象出一个地址空间。
老九君
2018/08/08
6850
浅谈计算机中的存储模型(二)虚拟存储器
操作系统 内存管理 虚拟存储技术与虚拟页式存储管理方案的实现
基本思想:利用大容量的外存来扩充内存,产生一个比有限的实际内存空间大得多的、逻辑的虚拟内存空间,简称虚存。
Meng小羽
2019/12/23
2.4K0
[翻译]虚拟内存介绍
计算机是用来执行简单任务的复杂机器:比如 上网、文本编辑、网页服务、视频游戏……,还可以对数据进行操作,图片 音乐 文本 数据库……
xindoo
2021/01/22
1.7K0
[翻译]虚拟内存介绍
【操作系统】内存管理概述
常见的内存分配函数有malloc,mmap等,但大家有没有想过,这些函数在内核中是怎么实现的?换句话说,Linux内核的内存管理是怎么实现的?
嵌入式与Linux那些事
2024/05/11
2030
【操作系统】内存管理概述
我和面试官之间关于操作系统的一场对弈!写了很久,希望对你有帮助!
大家好,我是 Guide哥!很多读者抱怨计算操作系统的知识点比较繁杂,自己也没有多少耐心去看,但是面试的时候又经常会遇到。所以,我带着我整理好的操作系统的常见问题来啦!这篇文章总结了一些我觉得比较重要的操作系统相关的问题比如进程管理、内存管理、虚拟内存等等。
Guide哥
2020/05/07
1.2K0
我和面试官之间关于操作系统的一场对弈!写了很久,希望对你有帮助!
《现代操作系统》——内存管理
内存管理是操作系统中经典的话题。小型嵌入式系统一次只需要执行一个任务,对内存管理没有要求。现代的操作系统通常要同时执行多个进程,多个进程所占用的内存之和通常超出物理内存的容量大小。即便内存容量也在不断的增长,但始终跟不上软件体积膨胀的速度。甚至有些庞大的程序所需要的内存就足以塞满整个物理内存空间。所以,现代操作系统的设计者就要想办法来调和系统的多任务同时运行、软件体积膨胀和有限的物理内存容量之间的冲突,想尽办法做到鱼和熊掌兼得。这就是本文所介绍的操作系统的内存管理。本文所介绍的主要是:
VV木公子
2021/10/05
1.1K0
《现代操作系统》——内存管理
虚拟存储技术「建议收藏」
在程序运行中,在不同时刻把同一个存储区分配给不同程序段和数据段,实现存储区共享。适用于连续存储(单一连续区分配,分区)
全栈程序员站长
2022/11/09
8270
虚拟存储技术「建议收藏」
开发成长之路(22)-- 不可不知的操作系统知识(2)
-计算机系统中存储器一般分为内存储器和辅助存储器两级 -内存可以分成系统区和用户区两部分,系统区用来存储操作系统等系统软件,用户区用于分配给用户作业使用
看、未来
2021/09/18
5120
操作系统之存储管理
说明: 在左边的单处理器系统中,如果一个进程想要运行,那么必须将进程地址空间装载到物理内存中才可以运行。 而右边的是多处理器系统中有多个进程需要进入物理内存执行,这里要解决的问题就是,如何将进程地址空间合理的装载到物理内存中,如何合理的分配使用内存,使得每个进程能正确执行。
JavaEdge
2018/05/16
3.6K0
操作系统之存储管理
推荐阅读
相关推荐
操作系统之存储器管理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档