当前位置: 首页 > article >正文

Operating System 实验二 内存管理实验

目录

实验目标:

实验设备:

实验内容:

(1)验证FIFO和Stack LRU页面置换算法

【代码(注释率不低于30%)】

【实验过程(截图)】

【结论】

(2)分别用FIFO和Stack LRU页置换算法,自己设定一个页面引用序列,绘制页错误次数和可用页帧总数的曲线并对比(可用Excel绘制或手绘);能否重现FIFO导致的Belady异常;

【代码】

【过程】

【结论】

(3)[选做]编程实现最优页置换算法,用课件上的序列验证

【代码】

【过程】

【结论】

Linux环境下尝试过程:(成功!)

1、使用winscp 将文件从windows文件夹复制到linux文件夹。

2、安装cmake和vi

3、练习vi使用

4、Cmake使用


本栏目不存在实验一

实验目标

  1. 熟悉linux下C程序的编译和链接;熟悉CMake工具使用;
  2. 熟悉命令行方式下,用vi修改源代码文件
  3. 编写程序验证FIFO和Stack LRU页面置换算法
  4. 分别用FIFO和Stack LRU页置换算法,自己设定一个页面引用序列,绘制页错误次数和可用页帧总数的曲线并对比(可用Excel绘制或手绘);能否重现FIFO导致的Belady异常;
  5. [选做]编程实现最优页置换算法,用课件上的序列验证。

实验设备

  1. 硬件:微机,hyper-V虚拟化平台或者远程linux终端
  2. 软件:cmake,demo代码

实验内容:

(1)验证FIFO和Stack LRU页面置换算法
【代码(注释率不低于30%)】

Main.c

//模拟了两种经典的页面置换算法:先进先出(FIFO) 和 最近最少使用(LRU)
#include <stdio.h>
#include "queue.h"
#include "stack.h"int test_fifo(int frameCount, int reference[], int totalCount) {//模拟 FIFO 页面置换算法。int i, victim;int errCount = 0;// 用于统计页面错误的次数queue_init(frameCount);//初始化一个队列,队列大小为 frameCount,表示内存中的页框数量。for (i = 0; i < totalCount; i++) {printf("-------------------------------\n");int page = reference[i];// 当前引用的页面int index = queue_find(page);// 在队列中查找当前页面,返回索引if (index >= 0) {// 有映射的页帧,成功printf("page OK!\n");continue;// 跳过当前循环,处理下一个页面}// 发生了页错误errCount++;printf("page fault: ");if (!queue_is_full()) {// 队列未满,有可用页帧,载入新页queue_push(page);printf(" load for page: %d\n", page);} else {// 没有可用页帧,选择一个牺牲帧(出队一个最早的页)victim = queue_pop();//移除最早进入的printf("swap out %d, ", victim);queue_push(page);//加入新页面printf("swap in %d\n", page);}queue_print();//打印队列当前状态}return errCount; // 返回页面错误的总次数}int test_lru_stack(int frameCount, int reference[], int totalCount) {//模拟 LRU 页面置换算法。选择最久未使用的页面作为牺牲页面。int i, victim;int errCount = 0;stack_init(frameCount);// 初始化栈,设置栈大小为 frameCountfor (i = 0; i < totalCount; i++) {printf("-------------------------------\n");int page = reference[i];//引用当前int index = stack_find(page);//栈中查找if (index >= 0) {// 有映射的页帧,成功;将该页移动到栈顶stack_move_to_top(index);printf("page OK!\n");continue;}// 发生了页错误errCount++;printf("page fault: ");if (!stack_is_full()) {// 有可用页帧,载入新页stack_push(page);printf(" load for page: %d\n", page);} else {// 没有可用页帧,从栈底选择一个LRU牺牲帧victim = stack_pop_bottom();printf("swap out %d, ", victim);stack_push(page);// 将新页面压入栈printf("swap in %d\n", page);}stack_print();}return errCount;
}int main() {//程序入口,定义页面引用序列并调用测试函数int reference[] = {//ppt示例7, 0, 1, 2, 0,3, 0, 4, 2, 3,0, 3, 2, 1, 2,0, 1, 7, 0, 1};int totalCount = sizeof(reference) / sizeof(int);// 计算引用序列的长度int errCount;int frameCount = 3;// // 设置内存页框数量为 3errCount = test_fifo(frameCount, reference, totalCount);// 调用 FIFO 算法 预计701(LRU为107)printf("FIFO: frames:%d total: %d,  error: %d, error rate: %.0f%%\n", frameCount, totalCount, errCount,100.0 * errCount / totalCount);return 0;
}

Queue.h

#ifndef MYC_QUEUE_H
#define MYC_QUEUE_Hvoid queue_init(int capacity);int queue_push(int number);int queue_pop();int queue_find(int value);void queue_print();void stack_print();int queue_is_full();#endif //MYC_QUEUE_H

Queue.c

/*queue_ init()初始化队列,分配内存并设置队列的容量
queue push()向队列中添加一个元素。
queue_pop()从队列中移除一个元素。
queue_find()在队列中查找一个元素
queue is fu11():判断队列是否已满。
queue_size():返回队列中元素的数量,
queue_print():打印队列的当前状态*/
#include <stdio.h>
#include <stdlib.h>static int *g_data = NULL;  // 指向队列数据的指针
static int g_capacity = 0;  // 队列的最大容量
static int rear = 0;        // 队尾指针
static int front = 0;       // 队头指针
static int is_full = 0;     // 标志队列是否已满
void queue_init(int capacity) {int i;if (g_data) free(g_data);  // 如果队列已初始化,释放原有内存g_capacity = capacity;     // 设置队列容量g_data = (int *)malloc(g_capacity * sizeof(int));  // 分配内存front = rear = 0;          // 初始化队头和队尾指针is_full = 0;               // 初始化队列为空for (i = 0; i < g_capacity; i++) {g_data[i] = -1;        // 初始化队列数据为 -1(表示空位)}
}
int queue_push(int number) {if (is_full) {// 如果队列已满,返回 -1 表示失败return -1;}g_data[rear] = number;     // 将元素添加到队尾rear = (rear + 1) % g_capacity;  // 更新队尾指针(循环队列的关键)if (rear % g_capacity == front) {// 如果队尾指针追上队头指针,队列已满is_full = 1;}return 0;  // 成功返回 0
}
int queue_is_full() {return is_full;
}int queue_size() {//计算队列中当前的元素数量。return (rear - front + g_capacity) % g_capacity;
}int queue_pop() {int i;if (!is_full) {// 队空return -1;}is_full = 0;int value = g_data[front];  // 获取队头元素g_data[front] = -1;         // 将队头位置标记为空front = (front + 1) % g_capacity;  // 更新队头指针return value;  // 返回移除的元素
}int queue_find(int value) {int i;for (i = 0; i < g_capacity; i++) {if (g_data[i] == value)return i;// 找到元素,返回其索引}return -1;
}void queue_print() {int i;for (i = 0; i < g_capacity; i++) {if (g_data[i] < 0)printf("- ");// 空位打印 `-`else printf("%d ", g_data[i]);    // 打印队列中的元素}printf("\n");
}

stack.h

#ifndef MYC_STACK_H
#define MYC_STACK_Hvoid stack_init(int capacity);int stack_push(int number);int stack_pop();int stack_find(int value);int stack_move_to_top(int index);int stack_pop_bottom();int stack_is_full();#endif //MYC_STACK_H

stack.c

#include <stdlib.h>
#include <stdio.h>static int *g_data = NULL;  // 指向栈数据的指针
static int g_capacity = 0;  // 栈的最大容量
static int g_size = 0;      // 栈中当前元素的数量void stack_init(int capacity) {int i;if (g_data) free(g_data);  // 如果栈已初始化,释放原有内存g_data = (int *)malloc(capacity * sizeof(int));  // 分配内存g_capacity = capacity;  // 设置栈的容量g_size = 0;  // 初始化栈为空for (i = 0; i < g_capacity; i++) {g_data[i] = -1;  // 初始化栈数据为 -1(表示空位)}
}
int stack_push(int number) {if (g_size >= g_capacity) {// 如果栈已满,返回 -1 表示失败return -1;}g_data[g_size] = number;  // 将元素添加到栈顶return g_size++;  // 更新栈的大小

相关文章:

Operating System 实验二 内存管理实验

目录 实验目标: 实验设备: 实验内容: (1)验证FIFO和Stack LRU页面置换算法 【代码(注释率不低于30%)】 【实验过程(截图)】 【结论】 (2)分别用FIFO和Stack LRU页置换算法,自己设定一个页面引用序列,绘制页错误次数和可用页帧总数的曲线并对比(可用Excel绘…...

CF-Hero:自动绕过CDN找真实ip地址

CF-Hero&#xff1a;自动绕过CDN找真实ip地址 CF-Hero 是一个全面的侦察工具&#xff0c;用于发现受 Cloudflare 保护的 Web 应用程序的真实 IP 地址。它通过各种方法执行多源情报收集。目前仅支持Cloudflare的cdn服务查找真实ip&#xff0c;但从原理上来说查找方法都是通用的…...

Linux基础IO(十一)之动态库(基础IO的最后一篇啦!)

文章目录 动态库生成动态库使用动态库现象事实使用外部库动态库怎么被加载的进程地址空间的第二讲关于地址1.程序没有加载前的地址&#xff08;程序&#xff09;2.程序加载后的地址&#xff08;进程&#xff09;3.动态库的地址 动态库 生成动态库 shared: 表示生成共享库格式…...

【版本控制】SVN + TortoiseSVN版本管理实用教程(附安装+开发常用操作)

摘要&#xff1a; 本文将带你从零开始掌握 SVN 版本控制系统&#xff0c;结合 TortoiseSVN 图形客户端工具&#xff0c;深入学习包括安装、检出、提交、更新、回滚、冲突解决等常用开发操作&#xff0c;快速上手团队协作&#xff01; &#x1f9e9; 什么是 SVN&#xff1f; SV…...

非序列实现MEMS聚焦功能

zemax非序列模式下有MEMS,但是没有对应的代码。无法修改成自己需要的功能 以下是实现MEMS聚焦功能: #include <windows.h> #include <cmath> #include <stdio.h> #include <string.h> #include <algorithm> #undef max #undef min#define D…...

【前端】CSS 基础

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解 CSS 基础语法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;前端基础…...

【金仓数据库征文】——选择金仓,选择胜利

目录 第一部分&#xff1a;金仓数据库——开创数据库技术的新时代 1.1 金仓数据库的技术底蕴 1.2 高可用架构与灾备能力 1.3 分布式架构与弹性扩展能力 第二部分&#xff1a;金仓数据库助力行业数字化转型 2.1 电信行业&#xff1a;核心系统国产化替代 2.2 医疗行业&…...

跟着尚硅谷学vue-day5

计算属性和watch监视 一.姓名案例 1.姓名案例-插值语法 <div id"root">姓&#xff1a;<input type"text" value"张" v-model"firstname"><br/><br/>名&#xff1a;<input type"text" value&q…...

【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十三章 异常处理:超越C错误码的文明时代

一、错误处理的范式革命 1.1 C错误处理的黑暗时代 C语言通过返回值传递错误状态&#xff0c;存在系统性缺陷&#xff1a; 典型错误处理模式&#xff1a; FILE* open_file(const char* path) { FILE* f fopen(path, "r"); if (!f) { return NULL; // 错误信息…...

运维打铁:Centos 7 使用yum安装 mysql5.7

文章目录 一、安装前信息说明二、安装步骤1. 下载并安装官网 RPM 安装包2. 修改配置文件 /etc/my.cnf3. 创建 MySQL 数据相关目录并授权4. 启动 MySQL 服务 三、修改数据库访问密码1. 修改配置文件 /etc/my.cnf2. 重启 MySQL 服务3. 登录数据库并修改密码4. 恢复配置文件并重启…...

网络原理初始

基础概念 组建局域网方式&#xff1a;路由器或者交换机。 IP确定主机&#xff0c;端口号确定使用的应用程序。 端口号&#xff1a;每个程序在进行网络通信中&#xff0c;都需要一个端口号。 协议&#xff1a;通信过程中的约定。 TCP/IP五层网络协议 从上到下 1、应用层&a…...

基于SpringBoot3实现MyBatis-Plus(SSMP)整合快速入门CURD(增删改查)

目录 一、快速搭建SpringBoot-Web工程脚手架。 1.1 Spring Initializr 初始化工程。(官方提供) 1.2 工程脚手架初始化详细步骤。(IDEA2024.1.1) 二、MyBatis-Plus的特性与快速上手。 2.1 官网地址与基本特性。 2.2 快速上手技术栈基础。 2.3 Spring Boot2 的 MyBatis-Plus Star…...

主题模型三大基石:Unigram、LSA、PLSA详解与对比

&#x1f31f; 主题模型演进图谱 文本建模三阶段&#xff1a; 词袋模型 → 潜在语义 → 概率生成 Unigram → LSA → PLSA → LDA &#x1f4e6; 基础模型&#xff1a;Unigram模型 核心假设 文档中每个词独立生成&#xff08;词袋假设&#xff09; 忽略词语顺序和语义关联 …...

Redis 热 key 和大 key 问题

一、什么是 Redis 热 key&#xff1f; 热 key&#xff08;Hot Key&#xff09;定义&#xff1a; 在单位时间内被**频繁访问&#xff08;读/写&#xff09;**的 key&#xff0c;导致其访问集中、压力过大。 热 key 常见表现&#xff1a; QPS 极高&#xff08;某 key 每秒被访问…...

基准指数选股策略思路

一种基于Python和聚宽平台的量化交易策略&#xff0c;主要包含以下内容&#xff1a; 1. 导入必要的库 - 导入jqdata和jqfactor库用于数据获取和因子计算。 - 导入numpy和pandas库用于数据处理。 2. 初始化函数 - 设置基准指数为沪深300指数。 - 配置交易参数&#xff0c;如使用…...

SAP接口超时:对 FOR ALL ENTRIES IN 的优化

SAP接口超时 经分析要10多分钟以上才出结果&#xff0c;且是这个语句耗时较长&#xff1a; SELECTaufnrmatnrbdmnglgortmeinschargFROM resbINTO CORRESPONDING FIELDS OF TABLE lt_lylcddxhFOR ALL ENTRIES IN lt_lylcddWHERE aufnr IN r_aufnr发现RESB有420万条记录&#xf…...

如何成功防护T级超大流量的DDoS攻击

防护T级超大流量的DDoS攻击需要综合技术、架构与运营策略的多层次防御体系。以下是基于最新技术实践和行业案例总结的关键防护策略&#xff1a; 一、流量清洗与分布式处理 部署流量清洗中心 T级攻击的核心防御依赖于专业的流量清洗技术。通过部署分布式流量清洗集群&#xff0c…...

【Easylive】为什么需要手动转换 feign.Response 到 HttpServletResponse

【Easylive】项目常见问题解答&#xff08;自用&持续更新中…&#xff09; 汇总版 为什么需要手动转换 feign.Response 到 HttpServletResponse&#xff1f; feign.Response 是 Feign 客户端调用远程服务后返回的原始 HTTP 响应对象&#xff0c;而 HttpServletResponse 是…...

深入理解机器学习:人工智能的核心驱动力

在当今数字化时代&#xff0c;机器学习作为人工智能领域的关键技术&#xff0c;正以前所未有的速度改变着我们的生活和工作方式。从智能语音助手到精准的医疗诊断&#xff0c;从个性化的推荐系统到自动驾驶汽车&#xff0c;机器学习的应用无处不在&#xff0c;其影响力深远而广…...

Shell 脚本入门:从零开始写自动化脚本

目录 一、Shell 、Shell 命令、Shell 脚本 二、常用 Shell 命令与注释写法 三、echo 命令的使用 四、Shell 变量类型 五、变量与参数使用 六、读取用户输入 七、算术运算 八、条件判断与流程控制 九、循环结构 十、函数定义与调用 一、Shell 、Shell 命令、Shell 脚本…...

Vibracostic EDI 需求分析

Vibracostic 是德国Freudenberg集团旗下全球领先的减振与噪音控制技术公司&#xff0c;专注于为汽车及工业领域提供高效振动管理和隔音解决方案&#xff0c;客户涵盖宝马、奔驰、特斯拉等主流车企。 Vibracostic EDI 需求分析 供应商接收Vibracostic发来的DELFOR交付预测报文…...

【网络安全】社会工程学策略

1. 社会工程学简介 社会工程攻击是威胁行为者常用的攻击方式。这是因为&#xff0c;诱骗人们提供访问权限、信息或金钱通常比利用软件或网络漏洞更容易。 您可能还记得&#xff0c;社会工程学是一种利用人为错误来获取私人信息、访问权限或贵重物品的操纵技术。它是一个涵盖性…...

项目笔记2:post请求是什么,还有什么请求

在 HTTP&#xff08;超文本传输协议&#xff09;中&#xff0c;请求方法用于向服务器表明客户端想要执行的操作。POST 请求是其中一种常见的请求方法&#xff0c;此外还有 GET、PUT、DELETE 等多种请求方法&#xff0c;下面为你详细介绍&#xff1a; POST 请求 定义&#xff…...

【最新版】西陆健身系统源码全开源+uniapp前端

一.系统介绍 一款基于UniappThinkPHP开发健身系统&#xff0c;支持多城市、多门店&#xff0c;包含用户端、教练端、门店端、平台端四个身份。有团课、私教、训练营三种课程类型&#xff0c;支持在线排课。私教可以通过上课获得收益&#xff0c;在线申请提现功能&#xff0c;无…...

常见移动机器人底盘模型对比(附图)

1. 概述 底盘模型驱动场景优势劣势双轮差速两轮驱动室内AGV结构简单、成本低转弯半径大&#xff0c;易打滑四轮差速四轮独立驱动复杂地形无人车全方位转向&#xff0c;机动性强控制复杂&#xff0c;能耗高阿克曼模型前轮转向后驱户外无人驾驶车高速稳定性好转弯半径大&#xf…...

如何在 MinGW 和 Visual Studio (MSVC) 之间共享 DLL

如何在 MinGW 和 Visual Studio (MSVC) 之间共享 DLL ✅ .dll.a 和 .lib 是什么&#xff1f; 1. .dll.a&#xff08;MinGW 下的 import library&#xff09; 作用&#xff1a;链接时告诉编译器如何调用 DLL 中的函数。谁用它&#xff1a;MinGW 编译器&#xff08;如 g&#x…...

【MongoDB】windows安装、配置、启动

&#x1fa9f; 一、下载 MongoDB 安装包 打开官方地址&#xff1a; &#x1f449; https://www.mongodb.com/try/download/community 配置下载选项&#xff1a; 选项设置Version最新&#xff08;默认就好&#xff09;OSWindowsPackageMSI&#xff08;推荐&#xff09; 点击【D…...

java实现 PDF中的图片文字内容识别

通过Tesseract进行OCR识别 前提:安装好Tesseract并下载好简体中文语言包,本文在Windows上验证过,需要安装包可以关注 公号 easy4java获取 1.配置maven依赖 <!-- pdf 解析--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdf…...

GitLab_密钥生成(SSH-key)

目录 1.密钥命令 2.自定义路径 3.输2次密码 4.查看公钥&#xff1a;&#xff08;打开文件&#xff09; 5. 把公钥&#xff0c;放到GitLab上面 6.填写公钥标题 7.点击 Add key 按钮 8. 验证添加是否成功 9. 测试 SSH 连接 10.彩蛋&#xff08;把ssh-key添加到python文…...

【视频时刻检索】Text-Video Retrieval via Multi-Modal Hypergraph Networks 论文阅读

Text-Video Retrieval via Multi-Modal Hypergraph Networks 论文阅读 ABSTRACT1 INTRODUCTION2 PRELIMINARIES3 OUR FRAMEWORK3.1 Multi-Modal Hypergraph Networks3.2 Variational Inference 4 EXPERIMENT6 CONCLUSION 文章信息&#xff1a; 发表于&#xff1a;WSDM 24 原文…...