操作系统实验
存储管理
#include using namespace std; #define INVALID -1 //定义结构类型 struct pl_type { //页表结构 int pn; //页号 int fn; //页帧号 int time; //访问时间 }; struct fl_type { //页帧结构 int pn; //页号 int fn; //页帧号 struct fl_type *next;//链接指针 }; //定义结构变量 pl_type pl[512]; fl_type fl[512],*free_head,*busy_head,*busy_tail; int page[512]; //访问串(存放每条指令的页号) int TOTAL_PAGES; //访问串长度 int diseffect; //页故障数 //初始化函数:初始化页表和页帧链 //形参total_pf为分配给用户进程的内存页帧数 void initialize(int total_pf) { int i; diseffect=0; //页故障数初始化为0 //建立空页表 for(i=0;i<512;i++) { pl[i].pn=i; //页号 pl[i].fn=INVALID; //页帧号为-1,(开始时,页还未装入到页帧) pl[i].time=-1; } //建立空闲页帧链 for(i=0;i fl[i-1].next=&fl[i]; //建立fl[i-1]和fl[i]间的链接 fl[i-1].fn=i-1; } fl[total_pf-1].next=NULL; //链表末尾为空指针 fl[total_pf-1].fn=total_pf-1; //末尾结点的页帧号 free_head=&fl[0]; //空闲页帧链头指针指向fl[0] } void LRU(int total_pf) { int i,j,min,minj,present_time; present_time=0; initialize(total_pf); for(i=0;i if(pl[page[i]].fn==INVALID) { //页故障 diseffect++; if(free_head==NULL) { //无空闲页帧 min=32767; for(j=0;j if(min>pl[j].time && pl[j].fn!=INVALID){ min=pl[j].time; minj=j; } } free_head=&fl[pl[minj].fn]; //腾出一页帧 pl[minj].fn=INVALID; pl[minj].time=-1; free_head->next=NULL; } pl[page[i]].fn=free_head->fn; //有空闲页帧,改为有效 pl[page[i]].time=present_time; //time置为当前时间 free_head=free_head->next; //空闲页帧链头指针前移 } else pl[page[i]].time=present_time; //time置为当前时间 present_time++; } cout<<\" LRU: \"< //输入访问串 void getRefstring(void) { int i; cout<<\"输入的访问串以'-1'结束!\"< for(i=0;i<512;i++) { cin>>page[i]; if(page[i]==-1) break; } TOTAL_PAGES=i; //访问串大小 cout<<\"访问串大小:\"<for(i=0;i int main() { int f; getRefstring(); for(f=2;f<=TOTAL_PAGES;f++) { //页帧数从3个页帧到TOTAL_PAGES个页帧 cout<<\"若分配给进程\"< cout< system(\"pause\"); return 0; } 运行界面截图 因篇幅问题不能全部显示,请点此查看更多更全内容