1、freecount定义一个页表结构体:yebiao其中包含三个成员:int yehao; / 页号int kuaihao; /块号struct yebiao *next; /指向下一个页表项的指针定义一个进程结构体:progress其中包含四个成员:char name30; /进程名int size; /进程所需内存大小struct progress *next;struct yebiao *yb; /为其分配内存建立的页表首地址源程序及注释:#includeiostream.hiomanip.hmalloc.hstring.hstdlib.hint bitmap88= /初始化位图;int
2、freecount=54; /初始时空闲页块数typedef struct yebiao /页表结构体 int yehao; int kuaihao; struct yebiao *next;YEBIAO;typedef struct progress /进程结构体 char name30; int size; struct progress *next; struct yebiao *yb;PROGRESS;/*分配内存函数,为进程分配所需要的内存并建立页表*/YEBIAO *allocation(int size) YEBIAO *head; YEBIAO *tem; int n=0; t
3、em=(YEBIAO *)malloc(sizeof(YEBIAO); head=tem; for(int i=0;i+) /遍历位图找到空闲的页块 if(bitmapi/8i%8=1) continue; /如果页会已被占用直接查下一个页块 if(bitmapi/8i%8=0) bitmapi/8i%8=1; /将空闲的位图标识置为一 tem-yehao=n; /建立一个页表项的页号kuaihao=i; /对应的块号next=NULL; n+; if(n=size) break; /如果已经分配了需要的页块直接退出查找 else next=(YEBIAO *)malloc(sizeof(YE
4、BIAO); tem=tem-next; return head;/*回收内存*/void recovery(YEBIAO *a) YEBIAO *b; while(a-next!=NULL) bitmapa-kuaihao/8a-kuaihao%8=0; /将页块对应的标识位图对应标志置0 b=a- /指向下一个页表项 free(a); /释放页表项占用的空间 a=b; bitmapa- free(a);void outputyebiao(YEBIAO *a) /输出页表的内容 cout-endl; do coutyehaosetw(4)kuaihao while(a!=NULL); /遍历
5、页表链表逐行输出页表项void outputbit() /输出主存分配位视图 cout主存分配位视图如下:-i8;i+) for(int j=0;jj+)bitmapij else /定位到链表的队尾将要插入的进程插入到队尾 tem=head; while(tem- tem-next=b;PROGRESS *getprosess(PROGRESS *head) /输入进程为进程分配空间 PROGRESS *a; char na30;请输入进程名: cinna;请输入进程所占内存大小:size; /上面是输入进程的名称和所用内存空间大小 if(sizefreecount) /如果进程进程所需内存
6、的大小大于空闲的内存,无法添加进程。 return head; a=(PROGRESS *)malloc(sizeof(PROGRESS); /开辟空间存放进程信息 strcpy(a-name,na); a-size=size; /初始化进程的基本信息 freecount-=size; /将可用的页块数减去进程要用的页块数yb=allocation(size); /为进程创建页表进程创建成功! return insert(head,a); /将进程插入进程链表中void outputprosess(PROGRESS *head) /输出进程信息 if(head=NULL) /判断进程队列是否为
7、空当前没有进程! return; do /进程队列不为空,先输出进程的名称和所占内存的大小。再输出进程的页表队列进程名为:head-name 进程所占内存的大小为:sizeyb); head=head- while(head!PROGRESS * delecteprosess(PROGRESS *head) /删除进程 PROGRESS *a,*b;请输入要删除的进程名: /使用进程的名字来删除进程 if(head=NULL) /如果进程为空,退出函数进程链表为空,没有进程可删除。 return NULL; if(strcmp(head-name,na)=0) /如果找到要删除的进程 reco
8、very(head- /先删除进程的页表并释放所占的页 freecount+=head- /将可用的内存数加上进程所占的内孙 a=head- free(head); /释放进程信息所占得内存空间进程na b=head; while(a!=NULL) /遍历链表找到要删除的进程 if(strcmp(a-name,na)=0) recovery(a- freecount+=a-next=a- b=a; a=a-您输入的进程名不对,删除进程失败。void outbiaoti()ttt主存空间的分配与回收模拟您可进行如下操作: 1.查看内存分配情况; 2.查看进程; 3.添加进程 4.删除进程tt 可用内存为freecountn; switch(n) case 1: outputbit();outbiaoti();break; case 2:clsoutputprosess(head); case 3:head=getprosess(head); case 4:head=delecteprosess(head); default: break;流程图:程序运行时的初值和运行结果:
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2