⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档 (4).txt

📁 页式内存管理系统模拟程序 c
💻 TXT
字号:
#include "string.h"
#include "stdio.h"
//#include

const int PAGES=256; //定义总块数
const int WORD=16; //定义存储单元的位数
const int ROW=PAGES/WORD; //定义总字数
typedef struct node{
    char jobname[20];
    int num;
    int nums[PAGES];
    struct node *next;
}jobs;
int table[ROW][WORD];
int freenum=0;
jobs *head;

//初始化函数
void initial()
{
int i,j;
jobs *p;
for(i=0;i<=ROW;i++) //初始化位示图
for(j=0;j<=WORD;j++)
{ 
   table[i][j]=0;
   freenum++;
}
p=new jobs; //初始化作业表头
strcpy(p->jobname,"jhead");
p->num=0;
p->next=NULL;
head=p;
}

//读入位示图初始数据
void readData()
{
int i,j;
FILE *fp;
char fname[20];
printf("请输入初始位示图数据文件名:");
scanf("%s",fname);
if((fp=fopen(fname, "r"))==NULL)
      printf( "文件不能打开!\n" );
else
{
for(i=0;i<ROW;i++)
{
   for(j=0;j<WORD;j++)
   {
      fscanf(fp,"%d",&table[i][j]);
   // fread(&table[i],2,WORD,fp);
        // for(j=0;j<WORD;i++)
   // {
      // printf("%d",table[i][j]);
      if(table[i][j]==0) freenum++;
   }
}
/*for(i=0;i<ROW;i++)
{
   for(j=0;j<WORD;j++)
   {
       printf("%d ",table[i][j]);
   }
}*/
}
}

//新加入作业函数
void addjob()
{
char name[20];
jobs *p;
int a,i,j,k=0;
printf("请输入新增的作业名:");
scanf("%s",name);
printf("新增作业所需内存块数:");
scanf("%d",&a);
if(a<=freenum)
{
p=new jobs;
strcpy(p->jobname,name);
p->num=a;
//j=0;
for(i=0;k<a&&i<ROW;i++)
{
   for(j=0;k<a&&j<WORD;j++) 
   { 
      // while(table[i][j]==1)
    //{           
       //         j++;
      //      if(table[i][j]==1)   i++;
   // }
   if(table[i][j]==0)
   {
         p->nums[k]=i * WORD + j;
   k++;
         table[i][j]=1;
   }
}
}
p->next=head->next;
head->next=p;
freenum-=a;
printf("作业分配成功!\n");
}
else printf("错误,当前剩余的物理块数小于所需的页数,请稍候再试!");
}

//完成作业回收函数
void finish()
{
char name[20];
jobs *p,*q;
int n,i,j,a,k;
printf("请输入完成的作业名:");
scanf("%s",name);
p=head->next;
q=head;
while(p!=NULL)
{
if(strcmp(p->jobname,name)==0)
{
         // q=q->next; 
      break;
} 
       q=p;
    p=p->next; 
}
//p=q->next;
a=p->num;
for(k=0;k<a;k++)
{
n=p->nums[k];
i=n/WORD;
j=n%WORD;
table[i][j]=0;
printf("该作业所占用的%d号物理块已回收成功!\n",n);
}
freenum+=a;
q->next=p->next;
delete p;
printf("回收完毕!\n");
}


//显示当前位示图函数
void view_table()
{
int i,j;
printf("当前位示图如下:\n");
printf("━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
for(i=0;i<ROW;i++)
{
for(j=0;j<WORD;j++)
printf("%d ",table[i][j]);
printf("\n");
}
printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
}

//显示所有页表函数
void view_pages()
{
jobs *p;
int i;
p=head->next;
if(p==NULL) printf("当前没有用户作业");
else
printf("当前所有的用户作业页表情况如下:\n");
while(p!=NULL)
{
printf("作业名:%s ,所用块数:%d\n",p->jobname,p->num);
printf("为本作业所分配的物理块是:");
for(i=0;i<p->num;i++) printf("%d号物理块---",p->nums[i]);
printf("\n");
p=p->next;
}
}

//显示版权信息函数
void mversion()
{
printf(" |--------------------------------------------------|\n");
printf(" |     页式内存管理系统模拟程序            |\n");
printf(" |--------------------------------------------------|\n");
printf(" |菜单: (0)退出         (1)添加作业           |\n");
printf(" |                                          |\n");
printf(" |    (2)回收作业     (3)查看位示图            |\n");
printf(" |                                          |\n");
printf(" |    (4)查看内存分配情况                       |\n");                                          
printf(" |--------------------------------------------------|\n");
}


void main()
{
int t=1,chioce;
mversion();
initial();
readData();
//printf("请选择:");
//scanf("%d",&chioce);
while(t==1)
{
printf("\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
printf("请选择菜单:");
scanf("%d",&chioce);
switch(chioce)
{
case 1: addjob(); break;
case 2: finish(); break;
case 3: view_table();break;
case 4: view_pages(); break;
case 0: t=0;break;
default: printf("选择错误!\n");
}
}
}


test.txt文本的内容如下:

1 1 0 0 1 1 1 0 1 0 1 1 0 1 1 0
0 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0
0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1
1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0
1 1 0 0 1 1 1 0 1 1 1 1 0 1 1 0
0 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0
0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1
1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0
1 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0
0 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0
0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1
1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0
1 1 0 0 1 0 1 0 1 0 1 1 0 1 1 0
0 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0
0 1 0 1 0 1 1 0 1 0 0 0 0 1 0 1
1 0 1 0 1 1 0 1 0 1 0 0 1 1 0 0
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -