|
/* 主要是模拟教材给出表格形式.^_^
模拟页式存储管理方案中内存空间的管理和分配
内存被划分成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 |
|