SWJTU 操作系统实验-内存管理
来源:互联网 发布:希腊经济知乎 编辑:程序博客网 时间:2024/05/21 19:28
和之前的实验一样,仍然是模拟,这次是模拟操作系统的内存管理。
要求实现OPT置换算法与CLOCK算法。
算法具体不再赘述,参考下文。
http://blog.csdn.net/wanghao109/article/details/13003479
OPT置换概要:当页表未满时,新到达进程直接进表,表中无重复元素,,页表满后,若新到达进程不在页表中,则遍历页表中所有元素,找出距离下一次执行最远的进程进行替换。
CLOCK算法概要:
当页表未满时,若新到达进程未在页表中,进表且指针+1,若新到达进程已在页表中,指针不移动。
页表满后,若新到达进程已在页表中,将该进程使用状态改为true(注:无论该进程当前进程使用状态是true或false,都执行将使用状态改为true的操作),且指针不移动,且指针不移动,且指针不移动。参见下图所示样例。
图注:深色带星号表示true,浅色表示false。
(三张图都是新到进程已在页表中,体现了直接修改状态而不移动指针的特点。)
若新到达进程不在页表中,则从指针所在位置开始扫描,若指向位置使用状态为true,改为false,若指向位置使用状态为false,将新到达进程置于此位置,并将此位置的使用状态改为true(扫描过程中注意对角标取模避免越界,最开始我就栽在这里)。
Page Fault简单粗暴版识别概要:
(必要条件:页表已满)将当前页表与前一个页表比较,若不一样,Page Fault++;
例:
下方带F的页表都与前一个页表不同。
同理:
/*Title:OPTAuthor:UranuslightSchool:SWJTUBuild Date:2017/05/26Last revision:2017/05/26Version:1.0*/#include<iostream>#include<cstring>#include<cmath>#include<algorithm>#define multiple 3#define inf 0x3f3f3f3fusing namespace std;int pagesize;//cin >> pagesizeint processnum;//num of processint page[10];int nowsize = 0;//is pageframe full?int origin[100];int pagefault = 0;typedef struct{int pid;int nexttime;}target;void opt(int len,int origin[100])//len processnum*multiple{int existflag = 0;for (int i = 0; i<len; i++){existflag = 0;if (nowsize != pagesize)//frame is not full{for (int j = 0; j<pagesize; j++)//check has new process existed in page already{if (origin[i] == page[j]){existflag = 1;//new is exist in pageframe already}}if (existflag == 0)//new is not exist in pageframe{page[nowsize++] = origin[i];//add to pageframe,pointer++}//else do nothing}else//frame is full now{for (int j = 0; j<pagesize; j++){if (origin[i] == page[j])//new is exist{existflag = 1;break;}}if (existflag == 0)//new coming{target t;t.nexttime = 0;int success = 0;//could find current pid in next arrayint j = 0;for (j = 0; j<pagesize; j++)//find process with longest nexttime{int now = page[j];success = 0;for (int k = i; k<len; k++){if (origin[k] == now){success = 1;//find successfulif (k - i > t.nexttime)//{t.nexttime = k - i - 1;t.pid = j;break;}elsebreak;}}//find fail then variable success is 0if (success == 0)//find fail,this process is not in next array{page[j] = origin[i];pagefault++;break;}}if (success == 1){page[t.pid] = origin[i];pagefault++;}}}cout << "step " << i << ":";for (int k = 0; k<nowsize; k++)cout << "|" << page[k];cout << endl;}cout << endl << "page fault: " << pagefault << endl;}int main(){// 测试样例//pagesize = 3;//processnum = 5;//int origin[100] = { 2,3,2,1,5,2,4,5,3,2,5,2 };//opt(12,origin);while (1){cout << "input the pagesize and num of process" << endl;cin >> pagesize >> processnum;if (pagesize==0 || processnum==0)break;int len = processnum*multiple;for (int i = 0; i < len; i++){origin[i] = rand() % processnum + 1;cout << origin[i] << " ";}cout << endl;opt(len, origin);}system("pause");return 0;}
/*Title:CLOCKAuthor:UranuslightSchool:SWJTUBuild Date:2017/05/27Last revision:2017/05/27Version:1.0*/#include<iostream>#include<cstring>#include<cmath>#include<algorithm>#define multiple 3#define inf 0x3f3f3f3fusing namespace std;typedef struct {int pid;bool status;}Page;int pagesize;//cin >> pagesizeint processnum;//num of processint nowsize = 0;//is pageframe full?int origin[100];int pagefault = 0;int pointer = 0;Page page[10];void CLOCK(int len, int origin[100])//len processnum*multiple{int existflag = 0;for (int i = 0; i<len; i++){existflag = 0;if (nowsize != pagesize)//frame is not full{for (int j = 0; j<pagesize; j++)//check has new process existed in page already{if (origin[i] == page[j].pid){existflag = 1;//new is exist in pageframe already}}if (existflag == 0)//new is not exist in pageframe{page[nowsize].pid = origin[i];//add to pageframe,pointer++page[nowsize++].status = true;pointer = (pointer + 1) % pagesize;}//else do nothing}else//frame is full now{for (int j = 0; j<pagesize; j++){if (origin[i] == page[j].pid)//new is exist{existflag = 1;page[j].status = true;//new is exist already ,pointer dont movebreak;}}if (existflag == 0)//new coming{pagefault++;for (int j = pointer; j != inf; j++){if (!page[j].status){page[j%pagesize].pid = origin[i];page[j%pagesize].status = true;pointer = (pointer + 1) % pagesize;break;}else{page[j].status = !page[j].status;pointer = (pointer + 1) % pagesize;}}}}cout << "step " << i << ":";for (int k = 0; k<nowsize; k++)cout << "|" << page[k].pid;cout << endl;}cout << endl << "page fault: " << pagefault << endl;}int main(){//测试样例/*pagesize = 3;processnum = 5;int origin[100] = { 2,3,2,1,5,2,4,5,3,2,5,2 };CLOCK(12, origin);system("pause");*/while (1){cout << "input the pagesize and num of process" << endl;cin >> pagesize >> processnum;if (pagesize == 0 || processnum == 0)break;int len = processnum*multiple;for (int i = 0; i < len; i++){origin[i] = rand() % processnum + 1;cout << origin[i] << " ";}cout << endl;CLOCK(len, origin);}system("pause");return 0;}示例代码Test5.c
LRU与FIFO算法,一起贴出来好了。
#include <stdio.h>#include <stdlib.h>#include <time.h>#define random(x) (rand() % x)#define MULTIPLE 3typedef struct page_s { int n; //number int v; //visit flag}page;char *menu[] = { "f - FIFO", "r - LRU", "q - quit", NULL};int getchoice(char *greet, char *choices[]) { int chosen = 0; int selected; char **option; do { printf("Choice: %s\n", greet); option = choices; while(*option) { printf("%s\n", *option); option++; } do { selected = getchar(); } while(selected == '\n'); option = choices; while(*option) { if(selected == *option[0]) { chosen = 1; break; } option++; } if(!chosen) { printf("Incorrect choice, select again\n"); } } while(!chosen); return selected; }void buildPageReference(int size, page **reference, page *program) { int i; int n; printf("Page reference : "); for(i=0;i<size;i++) { n = random(size/MULTIPLE); reference[i] = &program[n]; program[n].n = n; program[n].v = 0; printf("| %d ", n); } printf("\n");}void print(int n, page *frame, int size) { int i; printf("no. %d step: ", n); for(i=0;i<size;i++) { printf("| %d ", frame[i].n); } printf("\n");}int Search(int n, page *list, int size) { int i; for(i=0;i<size;i++) { if(list[i].n == n) return i; } return -1;}int findNext(int n, page **list, int start, int size) { int count = size; int i; for(i=start;i<size;i++) { if(list[i]->n == n) break; else count++; } return count;}int findLastMax(page *frame, int size) { int tmp=0,s,i,j=0; for(i=0;i<size;i++) { s = frame[i].v; if(s > tmp) { tmp = s; j = i; } } return j;}int findLastMin(page *frame, int size) { int tmp=frame[0].v,s,i,j=0; //printf("| %d ", tmp); for(i=1;i<size;i++) { s = frame[i].v; // printf("| %d ", s); if(s < tmp) { tmp = s; j = i; } } // printf("\n"); return j;}int fifo(int fsize, page *frame, int rsize, page **pageR) { int i, j=0,p=0; int f=0; for(i=0;i<fsize;i++) frame[i].n = -1; for(i=0;i<rsize;i++) { if(Search(pageR[i]->n, frame, fsize)!=-1); else if(i<fsize || p<fsize) { frame[p].n=pageR[i]->n; p++; } else { frame[j%fsize].n = pageR[i]->n; j++; f++; } print(i, frame, fsize); } printf("page fault : %d\n", f); }int lru(int fsize, page *frame, int rsize, page **pageR) { int i, j, p=0, q; int f=0; for(i=0;i<fsize;i++) { frame[i].n = -1; frame[i].v = 0; } for(i=0;i<rsize;i++) { for(j=0;j<fsize;j++) { if(frame[j].n!=-1) frame[j].v++; } q = Search(pageR[i]->n, frame, fsize); if(q!=-1) frame[q].v=0; else if(i<fsize || p<fsize) { frame[p].n=pageR[i]->n; p++; }else { q = findLastMax(frame, fsize); frame[q].n = pageR[i]->n; frame[q].v = 0; f++; } print(i, frame, fsize); } printf("page fault : %d\n", f);}int main() { int choice = 0; int logSize; int phySize; page *program; page **pageR; page *frame; int prSize; srand((int)time(0)); printf("Enter number of pages in program: "); scanf("%d", &logSize); printf("Enter number of frames in physical memory: "); scanf("%d", &phySize); program = (page *)malloc(sizeof(int)*2*logSize); frame = (page *)malloc(sizeof(int)*2*phySize); prSize = logSize * MULTIPLE; pageR = (page **)malloc(sizeof(int*)*prSize); buildPageReference(prSize, pageR,program); do { choice = getchoice("Please select an action", menu); printf("You have chosen: %c\n", choice); switch(choice) { case 'f' : fifo(phySize, frame, prSize, pageR); break; case 'r' : lru(phySize, frame, prSize, pageR); break; default: break; } }while(choice != 'q'); exit(0);}
阅读全文
0 0
- SWJTU 操作系统实验-内存管理
- 操作系统实验-内存管理
- [仿真实验]操作系统的内存管理
- 哈工大操作系统实验6—内存管理
- 操作系统实验——内存管理
- 操作系统实验——内存管理
- 操作系统 模拟可变分区内存管理实验 C语言描述
- 操作系统实验——内存管理之页面置换算法
- 操作系统进程管理实验
- 操作系统实验存储管理
- 操作系统内存管理
- 操作系统内存管理
- 操作系统内存管理
- 操作系统内存管理
- 操作系统八内存管理
- 操作系统内存管理浅见
- 操作系统--内存管理
- 操作系统原理内存管理
- Kotlin基础教程-基础语法(2)
- 常见的几种内排序算法以及实现(C语言)
- MySql 5.6.36 64位绿色版安装
- sdut-离散题目15
- oracle授权问题
- SWJTU 操作系统实验-内存管理
- MacOS install Homebrew
- sdut-离散题目16
- Java工程师技术栈
- Android 自定义 View 的重绘和更新使用
- 【DOS命令】之 move 文件移动
- 矩阵覆盖
- 电话拨号器错误打包运行错误
- 安装win10