C 언어 구현 페이지 교체 알고리즘
운영 체제 실험
페이지 교체 알고리즘(FIFO,LRU,OPT)
개념:
1.최 적 치환 알고리즘(OPT)(이상 치환 알고리즘):메 인 저장 소 에서 영원히 필요 하지 않 은 페이지 를 이동 합 니 다.만약 이러한 페이지 가 존재 하지 않 는 다 면,가장 오랫동안 접근 할 필요 가 없 는 페이지 를 선택 하 십시오.선택 한 탈락 페이지 는 앞으로 영원히 사용 되 지 않 거나 가장 오 랜 시간 동안 방문 되 지 않 는 페이지 로 가장 낮은 결 장 률 을 확보 할 수 있 습 니 다.
2.먼저 교체 알고리즘(FIFO):가장 간단 한 페이지 교체 알고리즘 입 니 다.이러한 알고리즘 의 기본 사상 은 한 페이지 를 도태 시 켜 야 할 때 메 인 저장 시간 이 가장 긴 페이지 를 선택 하여 도태 시 키 는 것 이다.즉,메 인 저장 페이지 에 먼저 들 어가 서 먼저 도태 시 키 는 것 이다.그 이 유 는 메 인 저장 소 에 최초 로 들 어 온 페이지 가 더 이상 사용 되 지 않 을 가능성 이 가장 크다 는 것 이다.
3.최근 가장 오랫동안 사용 되 지 않 은(LRU)알고리즘:이러한 알고리즘 의 기본 사상 은 국 지적 원 리 를 이용 하여 하나의 작업 이 수행 되 는 과정 에서 과거의 페이지 방문 역사 에 따라 미래의 행 위 를 추측 하 는 것 이다.지난 한 동안 방문 되 지 않 았 던 페이지 는 최근 에 도 다 시 는 방문 되 지 않 을 것 이 라 고 생각 합 니 다.따라서 이러한 알고리즘 은 실질 적 으로 한 페이지 를 탈락 시 켜 야 할 때 가장 오래 사용 하지 않 는 페이지 를 선택 하여 탈락 시 키 는 것 이다.
제목:
이 장 에서 말 한 FIFO,LRU,최 적 화 된 페이지 교체 알고리즘 을 실현 하 는 프로그램 을 만 듭 니 다.우선,랜 덤 페이지 참조 문자열 을 생 성 합 니 다.그 중에서 페이지 범 위 는 0-9 입 니 다.이 랜 덤 페이지 참조 문자열 을 모든 알고리즘 에 적용 하고 모든 알고리즘 으로 인 한 페이지 오류 의 수량 을 기록 합 니 다.교체 알고리즘 을 실현 하고 한 페이지 프레임 의 수량 은 1~7 입 니 다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int numbers[20]={7,0,1,2,
0,3,0,4,
2,3,0,3,
2,1,2,0,
1,7,0,1};// , ,
int nums=0;// , ,
int stack[20][7]={10};
void begin();
void randomnum();//
void init();//
void FIFO();//FIFO
void LRU();//LRU
void OPT();// (OPT)
void print();//
int main() {
begin();
FIFO();
LRU();
OPT();
return 0;
}
void begin()//
{
int i,j,k;
printf(" (1-7):");
scanf("%d",&nums);
for(k=0;;k++)
{
printf(" (0: ,1: )");
scanf("%d",&j);
if(j==0)
{
randomnum();
break;
}
else if(j==1)
{
break;
}
else
{
printf(" !
");
}
}
printf(" :
");
for(i=0;i<20;i++)
{
printf("%d ",numbers[i]);
}
printf("
");
init();
}
void randomnum()// ,
{
srand(time(0));//
for(int i = 0; i < 20; i++) {
numbers[i] = rand() % 10;// 0`9
}
}
void init()// ,
{
int i,j;
for(i=0;i<20;i++)
for(j=0;j<nums;j++)
stack[i][j]=10;
}
void print()//
{
int i,j;
for(i=0;i<nums;i++)
{
for(j=0;j<20;j++)
{
if(stack[j][i]==10)
printf("* ");
else
printf("%d ",stack[j][i]);
}
printf("
");
}
}
void FIFO()//FIFO
{
init();
int i,j=1,n=20,k,f,m;
stack[0][0]=numbers[0];
for(i=1;i<20;i++)
{
f=0;
for(m=0;m<nums;m++)
{
stack[i][m]=stack[i-1][m];
}
for(k=0;k<nums;k++)
{
if(stack[i][k]==numbers[i])
{
n--;
f=1;
break;
}
}
if(f==0)
{
stack[i][j]=numbers[i];
j++;
}
if(j==nums)
j=0;
}
printf("
");
printf("FIFO :
");
print();
printf(" :%d
",n);
}
void LRU()//LRU
{
int i,j,m,k,sum=1;
int sequence[7]={0};//
init();
stack[0][0]=numbers[0];
sequence[0]=nums-1;
for(i=1;i<nums;i++)// ,
{
for(j=0;j<nums;j++)
{
stack[i][j]=stack[i-1][j];
}
for(j=0;j<nums;j++)
{
if(sequence[j]==0)
{
stack[i][j]=numbers[i];
break;
}
}
for(j=0;j<i;j++)// 1
{
sequence[j]--;
}
sequence[i]=nums-1;//
sum++;
}
for(i=nums;i<20;i++)// ,
{
int f;
f=0;
for(j=0;j<nums;j++)
{
stack[i][j]=stack[i-1][j];
}
for(j=0;j<nums;j++)// ,
{
if(stack[i][j]==numbers[i])
{
f=1;
k=j;
break;
}
}
if(f==0)// ,
{
for(j=0;j<nums;j++)// 0
{
if(sequence[j]==0)
{
m=j;
break;
}
}
for(j=0;j<nums;j++)
{
sequence[j]--;
}
sequence[m]=nums-1;
stack[i][m]=numbers[i];
sum++;
}
else// ,
{
if(sequence[k]==0)//
{
for(j=0;j<nums;j++)
{
sequence[j]--;
}
sequence[k]=nums-1;
}
else if(sequence[k]==nums-1)//
{
//
}
else//
{
for(j=0;j<nums;j++)
{
if(sequence[k]<sequence[j])
{
sequence[j]--;
}
}
sequence[k]=nums-1;
}
}
}
printf("
");
printf("LRU :
");
print();
printf(" :%d
",sum);
}
void OPT()//OPT
{
int i,j,k,sum=1,f,q,max;
int seq[7]={0};//
init();
stack[0][0]=numbers[0];
seq[0]=nums-1;
for(i=1;i<nums;i++)// ,
{
for(j=0;j<nums;j++)
{
stack[i][j]=stack[i-1][j];
}
for(j=0;j<nums;j++)
{
if(seq[j]==0)
{
stack[i][j]=numbers[i];
break;
}
}
for(j=0;j<i;j++)// 1
{
seq[j]--;
}
seq[i]=nums-1;//
sum++;
}
for(i=nums;i<20;i++)// ,
{
//k=nums-1;//
for(j=0;j<nums;j++)//
{
stack[i][j]=stack[i-1][j];
}
for(j=0;j<nums;j++)
{
f=0;
if(stack[i][j]==numbers[i])
{
f=1;
break;
}
}
if(f==0)// ,
{
for(q=0;q<nums;q++)// ,
{
seq[q]=20;
}
for(j=0;j<nums;j++)//
{
for(q=i+1;q<20;q++)
{
if(stack[i][j]==numbers[q])
{
seq[j]=q-i;
break;
}
}
}
max=seq[0];
k=0;
for(q=0;q<nums;q++)
{
if(seq[q]>max)
{
max=seq[q];
k=q;
}
}
stack[i][k]=numbers[i];
sum++;
}
else
{
// , ,
}
}
printf("
");
printf("OPT :
");
print();
printf(" :%d
",sum);
}
실행 결과 캡 처:이 코드 는 Liux 에서 달 릴 수 있 으 니 windows 에서 도 틀림없이 문제 가 없 을 것 이다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 체인 시계는 뱀을 탐식하는 작은 게임을 실현한다본고의 실례는 여러분에게 C 언어 체인표가 뱀 탐식 게임을 실현하는 구체적인 코드를 공유하여 참고하도록 하였으며, 구체적인 내용은 다음과 같다. 프로젝트 이름: 뱀놀이 운영 환경: Linux 프로그래밍 언어: C 언...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.