热门标签 | 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



推荐阅读
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
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社区 版权所有