内存管理 习题总结

Posted 二十Summer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存管理 习题总结相关的知识,希望对你有一定的参考价值。

3.1.8.1 下面关于存储管理的叙述中,正确的是()

A.存储保护的目的是限制内存的分配 B.在内存为M、有N个用户的分时系统中,每个用户占用M/N的内存空间 C.在虚拟内存系统中,只要磁盘空间无限大,作业就能拥有任意大的编址空间 D.实现虚拟内存管理必须由相应硬件的支持

编址空间的大小取决于硬件的访存能力,一般由地址总线宽度决定。虚拟内存的管理需要由相关的硬件和软件支持,有请求分页页表机制、缺页中断机构、地址变换机构等,选D。

 

3.1.8.3 内存保护需要由()完成,以保证进程空间不被非法访问。

A.操作系统 B.硬件机构 C.操作系统和硬件机构合作 D.操作系统或者硬件机构独立完成

内存保护是内存管理的一部分,是操作系统的任务,但是出于安全性和效率考虑,必须由硬件实现,所以需要操作系统和硬件机构的合作来完成,选C。

 

3.1.8.16 采用分页或分段管理后,提供给用户的物理地址空间()

A.分页支持更大的物理地址空间 B.分段支持更大的物理地址空间 C.不能确定 D.一样大

页表和段表同样存储在内存中,系统提供给用户的物理地址空间为总空间大小减去页表或段表的长度。由于页表和段表的长度不能确定,所以提供给用户的物理地址空间大小也不能确定,选C。

 

3.1.8.23 可重入程序是通过()方法来改善系统性能的。

A.改变时间片长度 B.改变用户数 C.提高对换速度 D.减少对换数量

可重入程序主要是通过共享来使用同一块存储空间的,或通过动态链接的方式将所需的程序段映射到相关进程中去,其最大的优点是减少了对程序段的调入/调出,因此减少了对换数量,选D。

 

3.1.8.30 引入段式存储管理方式,主要是为了更好地满足用户的一系列要求。下面选项中不属于这一系列要求的是()。

A.方便操作 B.方便编程 C.共享和保护 D.动态链接和增长

引入段式存储管理方式,主要是为了满足用户的下列要求:方便编程、分段共享、分段保护、动态链接和动态增长,选A。

 

3.1.8.48 在虚拟内存管理中,地址变换机构将逻辑地址变换为物理地址,形成该逻辑地址的阶段是()

A.编辑 B.编译 C.链接 D.装载

编译后的程序需要经过链接才能装载,而链接后形成的目标程序中的地址也就是逻辑地址。以C语言为例:C程序经过预处理->编译->汇编->链接产生了可执行文件,其中链接的前一步是产生可重定位的二进制目标文件。C语言采用源文件独立编译的方法,如程序main.c,file.c,file.h在链接前一步生成了main.o,file.o,这些目标模块的逻辑地址都从0开始,但只是相对于该模块的逻辑地址。链接器将这两个文件、libc和其库文件链接成一个可执行文件,从而形成整个程序的完整逻辑地址空间,选C。

 

3.1.8.53 在分段存储管理系统中,用共享段表描述所有被共享的段。若进程P1和P2共享段S,则下列叙述中,错误的是()

A.在物理内存中仅保存一份段S的内容 B.段S在P1和P2中应该具有相同的段号 C.P1和P2共享段S在共享段表中的段表项 D.P1和P2都不再使用段S时才回收段S所占的内存空间

段的共享是通过两个作业的段表中相应表项指向被共享的段的同一个物理副本实现的,因此在内存中仅保存一份段S的内容。段S对于进程P1,P2来说,使用位置可能不同,所以在不同进程中的逻辑段号可能不同。段表项中存放的是段的物理地址(包括段始值和段长度),对于共享段S来说物理地址唯一。为了保证进程可以顺利使用段S,段S必须确保在没有任何进程使用它后才能被删除,所以选B。

 

3.1.8.56 在采用二级页表的分页系统中,CPU页表基址寄存器中的内容是()

A.当前进程的一级页表的起始虚拟地址 B.当前进程的一级页表的起始物理地址 C.当前进程的二级页表的起始虚拟地址 D.当前进程的二级页表的起始物理地址

在多级页表中,页表基址寄存器存放的是顶级页表的起始物理地址,故存放的是一级页表的起始物理地址,选B。

 

3.2.10.1 请求分页存储管理中,若把页面尺寸增大一倍而且可容纳的最大页数不变,则在程序顺序执行时缺页中断次数会()

A.增加 B.减少 C.不变 D.可能增加也可能减少

对于顺序执行程序,缺页中断的次数等于其访问的页帧数。由于页面尺寸增大,存放程序需要的页帧数就会减少,因此缺页中断的次数也会减少,选B。

 

3.2.10.5 为使虚存系统有效地发挥其预期的作用,所运行的程序应具有的特性是()

A.该程序不应含有过多的I/O操作 B.该程序的大小不应超过实际的内存容量 C.该程序应具有较好的局部性 D.该程序的指令相关性不应过多

虚拟存储技术基于程序的局部性原理。局部性越好,虚拟存储系统越能更好地发挥作用,选C。

局部性原理:在程序装入时,不必将其全部读入内存,而只需将当前需要执行的部分页或段读入内存,就可让程序开始执行。

 

3.2.10.8 考虑页面置换算法,系统有m个物理块供调度,初始时全空,页面引用串长度为p,包含了n个不同的页号,无论用什么算法,缺页次数不会少于()

A.m B.p C.n D.min(m,n)

无论采用什么页面置换算法,每种页面第一次访问时不可能在内存中,必然发生缺页,所以缺页次数大于或等于n,选C。

 

3.2.10.13 导致LRU算法实现起来耗费高的原因是()

A.需要硬件的特殊支持 B.需要特殊的中断处理程序 C.需要在页表中表明特殊的页类型 D.需要对所有的页进行排序

LRU算法需要对所有页最近一次被访问的时间进行记录,查找时间最久的进行替换,这涉及排序,对置换算法而言,开销太大,选D。

 

页表项中的合法位信息显示本页面是否在内存中,即决定了是否会发生页面故障。

 

抖动是进程的页面置换过程中,频繁的页面调度(缺页中断)行为,所有的页面调度策略都不可能完全避免抖动。

产生内存抖动的主要原因是页面置换算法不合理≠内存空间太小。

 

3.2.10.17 请求分页存储管理的主要特点是()

A.消除了页内零头 B.扩充了内存 C.便于动态链接 D.便于信息共享

请求分页存储管理就是为了解决内存容量不足而使用的方法,它基于局部性原理实现了以时间换取空间的目的,主要特点自然是间接扩充了内存,选B。

 

3.2.10.25 已知系统为32位实地址,采用48位虚地址,页面大小为4KB,页表项大小为8B,假设系统使用纯页式存储,则要采用()级页表,页内偏移()位。

页面大小为4KB,因此页内偏移为12位。系统采用48位虚拟地址,因此虚页号48-12=36位。采用多级页表时,最高级页表项不能超出一页大小;每页能容纳的页表项数为4KB/8B=512=2^9,36/9=4,因此应采用4级页表,最高级页表项正好占据一页空间,选C。

 

若系统处于频繁的换入/换出过程中,不是因为磁盘交换区容量不够,但可以试着减少多道程序的度数(减少主存中的程序)。

 

3.2.10.31 下列关于虚拟存储器的叙述中,正确的是()

A.虚拟存储只能基于连续分配技术 B.虚拟存储只能基于非连续分配技术 C.虚拟存储容量只受外存容量的限制 D.虚拟存储容量只受内存容量的限制

采用连续分配方式时,会使相当一部分内存空间都处于暂时或“永久”的空闲状态,造成内存资源的严重浪费,也无法从逻辑上扩大内存容量,因此虚拟内存的实现只能建立在离散分配的内存管理的基础上。有以下三种实现方式:请求分页;请求分段;请求段页式。虚存的实际容量受外存和内存容量之和限制,虚存的最大容量是由计算机的地址位数决定的,选B。

 

能加快虚实地址转换的操作包括:增大快表(TLB)容量;让页表常驻内存…

 

3.2.10.44 下列选项中,不会影响系统缺页率的是()

A.页置换算法 B.工作集的大小 C.进程的数量 D.页缓冲队列的长度

工作集的大小决定了分配给进程的物理块数,分配给进程的物理块数越多,缺页率就越低;进程的数量越多,对内存资源的竞争越激烈,每个进程被分配的物理块数越少,缺页率越高;页缓冲队列是将被淘汰的页面缓存下来,暂时不写回磁盘,队列长度会影响页面置换的速度,但不会影响缺页率,选D。

C++ Primer 课后习题详解 | 12.1.2 直接管理内存

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: C/C++面试通关【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


目录

一、练习 12.6

1.1 题目描述

1.2 题目解析

二、练习 12.7

2.1 题目描述

2.2 题目解析

三、练习 12.8

3.1 题目描述

3.2 解题思路

四、练习 12.9

4.1 题目描述

4.2 题目解析


本篇文章是对 C++ Primer 第五版 第 12.1.12 节课后习题 12.6 ~ 12.9 的讲解。

一、练习 12.6

1.1 题目描述

编写函数,返回一个动态分配的 int 的 vector。将此 vector 传递给另外一个函数,这个函数读取标准输入,将读入的值保存在 vector 元素中。再将 vector 传递给另外一个函数,打印读入的值。记得在恰当的时刻 delete vector。

1.2 题目解析

代码实现如下所示。

#include <iostream>
#include <vector>

std::vector<int> *vectorMalloc()

    return new std::vector<int>;


void readValue(std::vector<int>* p)

    int val;
    std::cin>>val;
    p->push_back(val);


void printValue(std::vector<int>* p)

    for (const auto i : *p) 
        std::cout<<i<<std::endl;
    


int main()

    auto p = vectorMalloc();
    readValue(p);
    printValue(p);
    delete p;
    return 0;

二、练习 12.7

2.1 题目描述

重做上一题,这次使用 shared_ptr 而不是内置指针。

2.2 题目解析

代码实现如下所示。

#include <iostream>
#include <vector>
#include <memory>

typedef std::shared_ptr<std::vector<int>> sharePtrVector;

sharePtrVector vectorMalloc()

    return std::make_shared<std::vector<int>>();


void readValue(sharePtrVector p)

    int val;
    std::cin>>val;
    p->push_back(val);


void printValue(sharePtrVector p)

    for (const auto i : *p) 
        std::cout<<i<<std::endl;
    


int main()

    auto p = vectorMalloc();
    readValue(p);
    printValue(p);
    return 0;

三、练习 12.8

3.1 题目描述

下面的函数是否有错误?如果有,解释错误原因。

bool b()

    int* p = new int;
    // ...
    return p;

3.2 解题思路

函数返回类型错误,应该是 int*,上述代码中,p 将转换为 bool 类型这样写编译器一般检查不出来错误,会导致内存泄漏问题。

四、练习 12.9

4.1 题目描述

解释下面代码执行的结果:

#include <iostream>

using namespace std;

int main()

    int *q = new int(42), *r = new int(100);
    r = q;
    auto q2 = make_shared<int>(42), r2 = make_shared<int>(100);
    r2 = q2;
    return 0;

4.2 题目解析

首先,执行 r = q 后,并没有指针指向原 r 指向的内存,造成内存泄漏。

执行 r2 = q2 后,r2 原指内存空间引用计数减一变为 0,所在内存空间被释放,q2 所指内存引用计数加一。


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞


以上是关于内存管理 习题总结的主要内容,如果未能解决你的问题,请参考以下文章

计算机操作系统实验指导 (第3版) 第四篇 操作系统学习指导和习题解析 第20章:存储管理 习题和答案

操作系统期末复习题

软考 系统架构设计师操作系统③ 存储管理

内存管理

有关C语言内存管理的一些总结

内存管理总结