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);}



原创粉丝点击