zoukankan      html  css  js  c++  java
  • (三)页式存储管理方案

    页式存储管理方案
    位示图
    内存被划分成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;
    }
    }
    }
  • 相关阅读:
    SGU 176.Flow construction (有上下界的最大流)
    POJ 2391.Ombrophobic Bovines (最大流)
    poj 1087.A Plug for UNIX (最大流)
    poj 1273.PIG (最大流)
    POJ 2112.Optimal Milking (最大流)
    SGU 196.Matrix Multiplication
    SGU 195. New Year Bonus Grant
    关于multicycle path
    ppt做gif动图
    codeforces 598A Tricky Sum
  • 原文地址:https://www.cnblogs.com/FCWORLD/p/1896351.html
Copyright © 2011-2022 走看看