• (三)页式存储管理方案


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

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

    页式存储管理方案
    #include<stdio.h>
    #include
    <iostream.h>
    #include
    <string.h>

    const int PAGES=256; //定义总块数
    const int WORD=32; //定义字长

    const int WORDNUM=PAGES/WORD; //定义总字数

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

    int table[WORDNUM][WORD];
    int freenum=0;
    jobs
    *head;

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

    //初始化位示图
    for(i=0;i<WORDNUM;i++){
    for(j=0;j<WORD;j++){
    table[i][j]
    =0;
    }
    }

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


    }

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

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

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

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

    }

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

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

    if(num<=freenum){
    freenum
    -=num;

    p
    =new jobs;
    strcpy(p
    ->jobname,jobname);
    p
    ->num=num;

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

    p
    ->next=head->next;
    head
    ->next=p;

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

    }

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

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

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

    p
    =head->next;
    q
    =head;

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

    p
    =q->next;

    num
    =p->num;
    for(k=0;k<num;k++){
    n
    =p->nums[k];
    i
    =n/WORD;
    j
    =n%WORD;
    table[i][j]
    =0;
    }

    freenum
    +=num;
    q
    ->next=p->next;
    delete p;

    }


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

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

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

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

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

    cout
    <<endl<<endl;
    }


    void main()
    {
    int t=1,chioce;

    version();
    initial();

    readData();

    while(t==1){
    cout
    <<endl<<"==========================================="<<endl;
    cout
    <<" 页式内存管理系统模拟程序"<<endl;
    cout
    <<"==========================================="<<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
    =0;
    break;
    default:
    cout
    <<"选择错误"<<endl;
    }
    }
    }
  • 相关阅读:
    elk6.3 centos集群搭建 head插件安装
    10.2半群,同余关系,半群直积,商半群
    10.1代数结构
    9.4 关系的闭包
    9.5 等价关系
    9.6偏序关系
    9.3 关系的表示
    9.1 关系及关系性质
    差分数组
    拓扑排序
  • 原文地址:https://www.cnblogs.com/FCWORLD/p/1896351.html
Copyright © 2020-2023  润新知