操作系统页面置换算法模拟
1.最佳淘汰算法(OPT)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int memory[4];//内存,存放页面位置
int seq[205];//指令的执行顺序
int seq_page[205];//用于OPT算法,存放各条指令所在的页面位置
int P[4];//用于FIFO算法,存储装入主存中的页面的页号
int k=0;//用于FIFO算法,指示当前调入新页时应淘汰页在页号表中的位置
int Q[4];//用于LRU算法,页面淘汰队列
int tail;//用于LRU算法,指示队尾
int S, F;
void OPT(int n)//最佳页面替换算法
{
int i, count, j, longest=-1;
int t[4]={0};
i=n+1;
count=0;
//查找最长时间需要访问的页面,longest中保存最远页面在seq_page[]中的位置
while (i<200 && count<4){
if (seq_page[i]==memory[0] && t[0]==0){
count++;
longest=i;
t[0]=1;
}
else if (seq_page[i]==memory[1] && t[1]==0){
count++;
longest=i;
t[1]=1;
}
else if (seq_page[i]==memory[2] && t[2]==0){
count++;
longest=i;
t[2]=1;
}
else if (seq_page[i]==memory[3] && t[3]==0){
count++;
longest=i;
t[3]=1;
}
i++;
}
//页面置换
if (i<200){//count==4
for (j=0;j<4;j++){
if (seq_page[longest]==memory[j]){
memory[j]=seq[n]/10;
break;
}
}
}
else{//count<4
if (longest==-1){//如果内存中的页面都不会再被使用,则取内存中任意页面置换
memory[0]=seq[n]/10;
}
else{
for (j=0;j<4;j++){
if (t[j]==0){
memory[j]=seq[n]/10;
break;
}
}
}
}
return;
}
void FIFO(int n)//先进先出页面替换算法
{
memory[k]=seq[n]/10;
k=(k+1)%4;
}
void LRU(int n)//最近最少使用页面替换算法
{
int i, t;
memory[Q[0]]=seq[n]/10;
t=Q[0];
for (i=0;i<=2;i++){
Q[i]=Q[i+1];
}
Q[3]=t;
}
int main()
{
int page, foundpage;
int n1, n2, n3, j, i, x, t;
double f;
tail=-1;
memset(memory, -1, sizeof(memory));
S=F=0;
for (i=0;i<4;i++){
Q[i]=-1;
}
//产生指令执行序列
i=0;
n1=rand()%160;
for (j=1;j<=2;j++){
if (n1+j<160){
seq[i++]=n1+j;
}
}
while (i<200){
n2=rand()%n1;
for (j=1;j<=2;j++){
if (n2+j<160){
seq[i++]=n2+j;
}
}
n3=rand()%(158-n2)+n2;
for (j=1;j<=2;j++){
if (n3+j<160){
seq[i++]=n3+j;
}
}
}
//OPT
for (i=0;i<200;i++){
seq_page[i]=seq[i]/10;
}
//按顺序执行每条指令
for (i=0;i<200;i++){
page=seq[i]/10;//计算所在页面
foundpage=0;
for (j=0;j<4;j++){
if (memory[j]==page){//成功访问
S++;
foundpage=1;
//LRU
x=-1;
while (memory[Q[++x]]!=page);
for (t=x;t<=tail-1;t++){
Q[t]=Q[t+1];
}
Q[tail]=j;
printf("NO %3d: %3d suc memory: %2d %2d %2d %2d Queue: %d %d %d %d\n", i, seq_page[i], memory[0], memory[1], memory[2], memory[3], memory[Q[0]], memory[Q[1]], memory[Q[2]], memory[Q[3]]);
break;
}
else if (memory[j]==-1){//内存块为空
memory[j]=page;
S++;
foundpage=1;
//FIFO
P[k]=j;
k=(k+1)%4;
//LRU
Q[++tail]=j;
printf("NO %3d: %3d suc memory: %2d %2d %2d %2d Queue: %d %d %d %d\n",i, seq_page[i], memory[0], memory[1], memory[2], memory[3], memory[Q[0]], memory[Q[1]], memory[Q[2]], memory[Q[3]]);
break;
}
}
if (foundpage==0){//缺页情况
//OPT(i);
//FIFO(i);
LRU(i);
F++;
printf("NO %3d: %3d fat memory: %2d %2d %2d %2d Queue: %d %d %d %d\n",i, seq_page[i], memory[0], memory[1], memory[2], memory[3], memory[Q[0]], memory[Q[1]], memory[Q[2]], memory[Q[3]]);
}
}
f=(double)F/(S+F);
printf("success %3d, fault %3d, total %3d, page fault rate %.2lf.\n", S, F, S+F, f);
return 0;
}
2.先进先出的算法(FIFO)
3.最近最久未使用算法(LRU)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int memory[4];//内存,存放页面位置
int seq[205];//指令的执行顺序
int seq_page[205];//用于OPT算法,存放各条指令所在的页面位置
int P[4];//用于FIFO算法,存储装入主存中的页面的页号
int k=0;//用于FIFO算法,指示当前调入新页时应淘汰页在页号表中的位置
int Q[4];//用于LRU算法,页面淘汰队列
int tail;//用于LRU算法,指示队尾
int S, F;
void OPT(int n)//最佳页面替换算法
{
int i, count, j, longest=-1;
int t[4]={0};
i=n+1;
count=0;
//查找最长时间需要访问的页面,longest中保存最远页面在seq_page[]中的位置
while (i<200 && count<4){
if (seq_page[i]==memory[0] && t[0]==0){
count++;
longest=i;
t[0]=1;
}
else if (seq_page[i]==memory[1] && t[1]==0){
count++;
longest=i;
t[1]=1;
}
else if (seq_page[i]==memory[2] && t[2]==0){
count++;
longest=i;
t[2]=1;
}
else if (seq_page[i]==memory[3] && t[3]==0){
count++;
longest=i;
t[3]=1;
}
i++;
}
//页面置换
if (i<200){//count==4
for (j=0;j<4;j++){
if (seq_page[longest]==memory[j]){
memory[j]=seq[n]/10;
break;
}
}
}
else{//count<4
if (longest==-1){//如果内存中的页面都不会再被使用,则取内存中任意页面置换
memory[0]=seq[n]/10;
}
else{
for (j=0;j<4;j++){
if (t[j]==0){
memory[j]=seq[n]/10;
break;
}
}
}
}
return;
}
void FIFO(int n)//先进先出页面替换算法
{
memory[k]=seq[n]/10;
k=(k+1)%4;
}
void LRU(int n)//最近最少使用页面替换算法
{
int i, t;
memory[Q[0]]=seq[n]/10;
t=Q[0];
for (i=0;i<=2;i++){
Q[i]=Q[i+1];
}
Q[3]=t;
}
int main()
{
int page, foundpage;
int n1, n2, n3, j, i, x, t;
double f;
tail=-1;
memset(memory, -1, sizeof(memory));
S=F=0;
for (i=0;i<4;i++){
Q[i]=-1;
}
//产生指令执行序列
i=0;
n1=rand()%160;
for (j=1;j<=2;j++){
if (n1+j<160){
seq[i++]=n1+j;
}
}
while (i<200){
n2=rand()%n1;
for (j=1;j<=2;j++){
if (n2+j<160){
seq[i++]=n2+j;
}
}
n3=rand()%(158-n2)+n2;
for (j=1;j<=2;j++){
if (n3+j<160){
seq[i++]=n3+j;
}
}
}
//OPT
for (i=0;i<200;i++){
seq_page[i]=seq[i]/10;
}
//按顺序执行每条指令
for (i=0;i<200;i++){
page=seq[i]/10;//计算所在页面
foundpage=0;
for (j=0;j<4;j++){
if (memory[j]==page){//成功访问
S++;
foundpage=1;
//LRU
x=-1;
while (memory[Q[++x]]!=page);
for (t=x;t<=tail-1;t++){
Q[t]=Q[t+1];
}
Q[tail]=j;
printf("NO %3d: %3d suc memory: %2d %2d %2d %2d Queue: %d %d %d %d\n", i, seq_page[i], memory[0], memory[1], memory[2], memory[3], memory[Q[0]], memory[Q[1]], memory[Q[2]], memory[Q[3]]);
break;
}
else if (memory[j]==-1){//内存块为空
memory[j]=page;
S++;
foundpage=1;
//FIFO
P[k]=j;
k=(k+1)%4;
//LRU
Q[++tail]=j;
printf("NO %3d: %3d suc memory: %2d %2d %2d %2d Queue: %d %d %d %d\n",i, seq_page[i], memory[0], memory[1], memory[2], memory[3], memory[Q[0]], memory[Q[1]], memory[Q[2]], memory[Q[3]]);
break;
}
}
if (foundpage==0){//缺页情况
//OPT(i);
//FIFO(i);
LRU(i);
F++;
printf("NO %3d: %3d fat memory: %2d %2d %2d %2d Queue: %d %d %d %d\n",i, seq_page[i], memory[0], memory[1], memory[2], memory[3], memory[Q[0]], memory[Q[1]], memory[Q[2]], memory[Q[3]]);
}
}
f=(double)F/(S+F);
printf("success %3d, fault %3d, total %3d, page fault rate %.2lf.\n", S, F, S+F, f);
return 0;
}