操作系统原理与实验——实验九分页式存储

实验指南

运行环境:

Dev c++

算法思想:

本实验模拟分页存储管理,对于需要分配资源的作业,预先申请空间,内存空间满足要求,进行内存分配并插入作业链表,打印该作业页表信息与系统内存信息。对于需要回收资源的作业,若能再作业链表中找到该作业,进行内存释放并从作业链表中删除,最后打印系统内存信息。

关键数据结构定义:

int sc[MAX][MAX]= {0};//系统内存

int MemorySize;//系统内存大小

int WordLength;//字长

int WordNum;//页数

int BlockSize;//物理块

int BlockNum;//一个物理块的大小

int UsingBolckNum;

int AvailableBlockNum;

//作业节点

typedef struct link_node

{

    char name[10];//作业名

    int size[MAX][MAX];//作业页表

    struct link_node *next;

} node;

程序框架:

//函数名:OperationChoice       函数参数:无

int OperationChoice()

{

//函数功能:打印操作菜单,选择需要进行的操作

}

//函数名:print       函数参数:无

void print()

{

//函数功能:打印系统内存信息

}

//函数名:allocate    函数参数:head(作业链表的第一个节点)

node* allocate(node *head)

{

//函数功能:建立作业节点,判断是否可以分配,可以进行下一步,进行内存分配,插         入作业链表,打印该作业的页表信息,打印系统内存信息

}

//函数名:recycle        函数参数:head(作业链表的第一个节点)

node* recycle(node *head)

{

//函数功能:找到待回收的作业节点,释放内存,从作业链表中删除,打印系统内存信息

}

//函数名:initMemory       函数参数:无

void initMemory(){

//函数功能:定义内存大小,字长与物理块大小,初始化系统内存,打印系统内存信息

}

//函数名:Apply          函数参数:无

void Apply()

{

    initMemory();

    while(1)

    {

        int c;

        c=OperationChoice();

        switch(c)

        {

        case 1:

            head=allocate(head);

            break;

        case 2:

            head=recycle(head);

            break;

        case 0:

            return ;

        }

    }

}

int main()

{

    Apply();

    return 0;

}

测试用例:

/*
1000
64
1
1
job2
50
1
job1
30
2
job2
2
1
2
job1
0
*/

关键代码

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
int sc[MAX][MAX]= {0};//系统内存
int MemorySize;//系统内存大小
int WordLength;//字长
int WordNum;//页数
int BlockSize;//一个物理块的大小
int BlockNum;//物理块数 
int UsingBlockNum;//已用物理块数 
int AvailableBlockNum;//系统剩余物理块数 
//作业节点
typedef struct link_node
{char name[10];//作业名int size[MAX][MAX];//作业页表int jobsize;//作业大小 struct link_node *next;
} node;
int OperationChoice();
void print();
node* allocate(node *head);
node* recycle(node *head);
void initMemory();
void Apply();
//函数名:OperationChoice       函数参数:无
int OperationChoice()
{
//函数功能:打印操作菜单,选择需要进行的操作//printf("      剩余物理块数%d\n",AvailableBlockNum);printf("*********分页式管理*********\n");printf("   *     1.内存分配     *   \n");printf("   *     2.内存去配     *   \n");printf("   *     0.退出         *   \n");printf("         请输入选项[ ]\b\b");int c;scanf("%d",&c);return c;
}
//函数名:print       函数参数:无
void print()
{
//函数功能:打印系统内存信息int count = 0;printf("主存位示图如下所示:\n    ");for(int i = 0;i<WordLength;i++){if(i>60&&i%60 == 1)printf("\n    ");printf(" %2d",i);}printf("\n");for(int i = 0;i<WordNum;i++){for(int j = 0;j<WordLength;j++){if(j == 0){printf("%3d| %2d",i,sc[i][j]);}else{if(j>60&&j%60 == 1){printf("\n    ");}printf(" %2d",sc[i][j]);}count++;if(count == BlockNum)break; }printf("\n");}printf("\n");printf("    剩余物理块数%d\n",AvailableBlockNum);
}
//函数名:allocate    函数参数:head(作业链表的第一个节点)
node* allocate(node *head)
{
//函数功能:建立作业节点,判断是否可以分配,可以进行下一步,进行内存分配,插	入作业链表,打印该作业的页表信息,打印系统内存信息node *q;q=head;node *p = (node *)malloc(sizeof(node));p->next = NULL; print();printf("    请输入作业的名字:");scanf("%s",&p->name);printf("    请输入作业需要分配的大小:");scanf("%d",&p->jobsize);if(p->jobsize<=AvailableBlockNum){if(q == NULL){q = p;head = q;}else{while(q->next!=NULL){q = q->next; }q->next = p;q = p;}printf("    分配成功!\n");int count = 0;for(int i = 0;i<WordNum;i++){for(int j = 0;j<WordLength;j++){if(sc[i][j] == 0){//printf("置换%d %d\n",i,j);sc[i][j] = 1;UsingBlockNum++;AvailableBlockNum--;p->size[count][0] = count;p->size[count][1] = i*WordLength + j;count++;if(count == p->jobsize)break;}}if(count == p->jobsize)break;}print();printf("**********打印%s作业的页表**********\n",p->name);for(int i = 0;i<p->jobsize;i++)printf("       %2d      %2d\n",p->size[i][0],p->size[i][1]);}else{printf("分配失败!\n");print();free(p);}return head;
}
//函数名:recycle        函数参数:head(作业链表的第一个节点)
node* recycle(node *head)
{
//函数功能:找到待回收的作业节点,释放内存,从作业链表中删除,打印系统内存信息node *pre,*p;char Name[10];printf("请输入你当前要回收的作业名:");scanf("%s",&Name);p = head;while(p!=NULL){if(strcmp(Name,p->name) == 0)break;pre = p;p = p->next; }if(p == NULL)printf("无此作业!回收失败!\n");else{printf("该作业回收成功!\n");if(p == head){head = p->next;}else{pre->next = p->next;}for(int i = 0;i<p->jobsize;i++){sc[p->size[i][1]/WordLength][p->size[i][1]%WordLength] = 0;UsingBlockNum--;AvailableBlockNum++;}free(p);print();}return head;
}
//函数名:initMemory       函数参数:无
void initMemory(){
//函数功能:定义内存大小,字长与物理块大小,初始化系统内存,打印系统内存信息printf("请输入系统内存空间的大小:");scanf("%d",&MemorySize);printf("请输入字长(16/32/64):");scanf("%d",&WordLength);printf("请输入物理块大小:");scanf("%d",&BlockSize);BlockNum = MemorySize/BlockSize;WordNum = BlockNum/WordLength;if(BlockNum%WordLength)WordNum++;UsingBlockNum = 0;AvailableBlockNum = 0;int count = 0;for(int i = 0;i<WordNum;i++){for(int j = 0;j<WordLength;j++){sc[i][j] = rand()%2;if(sc[i][j] == 1)UsingBlockNum++;elseAvailableBlockNum++;count++;if(count == BlockNum)break; }if(count == BlockNum)break; }print();
}
//函数名:Apply          函数参数:无
void Apply()
{	node *head = NULL;initMemory();while(1){int c;c=OperationChoice();switch(c){case 1:head=allocate(head);break;case 2:head=recycle(head);break;case 0:return ;}}
}int main()
{Apply();return 0;
}

运行结果

实验总结

①对链表的应用还不是很熟悉

②打印格式稍加修改了一下

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

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

相关文章

【QT学习】9.绘图,三种贴图,贴图的转换

一。绘图的解释 Qt 中提供了强大的 2D 绘图系统&#xff0c;可以使用相同的 API 在屏幕和绘图设备上进行绘制&#xff0c;它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。 QPainter 用于执行绘图操作&#xff0c;其提供的 API 在 GUI 或 QImage、QOpenGLPaintDev…

路由引入实验

配置思路&#xff1a; 1.IP配置&#xff1a; [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip ad 100.1.1.1 24 [R1-GigabitEthernet0/0/0]int l0 [R1-LoopBack0]ip ad 192.168.0.1 32 [R1-LoopBack0]int l1 [R1-LoopBack1]ip ad 192.168.1.1 32 [R1-LoopBack1]q dis ip int bri…

海康Visionmaster-常见问题排查方法-启动阶段

VM试用版启动时&#xff0c;弹窗报错&#xff1a;加密狗未安装或检测异常&#xff1b;  问题原因&#xff1a;安装VM 的时候未选择软加密&#xff0c;选择了加密狗驱动&#xff0c;此时要使用软授权就出现了此现象。  解决方法&#xff1a; ① 首先确认软加密驱动正确安装…

XYCTF 部分wp及学习记录

1.ezmd5 根据题目提示 我们知道应该是要上传两张md5值相同的图片 根据原文链接&#xff1a;cryptanalysis - Are there two known strings which have the same MD5 hash value? - Cryptography Stack Exchange 把保存下来的图片上传一下 得到flag 2.ezhttp 根据原文链接&…

OpenStack云计算(十一)——OpenStack网络管理,验证OpenStack网络资源模型,验证来巩固和加深对OpenStack网络资源模型的理解

项目实训一 【实训题目】 验证OpenStack网络资源模型 【实训目的】 通过验证来巩固和加深对OpenStack网络资源模型的理解。 【实训准备】 &#xff08;1&#xff09;复习Neutron网络资源模型。 &#xff08;2&#xff09;重点理解网络、子网、端口和路由器的概念。 【实…

SOTAX溶出测试系统PC触摸屏维修三部曲

SOTAX溶出测试系统作为一款广泛应用于制药行业的知名品牌&#xff0c;具有高精度、操作简便、稳定性好等特点。它适用于各种类型的药品研发和生产环节&#xff0c;为科研人员提供可靠的数据支持。瑞士SOTAX溶出仪是实验室中常用的设备&#xff0c;其触摸屏是用户交互的重要界面…

【java毕业设计】 基于Spring Boot+mysql的免税商品优选购物商城设计与实现(程序源码)-免税商品优选购物商城

基于Spring Bootmysql的免税商品优选购物商城设计与实现&#xff08;程序源码毕业论文&#xff09; 大家好&#xff0c;今天给大家介绍基于Spring Bootmysql的免税商品优选购物商城设计与实现&#xff0c;本论文只截取部分文章重点&#xff0c;文章末尾附有本毕业设计完整源码及…

Mysql学习一

目录 1.启动数据库&#xff1a; 2.命令行连接到MySQL&#xff08;winr输入cmd&#xff09; 3.MySQL的三重结构&#xff1a; 4.SQL语句分类&#xff1a; 1.启动数据库&#xff1a; winr——输入services.msc进入本地服务 2.命令行连接到MySQL&#xff08;winr输入cmd&#x…

数据结构-树和森林之间的转化

从树的二叉链表的定义可知&#xff0c;任何一棵和树对应的二叉树&#xff0c;其根节点的右子树必为空。这里我们举三个树&#xff0c;将这个由三个树组成的森林组成二叉树是这个样子的。 下面我们说明一下详细过程&#xff0c;首先将每个树转化为二叉的状态&#xff0c;如图所示…

[激光原理与应用-89]:激光器产品性能指标参数详解

目录 示例&#xff1a;大量能纳秒激光器 示例2&#xff1a;中等能量纳秒激光器 1、中心波长Wavelength (nm) 351nm1nm 2、脉冲宽度 Pulse Width ~120ns 1kHz 3、重复频率 Repitition Rate 1~10KHz 4、行频 Line Frequency 50 to 60 Hz 5、单脉冲能量 Pulse …

逆向修改app就可以游戏充值到账?

hello ,大家好, 现在市场仍然流行着非常多的传奇类游戏私服或者其他类型的游戏私服,随着私服越来越多(很多并不合法),越来越多的人加入了破解,逆向修改,或者代充的队伍并从中获利。这里我给大家分享一下这些做代充的常规的做法,以及大家作为游戏服务器如何避坑做强校验…

在linux系统中启动pycharm

1.找到pycharm的安装路径&#xff0c;一般在下载文件夹中 2.进入pycharm的安装路径&#xff0c;进入bin目录 3.右击&#xff0c;打开终端&#xff0c;输入./pycharm.sh

数字化工厂生产管理系统提升企业竞争力

在当今激烈竞争的市场环境中&#xff0c;企业面临着诸多挑战&#xff0c;如不断增加的客户需求、日益严格的质量标准以及快速变化的市场趋势。为了在这样的环境中保持竞争力&#xff0c;许多企业正在转向数字化工厂生产管理系统。 数字化工厂生产管理系统是一种集成的软件解决方…

云盘怎么选最好!

选择云盘时&#xff0c;您应该考虑以下几个关键因素来确保选中最适合您需求的服务&#xff1a; 速度&#xff1a;选择云盘时&#xff0c;传输速度是一个重要的考量点。您应该选择一个即使不使用会员服务也能提供较快上传和下载速度的云盘服务。 存储空间&#xff1a;不同的云盘…

Kubernetes(k8s)的概念以及使用

k8s的概念&#xff1a; K8s是指Kubernetes&#xff0c;是一个开源的容器编排和管理平台。它最初由Google开发&#xff0c;并于2014年将其开源。Kubernetes旨在简化容器化应用程序的部署、扩展和管理。 Kubernetes提供了一种可靠且可扩展的平台&#xff0c;用于管理容器化应用…

Jmeter(十二) - 从入门到精通 - JMeter逻辑控制器 - 终篇(详解教程)

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 Jmeter官网对逻辑控制器的解释是&#xff1a;“Logic Controllers determine the order in which Samplers are processed.”。 意思是说&#xff0c;逻辑控制器可以控制采样…

vue-manage-system 版本更新,让开发更加简单

vue-manage-system 近期进行了一次版本升级&#xff0c;主要是支持了更多功能、升级依赖版本和优化样式&#xff0c;并且上线了官方文档网站&#xff0c;大部分功能都有文档或者使用示例&#xff0c;更加适合新手上手开发&#xff0c;只需要根据实际业务简单修改&#xff0c;就…

AMEYA360:MOS管失效的六大原因

功率器件在近几年的市场方面发展的非常火爆&#xff0c;尤其是 MOS 管&#xff0c;他主要应用在电源适配器&#xff0c;电池管理系统以及逆变器和电机控制系统中。 而随着计算器主板&#xff0c;AI 显卡&#xff0c;服务器等行业的爆发&#xff0c;低压功率 MOS 管将再次迎来爆…

查找算法之斐波那契查找

目录 前言一、查找算法预备知识二、斐波那契查找三、总结3.1 查找性能3.2 适用场景 前言 查找算法是一种用于在数据集合中查找特定元素的算法。在计算机科学中&#xff0c;查找算法通常被用于在数组、链表、树等数据结构中查找目标元素的位置或者判断目标元素是否存在。 查找算…

大珩PPT助手一键颜色设置

大珩PPT助手最新推出的一键设置文字颜色和背景色功能&#xff0c;为用户在创建演示文稿时带来了更便捷、高效的体验。这一功能使用户能够轻松调整演示文稿中文字的颜色和幻灯片的背景色&#xff0c;以满足不同场合和主题的需要。 以下是该功能的几个关键特点和优势&#xff1a…