【理论·专业课】第三次作业

news2025/1/16 19:03:31

第1题(存储管理_内存碎片)

请指出内部碎片外部碎片区别


ANS:

内部碎片是分配给进程但未被进程使用且无法被其他进程利用的内存空间

外部碎片是内存中因进程分配释放内存形成的不连续小块,虽总和够但因不连续无法分配给需要连续内存的进程。

第2题(存储管理_内存分配算法)

给定六个内存分区,分别为 100M,170M,40MB,205MB, 300MB 和 185MB (按顺序)。

首次适应、最优适应和最差适应算法将如何放置大小为 200MB、15MB、185MB、75MB、175MB 和 80MB (按顺序) 的进程?

指出哪个请求 (如果有) 不能得到满足。评论每种算法管理内存的效率。


ANS:

1.如何放置

首次适应算法:按地址顺序查找,找到第一个能满足进程大小的空闲分区。

对于 200MB 进程,分配 205MB 分区,剩余 5MB。

15MB 进程分配 40MB 分区,剩余 25MB。

185MB 进程分配 185MB 分区,无剩余。

75MB 进程分配 100MB 分区,剩余 25MB。

175MB 进程分配 300MB 分区,剩余 125MB。

80MB 进程分配 170MB 分区,剩余 90MB。所有进程都能满足。

最优适应算法:从空闲分区列表中选择能满足进程需求且最小的空闲分区。

200MB 进程分配 205MB 分区,剩余 5MB。

15MB 进程分配 40MB 分区,剩余 25MB。

185MB 进程分配 185MB 分区,无剩余。

75MB 进程分配 100MB 分区,剩余 25MB。

175MB 进程分配 175MB 分区,无剩余(从 170MB 和 185MB 中选择更合适的 175MB 分区)。

80MB 进程分配 85MB 分区,剩余 5MB。所有进程都能满足。

最差适应算法:从空闲分区列表中选择最大的空闲分区来满足进程需求。

200MB 进程分配 300MB 分区,剩余 100MB。

15MB 进程分配 185MB 分区,剩余 170MB(选择最大的空闲分区 185MB)。

185MB 进程分配 170MB 分区,无法满足(因为之前 15MB 进程分配了 185MB 分区后剩余的 170MB 不够 185MB)。

75MB 进程分配 100MB 分区,剩余 25MB。

175MB 进程分配 205MB 分区,剩余 30MB。

80MB 进程分配剩余的 100MB 分区,剩余 20MB。

2.是否满足

首次适应算法:进程都能满足,分配后剩余分区分别为 5MB、25MB、0、25MB、125MB、90MB。

最优适应算法:进程都能满足,分配后剩余分区分别为 5MB、25MB、0、25MB、0、5MB。

最差适应算法:185MB 进程不能满足,分配后剩余分区分别为 100MB、170MB、0、25MB、30MB、20MB。

3.效率评论

首次适应算法简单,容易产生外部碎片;最优适应算法能较好利用内存空间,但分配和回收操作较复杂,可能产生较多外部碎片;最差适应算法会使大的空闲分区快速被分割变小,可能导致后续大进程无法分配,也容易产生外部碎片。

第三题(存储管理_分页)

假设页大小为 1KB, 以下地址引用 (以十进制数形式提供) 的页码和偏移量是多少?

a. 21205

b. 164250

c. 121357

d. 16479315

e. 27253187


ANS:

在分页存储管理中,页大小为 1KB = 2^10B,所以地址的二进制的低 10 位为偏移量,其余高位为页码。

对于 21205,21205 / 1024 = 20(页码),21205 % 1024 = 725(偏移量)。

对于 164250,164250 / 1024 = 160(页码),164250 % 1024 = 610(偏移量)。

对于 121357,121357 / 1024 = 118(页码),121357 % 1024 = 505(偏移量)。

对于 16479315,16479315 / 1024 = 16092(页码),16479315 % 1024 = 773(偏移量)。

对于 27253187,27253187 / 1024 = 26614(页码),27253187 % 1024 = 591(偏移量)。

第四题(存储管理_分页)

假设有一个系统具有 32 位的虚拟地址4KB 的页面

编写一个程序,其命令行的输入参数为虚拟地址 (十进制), 其输出为对应的页码和偏移。

例如,你的程序可按如下的代码运行:

./addresses 19986

其输出为:

The address 19986 contains:
page number = 4
offset = 3602

ANS:

因为页大小为 4KB = 2^{12}B,所以偏移量占 12 位,页码占 32 - 12 = 20 位。

通过将输入的虚拟地址右移 12 位得到页码;

用虚拟地址与 0x00000FFF(12 位全 1,用于获取低 12 位)进行按位与操作得到偏移量。

以下是使用Python实现的程序:

import sys

def address_conversion(virtual_address):
    page_size = 4096  # 4KB
    page_number = virtual_address >> 12
    offset = virtual_address & 0x00000FFF
    print(f"The address {virtual_address} contains:")
    print(f"page number = {page_number}")
    print(f"offset = {offset}")

if __name__ == "__main__":
    if len(sys.argv)!= 2:  #sys.argv 用于获取命令行参数。
        print("Usage: python program.py <virtual_address>")
        sys.exit(1)
    virtual_address = int(sys.argv[1])   
    #sys.argv[0] 是程序本身的名称(在你的例子中是 main.py)
    #而 sys.argv[1] 就是期望用户传入的虚拟地址参数。
    address_conversion(virtual_address)

第五题(存储管理_内存共享与保护)

什么是写时复制功能?在什么情况下它的使用时有效的?实现这种功能需要什么硬件支持?


ANS:

1.定义

写时复制是一种优化技术,当多个进程共享同一块内存页面时,它们最初都以只读方式访问该页面。如果某个进程试图对该页面进行写操作,操作系统会为该进程复制一份该页面的副本,然后让该进程在副本上进行写操作,而其他进程仍然共享原始的只读页面。

2.什么情况有效

在多进程共享大量相同数据且只有少数进程会修改数据的情况下使用有效,这样可以避免为每个进程都复制一份数据,节省内存空间。

3.硬件支持

实现这种功能需要硬件支持内存管理单元(MMU)来跟踪页面的访问权限和执行复制操作。

第六题(虚拟存储管理_请求调页)

假设有一个请求调页存储器。页表保存在寄存器中。

如果有可用空帧或者置换的页面未被修改,则缺页错误的处理需要 8ms, 如果置换的页面已被修改,则需要 20ms。

内存访问时间为 100ns。

假设需要置换的页面在 70% 的时间内会被修改。

对于有效访问时间不超过 200ns, 最大可接受的缺页错误率是多少?


ANS:

设缺页错误率为 p

有效访问时间 = (1 - p) * 内存访问时间 + p *(缺页处理时间 + 内存访问时间)。

当置换页面被修改时,缺页处理时间为 20ms;未被修改时为 8ms,平均缺页处理时间 = 0.7 * 20ms + 0.3 * 8ms = 16.4ms。

代入公式可得:200ns = (1 - p) * 100ns + p * (16.4ms + 100ns),然后解方程,

200 * 10^{-9} = (1 - p) * 100 * 10^{-9} + p * (16.4 * 10^{-3} + 100 * 10^{-9})
p = 100 * 10^{-9} \div (16.4 * 10^{-3}) \approx 0.0000061(约为 0.00061%)
所以最大可接受的缺页错误率约为 0.00061%。

第七题(虚拟存储管理_页面置换算法)

编写一个程序,实现本章节所描述的 FIFO、LRU 和最优页面置换算法。

首先,生成一个随机的页面引用串,其中页码范围为 0~9。将这个随机页面引用串应用到每个算法中,并记录每个算法引起的缺页错误的数量。在启动时将页帧数传递给程序。可以使用所选择的任何编程语言来实现此程序。

ANS:

FIFO 算法:先进先出算法,用队列模拟。新页面入队尾,缺页且队列满时,淘汰队首页面。

LRU 算法:最近最少使用算法,可用字典记录页面访问顺序。页面访问时更新字典,缺页时淘汰最久未使用页面(字典中最早的键)。

最优页面置换算法:置换未来最长时间不被访问的页面。需预先知道页面引用串全部信息,实际难实现,但可用于性能比较。分析引用串,选未来最长时间不被用的页面置换。

import random

def generate_page_reference_string(length):
    return [random.randint(0, 9) for _ in range(length)]

def fifo(page_reference_string, frame_count):
    frames = []
    page_faults = 0
    for page in page_reference_string:
        if page not in frames:
            if len(frames) == frame_count:
                frames.pop(0)
            frames.append(page)
            page_faults += 1
    return page_faults

def lru(page_reference_string, frame_count):
    frames = {}
    page_faults = 0
    for i, page in enumerate(page_reference_string):
        if page not in frames:
            if len(frames) == frame_count:
                oldest_page = min(frames, key=frames.get)
                del frames[oldest_page]
            frames[page] = i
            page_faults += 1
        else:
            frames[page] = i
    return page_faults

def optimal(page_reference_string, frame_count):
    frames = []
    page_faults = 0
    for i, page in enumerate(page_reference_string):
        if page not in frames:
            if len(frames) == frame_count:
                future_pages = page_reference_string[i + 1:]
                farthest_page = max(frames, key=lambda p: future_pages.index(p) if p in future_pages else float('inf'))
                frames.remove(farthest_page)
            frames.append(page)
            page_faults += 1
    return page_faults

if __name__ == "__main__":
    page_reference_string = generate_page_reference_string(20)
    print("Page reference string:", page_reference_string)
    frame_count = 3
    print("FIFO page faults:", fifo(page_reference_string.copy(), frame_count))
    print("LRU page faults:", lru(page_reference_string.copy(), frame_count))
    print("Optimal page faults:", optimal(page_reference_string.copy(), frame_count))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2256524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新的springboot 3.x的支持s3协议的2.x方法的minio上传文件方法

拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/minio:latest运行命令 docker run -d \--name minio \-p 10087:9000 \-p 10088:9001 \-e MINIO_ROOT_USERminioadmin \-e MINIO_ROOT_PASSWORDY6HYraaphfZ9k8Lv \-v /data/minio/data:/data \-v /data/…

cocos creator接入字节跳动抖音小游戏JSAPI敏感词检测(进行文字输入,但输入敏感词后没有替换为*号)

今天更新了某个抖音小游戏的版本&#xff0c;增加了部分剧情&#xff0c;半天过后一条短信审核未通过&#xff0c;emmm…抖音总是能给开发者惊喜…打开电脑看看这次又整什么幺蛾子… 首先是一脸懵逼&#xff0c;后端早已接入了官方的内容安全检测能力了&#xff08;https://de…

Origin快速拟合荧光寿命、PL Decay (TRPL)数据分析处理-方法二

1.先导入数据到origin 2.导入文件的时候注意&#xff1a;名字短的这个是&#xff0c;或者你打开后看哪个里面有800&#xff0c;因为我的激光重频是1.25Hz&#xff08;应该是&#xff0c;不太确定单位是KHz还是MHz&#xff09;&#xff0c;所以对应的时间是800s。 3.选中两列直接…

17. 面向对象的特征

一、面向对象的三大特征 面向对象的三大特征指的是 封装、继承、多态。 封装&#xff08;encapsulation&#xff0c;有时称为数据隐藏&#xff09;是处理对象的一个重要概念。从形式上看&#xff0c;封装就是将数据和行为组合在一个包中&#xff0c;并对对象的使用者隐藏具体的…

Apache Dolphinscheduler可视化 DAG 工作流任务调度系统

Apache Dolphinscheduler 关于 一个分布式易扩展的可视化 DAG 工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。 DolphinScheduler 的主要特性如下&#xff1a; 易于部署&#xff0c;提供四种部署方式&am…

第二部分:基础知识 6.函数 --[JavaScript 新手村:开启编程之旅的第一步]

JavaScript 函数是可重用的代码块&#xff0c;用于执行特定任务。函数可以接受参数&#xff08;输入数据&#xff09;&#xff0c;并且可以返回一个值。JavaScript 提供了多种定义函数的方式&#xff0c;下面将详细介绍这些方式&#xff0c;并给出一些示例。 1. 函数声明 下面…

我眼中的“懂重构”(一)

初识重构 2017年的时候&#xff0c;领导让我看公司的一本书《重构——改善代码的既有设计》&#xff0c;这是一本JAVA版本的&#xff0c;前后看了2遍。那时候看书因为不懂看的格外仔细。我只是那时候不懂&#xff0c;然而多年后的今天我仍然发现很多人对重构充满误解。在刚进入…

机器学习详解(3):线性回归之代码详解

文章目录 1 数据预处理2 构建线性回归模型并绘制回归线初始化方法前向传播&#xff1a;forward_propagation代价函数&#xff1a;cost_function反向传播&#xff1a;backward_propagation参数更新&#xff1a;update_parameters训练方法&#xff1a;train代码运行结果 3 使用Py…

基于openzeppelin插件的智能合约升级

一、作用以及优点 部署可升级合约&#xff0c;插件自动部署proxy和proxyAdmin合约&#xff0c;帮助管理合约升级和交互&#xff1b;升级已部署合约&#xff0c;通过插件快速升级合约&#xff0c;脚本开发方便快捷&#xff1b;管理代理管理员的权限&#xff0c;只有proxyAdmin的…

游戏引擎学习第36天

仓库 :https://gitee.com/mrxiao_com/2d_game 回顾之前的内容 在这个程序中&#xff0c;目标是通过手动编写代码来从头开始制作一个完整的游戏。整个过程不使用任何库或现成的游戏引擎&#xff0c;这样做的目的是为了能够全面了解游戏执行的每一个细节。开发过程中&#xff0…

试题转excel;pdf转excel;试卷转Excel,word试题转excel

一、问题描述 一名教师朋友&#xff0c;偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运&#xff0c;几百道题几乎需要一个下午的时间 关键这些事&#xff0c;枯燥无聊费眼睛&#xff0c;实在是看起来就很蠢的工作 就想着做一个工具&#xff0c;可以自动处理…

16-01、JVM系列之:内存与垃圾回收篇(一)

JVM系列之&#xff1a;内存与垃圾回收篇&#xff08;一&#xff09; ##本篇内容概述&#xff1a; 1、JVM结构 2、类加载子系统 3、运行时数据区之&#xff1a;PC寄存器、Java栈、本地方法栈一、JVM与JAVA体系结构 JAVA虚拟机与JAVA语言并没有必然的联系&#xff0c;它只是与特…

2030. gitLab A仓同步到B仓

文章目录 1 A 仓库备份 到 B 仓库2 B 仓库修改main分支的权限 1 A 仓库备份 到 B 仓库 #!/bin/bash# 定义变量 REPO_DIR"/home/xhome/opt/git_sync/zz_xx_xx" # 替换为你的本地库A的实际路径 REMOTE_ORIGIN"http://192.168.1.66:8181/zzkj_software/zz_xx_xx.…

服务器上部署前端页面-实现IP+端口/index.html在线访问你的网页

首先一点&#xff0c;不管是那个框架开发的网页前端&#xff0c;最后都需要Build,构建完毕以后都是原始的HTML CSS JS 三样文件&#xff01; 所以不管用原始的三剑客&#xff08;HTML CSS JS&#xff09;开发的前端还是用各类框架开发的前端界面&#xff08;只是让开发简单…

树莓派 PICO RP2040 MACOS 使用

文章参考&#xff1a; Developing in C on the RP2040: macOS | Wellys Dev 这里会提示报错&#xff1a;ln: /bin/picotool: Operation not permitted 参考&#xff1a;Mac ln命令报错&#xff1a;Operation not permitted_ln operation not permitted-CSDN博客 放在 usr/lo…

顶顶通电话机器人开发接口对接大语言模型之实时流TTS对接介绍

大语言模型一般都是流式返回文字&#xff0c;如果等全部文字返回了一次性去TTS&#xff0c;那么延迟会非常严重&#xff0c;常用的方法就是通过标点符号断句&#xff0c;返回了一句话就提交给TTS。随着流TTS的出现&#xff0c;就可以直接把大模型返回的文字灌给流TTS&#xff0…

git使用-创建本地仓库、绑定远程仓库

文章目录 1. 创建git仓库2. commit提交到本地3. 创建远程仓库4. 关联远程仓库5. push代码至远程仓库6. 完成初始化 git作为版本控制工具&#xff0c;在开发过程中经常使用到。这里以github为例&#xff0c;简单介绍下仓库的创建及绑定&#xff0c;方便忘记了能快速的想起来。 1…

JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)

目录 JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能&#xff0c;JS中排序算法的使用详解&#xff08;附实际应用代码&#xff09; 一、为什么要使用Array.sort() 二、Array.sort() 的使用与技巧 1、基础语法 2、返回值 3、…

为什么Unity里的变体数和UWA工具测出来的不一样

1&#xff09;为什么Unity里的变体数和UWA工具测出来的不一样 2&#xff09;使用TextureArray为什么会导致L1 Cache Miss率变高 3&#xff09;Gfx.PresentFrame耗时异常高 4&#xff09;AO方案中哪个更适合移动端 这是第412篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的…

汽车免拆案例 | 2007款宝马650i车发动机偶尔无法起动

故障现象 一辆2007款宝马650i车&#xff0c;搭载N62B48B发动机&#xff0c;累计行驶里程约为26万km。车主反映&#xff0c;发动机偶尔无法起动&#xff0c;故障频率较低&#xff0c;十几天出现1 次&#xff0c;且故障出现时起动机不工作。 故障诊断  接车后试车&#xff0c;…