热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(三)页式存储管理方案

为什么80%的码农都做不了架构师?页式存储管理方案位示图内存被划分成2048块(页)。用32位字长的字存放位示图,为0

为什么80%的码农都做不了架构师?>>>   hot3.png

页式存储管理方案
位示图
内存被划分成2048块(页)。用32位字长的字存放位示图,为0的位表示该块尚未分配,为1的位表示该块已分配?
实习检查:
1、运行程序,由检查教师给出文件名,该文件中存有内存目前状况的位示图的数据(0和1的文件)。(程序应做提示,界面友好)。
2、你所编制的程序应读入数据,存放在相应的数据结构中。
3、显示友好的用户界面,由检查教师输入内存申请(总块数)。
4、根据申请和位示图状态,为用户分配内存,并建立页表。
5、输出位示图和页表

本程序包括主要实现位示图算法,比较简单.

 

页式存储管理方案

#include < stdio.h >
#include
< iostream.h >
#include
< string .h >

const int PAGES &#61; 256 ; // 定义总块数
const int WORD &#61; 32 ; // 定义字长

const int WORDNUM &#61; PAGES / WORD; // 定义总字数

typedef
struct node{
char jobname[ 20 ];
int num;
int nums[PAGES];
struct node * next;
}jobs;

int table[WORDNUM][WORD];
int freenum &#61; 0 ;
jobs
* head;

// 初始化函数
void initial(){
int i,j;
jobs
* p;

// 初始化位示图
for (i &#61; 0 ;i < WORDNUM;i &#43;&#43; ){
for (j &#61; 0 ;j < WORD;j &#43;&#43; ){
table[i][j]
&#61; 0 ;
}
}

// 初始化作业表头
p &#61; new jobs;
strcpy(p
-> jobname, " null " );
p
-> num &#61; 0 ;
p
-> next &#61; NULL;
head
&#61; p;


}

// 读入位示图初始数据
void readData()
{
int i,j;
FILE
* fp;
char fname[ 20 ];

cout
<< " 请输入初始位示图数据文件名: " << endl;
cin
>> fname;

if ((fp &#61; fopen(fname, " r " )) !&#61; NULL){
for (i &#61; 0 ;i < WORDNUM;i &#43;&#43; ){
for (j &#61; 0 ;j < WORD;j &#43;&#43; ){
fscanf(fp,
" %d " , & table[i][j]);
if (table[i][j] &#61;&#61; 1 )
freenum
&#43;&#43; ;
}
}
cout
<< " 初始位示图 " << endl;
for (i &#61; 0 ;i < WORDNUM;i &#43;&#43; ){
for (j &#61; 0 ;j < WORD;j &#43;&#43; ){
cout
<< table[i][j] << " " ;
}
cout
<< endl;
}
cout
<< " 总空闲块数: " << freenum;

}
else {
cout
<< " 文件不能打开 " << endl;
}

}

// 新加入作业函数
void add()
{
char jobname[ 20 ];
int num;
jobs
* p;
int i,j,k &#61; 0 ;

cout
<< " 请输入新增的作业名: " ;
cin
>> jobname;
cout
<< " 新增作业所需页数: " ;
cin
>> num;

if (num <&#61; freenum){
freenum
-&#61; num;

p
&#61; new jobs;
strcpy(p
-> jobname,jobname);
p
-> num &#61; num;

for (k &#61; 0 ;k < num;k &#43;&#43; ){
i
&#61; 0 ;
j
&#61; 0 ;
while (table[i][j] &#61;&#61; 1 ){
j
&#61; 0 ;
while (table[i][j] &#61;&#61; 1 )j &#43;&#43; ;
if (table[i][j] &#61;&#61; 1 )
i
&#43;&#43; ;
}
p
-> nums[k] &#61; i * WORD &#43; j;
table[i][j]
&#61; 1 ;
}

p
-> next &#61; head -> next;
head
-> next &#61; p;

}
else {
cout
<< " 错误,当前剩余页数小于所需页数,请稍候再试:} " << endl;
}

}

// 完成作业函数
void finish()
{
char jobname[ 20 ];

jobs
* p, * q;
int n,i,j,num,k;

cout
<< " 请输入完成的作业名: " ;
cin
>> jobname;

p
&#61; head -> next;
q
&#61; head;

while (p !&#61; NULL){
if (strcmp(p -> jobname,jobname)){
q
&#61; q -> next;
}
p
&#61; p -> next;
}

p
&#61; q -> next;

num
&#61; p -> num;
for (k &#61; 0 ;k < num;k &#43;&#43; ){
n
&#61; p -> nums[k];
i
&#61; n / WORD;
j
&#61; n % WORD;
table[i][j]
&#61; 0 ;
}

freenum
&#43;&#61; num;
q
-> next &#61; p -> next;
delete p;

}


// 显示当前位示图函数
void view_table()
{
int i,j;
cout
<< " 当前位示图 " << endl;
for (i &#61; 0 ;i < WORDNUM;i &#43;&#43; ){
for (j &#61; 0 ;j < WORD;j &#43;&#43; ){
cout
<< table[i][j] << " " ;
}
cout
<< endl;
}
cout
<< " 总空闲块数: " << freenum << endl;
}

// 显示所有页表函数
void view_pages()
{
jobs
* p;
int i;

p
&#61; head -> next;
if (p &#61;&#61; NULL)cout << " 当前没有用户作业 " << endl;
else
cout
<< " 当前所有的用户作业页表情况 " << endl;
while (p !&#61; NULL){
cout
<< " 作业名: " << p -> jobname << " 所用块数: " << p -> num << endl;
cout
<< " 本作业所点块的序列是: " << endl;
for (i &#61; 0 ;i < p -> num;i &#43;&#43; ){
cout
<< p -> nums[i] << " " ;
}
cout
<< endl;
p
&#61; p -> next;
}
}

// 显示版权信息函数
void version()
{
cout
<< endl << endl;

cout
<< " ┏━━━━━━━━━━━━━━━━━━━━━━━┓ " << endl;
cout
<< " ┃     页式内存管理系统模拟程序        ┃ " << endl;
cout
<< " ┠───────────────────────┨ " << endl;
cout
<< " ┃   (c)All Right Reserved Neo        ┃ " << endl;
cout
<< " ┃      sony006&#64;163.com          ┃ " << endl;
cout
<< " ┃     version 2004 build 1122       ┃ " << endl;
cout
<< " ┗━━━━━━━━━━━━━━━━━━━━━━━┛ " << endl;

cout
<< endl << endl;
}


void main()
{
int t &#61; 1 ,chioce;

version();
initial();

readData();

while (t &#61;&#61; 1 ){
cout
<< endl << " &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61; " << endl;
cout
<< " 页式内存管理系统模拟程序 " << endl;
cout
<< " &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61; " << endl;
cout
<< " 1.加入新作业 2.完成作业 3.显示当前内存位示图 4.显示所有作业页表 0.退出 " << endl;
cout
<< " 请选择: " ;
cin
>> chioce;

switch (chioce){
case 1 :
add();
break ;
case 2 :
finish();
break ;
case 3 :
view_table();
break ;
case 4 :
view_pages();
break ;
case 0 :
t
&#61; 0 ;
break ;
default :
cout
<< " 选择错误 " << endl;
}
}
}

 


转:https://my.oschina.net/garyun/blog/602904



推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了多因子选股模型在实际中的构建步骤,包括风险源分析、因子筛选和体系构建,并进行了模拟实证回测。在风险源分析中,从宏观、行业、公司和特殊因素四个角度分析了影响资产价格的因素。具体包括宏观经济运行和宏经济政策对证券市场的影响,以及行业类型、行业生命周期和行业政策对股票价格的影响。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
author-avatar
mobiledu2502924751
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有