模拟实现请求分页虚存页面替换算法

编写程序, 由必要的数据结构、 主函数、 页面置换算法函数和显示内存使用函数构成,
模拟实现请求分页管理中至少两种页面替换算法。要求程序运行时:
(1)显示主菜单,包含初始化内存、随机生成页面访问序列、模拟进程执行过程、显示内
存使用情况、显示进程页面状态。
(2)接收用户输入参数:可用内存容量、页面长度(即主存块大小)、进程个数、进程
长度(页面数)等。
(3) 可模拟一个进程的动态执行过程中各页面的换入换出;也可模拟多个进程并发过程
中各进程页面访问过程中的换入换出(采用固定分配、局部置换)。
(4)每个页面访问可用交互式进行,也可按照事先随机生成页面访问序列自动进行。
(5)每个页面访问的结果以命中、直接装入和替换来记录。
(6) 从 OPT、FIFO、LRU、LFU、SCR、Clock、改进的 Clock 等页面置换算法中选择两种
实现
 

程序实现的是单进程,FIFO和LRU置换算法

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define BUSY 1
#define IDLE 0
#define inf 0x3f3f3f3f
struct Block;
struct Page{
    int pageID;
    Block* to;
};
struct Block{
    Page* page;
    long time;
    int id;
    int state;
    struct Block* next;
};
struct Process{
    Page *page_list;
    int pageLength;
    int* num;
};
int total_Length,page_length;
int pocess_num;
struct Block* Block_list;
struct Process process;
void init()
{
    printf("请输入内存容量: ");
    scanf("%d",&total_Length);
    printf("请输入页面长度: ");
    scanf("%d",&page_length);
    if(total_Length%page_length)
    {
        printf("初始化失败!\n");
        return;
    }
    Block_list=new(Block);
    Block* p=Block_list;
    p->page=NULL;
    p->time=0;
    p->state=BUSY;
    p->next=NULL;
    int t=total_Length/page_length;
    for(int i=1;i<=t;i++)
    {
        p->next=new(Block);
        p=p->next;
        p->page=NULL;
        p->time=0;
        p->state=IDLE;
        p->id=i;
    }
    printf("初始化成功\n");
}
void show_Block()
{
    Block* p=Block_list->next;
    while(p!=NULL)
    {
        printf("%d:",p->id);
        if(p->state)
        {
            printf("已分配给%d号帧\n",p->page->pageID);
        }
        else
        {
            printf("空闲帧\n");
        }
        p=p->next;
    }
}
void show_Process()
{
    for(int i=1;i<=process.pageLength;i++)
    {
        printf("%d号页 ",i);
        if(process.page_list[i].pageID==-1)
        printf("未载入内存\n");
        else
        printf("已载入第%d帧\n",process.page_list[i].pageID);
    }
}
void creat_process()
{
    printf("请输入进程容量: \n");
    int length;
    scanf("%d",&length);
    process.pageLength=length/page_length;
    if(length%page_length)
    process.pageLength++;
    process.num=new int[process.pageLength+1];
    printf("共有%d个页面\n",process.pageLength);
    printf("1.随机生成页面访问序列\n");
    printf("2.手动输入页面访问序列\n");
    printf("请选择: ");
    int ti;
    scanf("%d",&ti);
    if(ti==1)
    {
        for(int i=1;i<=process.pageLength;i++)
        process.num[i]=rand()%(process.pageLength)+1;
        for(int i=1;i<=process.pageLength;i++)
        printf("%d ",process.num[i]);
        printf("\n");
    }
    else
    {
        for(int i=1;i<=process.pageLength;i++)
        scanf("%d",&process.num[i]);
    }
    process.page_list=new Page[process.pageLength+1];
    for(int i=1;i<=process.pageLength;i++)
    process.page_list[i].pageID=-1;
}
bool hit(int now,int k=0)
{
    Block* p=Block_list->next;
    while(p!=NULL)
    {
        if(p->page==&process.page_list[now])
        {
            if(k!=0)
            {
                p->time=k;
            }
            return true;
        }
        p=p->next;
    }
    return false;
}
bool find_free(int now,int time)
{
    Block* p=Block_list->next;
    while(p!=NULL)
    {
        if(p->state==IDLE)
        {
            p->state=BUSY;
            p->time=time;
            p->page=&process.page_list[now];
            process.page_list[now].to=p;
            process.page_list[now].pageID=p->id;
            return true;
        }
        p=p->next;
    }
    return false;
}
void find_min(int now,int time)
{
    Block* p=Block_list->next;
    int minn=p->time;
    Block* minnp=p;
    while(p!=NULL)
    {
        if(p->timetime;
            minnp=p;
        }
        p=p->next;
    }
    minnp->time=time;
    printf("替换第%d页 装入第%d帧\n",minnp->page->pageID,minnp->id);
    minnp->page=&process.page_list[now];
    process.page_list[now].to=minnp;
    process.page_list[now].pageID=minnp->id;
}
void FIFO()
{
    for(int i=1;i<=process.pageLength;i++)
    {
        int now=process.num[i];
        printf("%d号页: ",now);
        if(hit(now))
        {
            printf("命中\n");
            continue;
        }
        else if(find_free(now,i))
        printf("直接装入第%d帧\n",process.page_list[now].to->id);
        else
        find_min(now,i);
    }
}
void LRU()
{
    for(int i=1;i<=process.pageLength;i++)
    {
        int now=process.num[i];
        printf("%d号页: ",now);
        if(hit(now,i))
        {
            printf("命中\n");
            continue;
        }
        else if(find_free(now,i))
        printf("直接装入第%d帧\n",process.page_list[now].to->id);
        else
        find_min(now,i);
    }
}
void simulation()
{
    printf("1.FIFO\n");
    printf("2.LRU\n");
    printf("请选择页面置换算法:");
    int ti;
    scanf("%d",&ti);
    if(ti==1)
    FIFO();
    else if(ti==2)
    LRU();
}
int main(int argc, char const *argv[]) {
    printf("\033c");
    printf("----------------------------------------\n");
    printf("-        请求分页虚存页面替换模拟      -\n");
    printf("-                                      -\n");
    printf("-                                      -\n");
    printf("-      1.初始化内存                    -\n");
    printf("-      2.创建进程并生成页面访问序列    -\n");
    printf("-      3.模拟进程执行过程              -\n");
    printf("-      4.显示内存使用情况              -\n");
    printf("-      5.显示进程页面状态              -\n");
    printf("-      0.退出                          -\n");
    printf("-                                      -\n");
    printf("----------------------------------------\n");
    int ti;
    while(1)
    {
        printf("--请选择功能选项:  ");
        scanf("%d",&ti);
        if(ti==0)
        break;
        else if(ti==1)
        init();
        else if(ti==2)
        creat_process();
        else if(ti==3)
        simulation();
        else if(ti==4)
        show_Block();
        else if(ti==5)
        show_Process();
    }
    return 0;
}

 

你可能感兴趣的:(操作系统课程设计)