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



推荐阅读
  • Logging all MySQL queries into the Slow Log
    MySQLoptionallylogsslowqueriesintotheSlowQueryLog–orjustSlowLog,asfriendscallit.However,Thereareseveralreasonstologallqueries.Thislistisnotexhaustive:Belowyoucanfindthevariablestochange,astheyshouldbewritteninth ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
  • 小编给大家分享一下Vue3中如何提高开发效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获, ... [详细]
  • linux网络子系统分析(二)—— 协议栈分层框架的建立
    目录一、综述二、INET的初始化2.1INET接口注册2.2抽象实体的建立2.3代码细节分析2.3.1socket参数三、其他协议3.1PF_PACKET3.2P ... [详细]
  • HTML:  将文件拖拽到此区域 ... [详细]
  • Bootstrap Paginator 分页插件详解与应用
    本文深入探讨了Bootstrap Paginator这款流行的JavaScript分页插件,提供了详细的使用指南和示例代码,旨在帮助开发者更好地理解和利用该工具进行高效的数据展示。 ... [详细]
  • 函子(Functor)是函数式编程中的一个重要概念,它不仅是一个特殊的容器,还提供了一种优雅的方式来处理值和函数。本文将详细介绍函子的基本概念及其在函数式编程中的应用,包括如何通过函子控制副作用、处理异常以及进行异步操作。 ... [详细]
  • 本文详细介绍了如何在Spring框架中设置事件发布器、定义事件监听器及响应事件的具体步骤。通过实现ApplicationEventPublisherAware接口来创建事件发布器,利用ApplicationEvent类定义自定义事件,并通过ApplicationListener接口来处理这些事件。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • 入门指南:使用FastRPC技术连接Qualcomm Hexagon DSP
    本文旨在为初学者提供关于如何使用FastRPC技术连接Qualcomm Hexagon DSP的基础知识。FastRPC技术允许开发者在本地客户端实现远程调用,从而简化Hexagon DSP的开发和调试过程。 ... [详细]
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社区 版权所有