载入中…

您现在的位置: 四联自学考试网 >> 自考资讯 >> 复习指导 >> 理工医学 >> 计算机及应用 >> 串讲笔记 >> 文章正文
相 关 文 章
《操作系统》上机练习1-可变
《操作系统》上机考试试题
精 彩 推 荐
最 新 热 门
最 新 推 荐
欢迎光临四联自学,现在是:  祝您自考成功!
《操作系统》上机练习2-分页管理
原文作者:佚名  文章录入:admin  发布时间:2007-5-5 9:44:57    

/*
主要是模拟教材给出表格形式.^_^

模拟页式存储管理方案中内存空间的管理和分配

  内存被划分成2048块(页)。用32位字长的字存放位示图,为0的位表示该块尚未分配,为1的位表示该块已分配。

  实习检查:

  1、运行程序,由检查教师给出文件名,该文件中存有内存目前状况的位示图的数据(0和1的文件)。
    (程序应做提示,界面友好)。

  2、你所编制的程序应读入数据,存放在相应的数据结构中。

  3、显示友好的用户界面,由检查教师输入内存申请(总块数)。

  4、根据申请和位示图状态,为用户分配内存,并建立页表。

  5、输出位示图和页表
*/


#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>

#define AllPiece 256
#define WordLen 32
#define BitMapLen AllPiece/WordLen //如果不成整数倍关系,这里需要加1

struct PCB{
   char name[256]; //进程名
  struct{
       int pagenum; //页号
       int piecenum; //块号
   }pagetable[AllPiece]; //页表
   PCB* next; //下一个进程指针
}*pPCB; //头指针


//位示图
struct{
  int freecnt;     //空闲块总数
   int bm[BitMapLen]; //位图
}BitMap;

void InitBitMap(void)
{
   FILE *pfile;
   char filename[256];
   int i,j,k,l;

  printf("请输入位示图文件名:\n");
  scanf("%s",filename);
   pfile = fopen(filename,"rt");
   if(pfile == NULL)
   {
       printf("打开文件错误\n");
       return;
   }
   
   for(i = 0; i < BitMapLen; i ++)
   {
       for(j = 0; j < WordLen; j ++)
       {
           k = fscanf(pfile,"%d",&l);
           if(( k!= EOF) &&(k != 0))
           {
               if(l)
                   BitMap.bm[i] |= (1 << j);
               else
                   BitMap.freecnt ++;
           }
       }
   }
   fclose(pfile);
}

void DisplayBitMap(void)
{
   int i,j;
   
   printf("\n\n内存位示图\n");
   printf("----------------------------------------------\n");
   for(i = 0; i < BitMapLen; i ++)
   {
       for(j = 0; j < WordLen; j ++)
       {
           if(BitMap.bm[i] & (1 << j))
               printf("1 ");
           else
               printf("0 ");
       }
       printf("\n");
   }
   printf("内存空闲块数: %d\n",BitMap.freecnt);
   printf("\n");
}

void DisplayPageTable()
{
   int i;
   PCB* pcb;

   pcb = pPCB;
   while(pcb)
   {
       printf("\n-----------------\n");
       printf("进程名: %s\n",pcb->name);
       printf("页表:\n");

       i = 0;
       printf("页号   块号   \n");
       while(pcb->pagetable[i].pagenum)
       {
           printf("%4d   %4d\n",pcb->pagetable[i].pagenum,pcb->pagetable[i].piecenum);
           i ++;
       }

       pcb = pcb->next;
   }
   printf("\n\n");
}

void AllocBitMap(char* pname,int cnt)
{
   int i,j,k;
   PCB *pcb,*q;

   if(cnt > BitMap.freecnt)
   {
       printf("存储空间不足,无法为%s分配空间\n",pname);
       return;
   }

   pcb = (PCB*)malloc(sizeof(PCB));
   if(pcb == NULL)
   {
       printf("内存空间不足,无法为%s分配PCB\n",pname);
       return;
   }
   
   memset(pcb,0,sizeof(PCB));
  strcpy(pcb->name,pname); //进程名
   pcb->next = NULL;     //下一个进程指针

   k = 0;
   i = 0;
   j = 0;
   while(cnt>0)
   {
       if(!(BitMap.bm[i] & (1 << j)))
       {
                   //分配一块空间
           pcb->pagetable[k].pagenum = k+1;
           pcb->pagetable[k].piecenum = i * WordLen+j+1;
           k ++;

           BitMap.bm[i] |= (1 << j);
           BitMap.freecnt--;
           cnt --;
       }
       j ++;
       if(j >= WordLen)
       {
           i ++;
           if(i >= BitMapLen)break;
           j = 0;
       }
   }

   //尾插
   q = pPCB;
   if(q == NULL)
       pPCB = pcb;
   else
   {
       while(q->next != NULL)q=q->next;
       q->next = pcb;
   }
}


void main()
{
   char pn[256];
   int n;

   InitBitMap();
   DisplayBitMap();

   while(1)
   {
       printf("请申请内存的进程名(0退出):\n");
       scanf("%s",pn);
       if(!strcmp(pn,"0"))break;
       printf("请输入申请的内存块数:\n");
       scanf("%d",&n);
       AllocBitMap(pn,n);

       DisplayBitMap();
       DisplayPageTable();
   }
}

[1] [2] 下一页

更多资料尽在四联自考论坛http://bbs.4lzx.com),转贴请保留此信息。

凡本站注明版权的文章,版权归本站所有,任何媒体、网站或个人未经本站协议授权不得转载、链接、转贴或以其他方式复制,否则本站将依法追究责任。本站转载的信息,尽量保证版权信息的完整性,用户在网站上所发布、转载的文章所引起的版权问题以及其他纠纷,后果由用户自行承担,本网概不负责。如转载文章涉及版权等问题,请与我们联系。版权声明:/Copyright.asp
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 论坛交流】【发表评论】【打印本文】【关闭窗口