操作系统-页面置换算法-先进先出置换算法
2017-11-27 20:50
459 查看
地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。最简单的页面置换算法是先入先出(FIFO)法。
假定系统为某进程分配了三个物理块,并考虑有以下页面号引用串:7, 0, 1, 2, 0, 3, 0,4,2,3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1。釆用FIFO算法进行页面置换,进程访问页面2时,把最早进入内存的页面7换出。然后访问页面3时,再把2, 0, 1中最先进入内存的页换出。由下图可以看出,利用FIFO算法时进行了12次页面置换。
代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct item
{
int num;
}Pro;
/**
*设置查询函数,在内存块中寻找页面是否存在
*存在则返回1,不存在返回-1
*/
int Search(Pro *p,int flag,int mnum)
{
int q=0;
for(int i=0;i<mnum;i++)
{
if(p[i].num==flag)
{
q=1;
break;
}
else
{
q=-1;
}
}
return q;
}
/**
*设置打印函数,每次分配之后都会调用一次
*/
void print(Pro *p,int mnum)
{
for(int i=0;i<mnum;i++)
printf("%d ",p[i].num);
printf("\n");
}
int main()
{
int i,j,pagenum;//pagenum为用户设定的页面个数
int number;//页面编号
int mnum;//用户设定内存分配的内存块
Pro *page;//页面编号存放数组
Pro *main;//内存块数组
printf("请输入分配给主存的页面数");
scanf("%d",&pagenum);
page=(Pro*)malloc(sizeof(Pro)*pagenum);
printf("请输入页面的编号");
for(i=0;i<pagenum;i++)//页面编号数组初始化
{
scanf("%d",&number);
page[i].num=number;
}
printf("请输入内存的块数");
scanf("%d",&mnum);
main=(Pro*)malloc(sizeof(Pro)*mnum);
for(int i=0;i<mnum;i++)//内存块初始化数组
{
main[i].num=-1;
}
int trans=0;//内存块置换的位置
for(i=0;i<pagenum;i++)
{
int p=page[i].num;
if(Search(main,p,mnum)==-1)
{
if(trans<mnum)
{
main[trans].num=page[i].num;
trans++;
print(main,mnum);
}
else
{
trans=0;
main[trans].num=page[i].num;
trans++;
print(main,mnum);
}
}
else
{
printf("不缺页\n");
}
}
return 0;
}
假定系统为某进程分配了三个物理块,并考虑有以下页面号引用串:7, 0, 1, 2, 0, 3, 0,4,2,3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1。釆用FIFO算法进行页面置换,进程访问页面2时,把最早进入内存的页面7换出。然后访问页面3时,再把2, 0, 1中最先进入内存的页换出。由下图可以看出,利用FIFO算法时进行了12次页面置换。
访问页面 | 7 | 0 | 1 | 2 | 0 | 3 | 0 | 4 | 2 | 3 | 0 | 3 | 2 | 1 | 2 | 0 | 1 | 7 | 0 | 1 |
物理块1 | 7 | 7 | 7 | 2 | 2 | 2 | 4 | 4 | 4 | 0 | 0 | 0 | 7 | 7 | 7 | |||||
物理块2 | 0 | 0 | 0 | 3 | 3 | 3 | 2 | 2 | 2 | 1 | 1 | 1 | 0 | 0 | ||||||
物理块3 | 1 | 1 | 1 | 0 | 0 | 0 | 3 | 3 | 3 | 2 | 2 | 2 | 1 | |||||||
缺页否 | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
#include <stdio.h>
#include <stdlib.h>
typedef struct item
{
int num;
}Pro;
/**
*设置查询函数,在内存块中寻找页面是否存在
*存在则返回1,不存在返回-1
*/
int Search(Pro *p,int flag,int mnum)
{
int q=0;
for(int i=0;i<mnum;i++)
{
if(p[i].num==flag)
{
q=1;
break;
}
else
{
q=-1;
}
}
return q;
}
/**
*设置打印函数,每次分配之后都会调用一次
*/
void print(Pro *p,int mnum)
{
for(int i=0;i<mnum;i++)
printf("%d ",p[i].num);
printf("\n");
}
int main()
{
int i,j,pagenum;//pagenum为用户设定的页面个数
int number;//页面编号
int mnum;//用户设定内存分配的内存块
Pro *page;//页面编号存放数组
Pro *main;//内存块数组
printf("请输入分配给主存的页面数");
scanf("%d",&pagenum);
page=(Pro*)malloc(sizeof(Pro)*pagenum);
printf("请输入页面的编号");
for(i=0;i<pagenum;i++)//页面编号数组初始化
{
scanf("%d",&number);
page[i].num=number;
}
printf("请输入内存的块数");
scanf("%d",&mnum);
main=(Pro*)malloc(sizeof(Pro)*mnum);
for(int i=0;i<mnum;i++)//内存块初始化数组
{
main[i].num=-1;
}
int trans=0;//内存块置换的位置
for(i=0;i<pagenum;i++)
{
int p=page[i].num;
if(Search(main,p,mnum)==-1)
{
if(trans<mnum)
{
main[trans].num=page[i].num;
trans++;
print(main,mnum);
}
else
{
trans=0;
main[trans].num=page[i].num;
trans++;
print(main,mnum);
}
}
else
{
printf("不缺页\n");
}
}
return 0;
}
相关文章推荐
- 操作系统--页面置换算法(先进先出算法,最近最久未使用算法,最佳置换算法)--JAVA实现
- 操作系统页面置换算法之最优置换(OPT)算法
- 操作系统-页面置换算法-最佳置换算法
- android开发常用的缓存策略详解(2)- 先进先出(FIFO)置换算法
- 计算机操作系统的各种算法汇——作业、进程、页面置换、磁盘调度等。
- 先进先出(FIFO)置换算法
- 操作系统页面置换FIFO算法中的Belady现象
- 操作系统实验四 页面置换算法(fifo 算法代码------页面置换代码集合)
- 先进先出(FIFO)置换算法
- 先进先出(FIFO)置换算法
- java实现操作系统中的页面置换算法、进程调度算法、磁盘调度算法
- 操作系统置换策略基本算法
- 操作系统模拟置换页面的算法
- 【大三操作系统实验】 请求页式管理中的置换算法
- 操作系统常见的几个进程调度算法
- 操作系统之典型调度算法
- 有一个虚拟存储系统,若进程在内存中占3页(开始时内存为空),若采用先进先出(FIFO)页面淘汰算法,当执行如下访问页号序列后1,2,3,4,5, 1,2,5,1,2,3,4,5,会发生多少缺页?
- 操作系统实验之最近最久未使用算法(LRU)模拟
- 常见的操作系统进程调度算法
- 【大三操作系统实验】 动态分区时的适应算法