2013-11-22 2 views
1

LRU 페이지 교체를 시뮬레이션하는 함수를 작성하려고합니다. 나는 LRU를 꽤 잘 이해하지만 그것을 코딩하는 데 문제가있다. 다음과 같은 것들이 LRU 함수로 전달됩니다. 사용자는 크기 20의 refString이라는 배열에 저장된 # 1-9의 20 문자 참조 문자열을 지정합니다. 사용자가 입력하는 프레임 수 (1-7)는 변수 numFrames에 저장됩니다. 마지막으로, frame이라는 크기의 배열이 전달됩니다.LRU 페이지 교체 알고리즘 C#

여기에있는 코드가 있으며 가까운 번호를 얻고 있습니다. 어쩌면 누군가가 도와 줄 수 있습니다! 여기

if (top < numFrames) 
     { 
      frame[top++] = refString[i]; 
      fault++; 
     } 

당신은 결코 현재 refString [내가] 프레임에 이미있는 경우 오류를 얻을 [] 때문에이 경우에 당신이 donot 확인하지 않고해야 - :

private static void LRU(int numFrames, int[] refString, int[] frame) 
{ 
    int i, j = 0, k, m, flag = 0, count = 0, top = 0; 

    for (i = 0; i < 20; i++) 
    { 
     for (k = 0; k < numFrames; k++) 
     { 
      if (frame[k] == refString[i]) 
      { 
       flag = 1; 
       break; 
      } 
     } 

     if (j != numFrames && flag != 1) 
     { 
      frame[top] = refString[i]; 
      j++; 

      if (j != numFrames) 
      { 
       top++; 
      } 
     } 

     else 
     { 
      if (flag != 1) 
      { 
       for (k = 0; k < top; k++) 
       { 
        frame[k] = frame[k + 1]; 
       } 

       frame[top] = refString[i]; 
      } 

      if (flag == 1) 
      { 
       for (m = k; m < top; m++) 
       { 
        frame[m] = frame[m + 1]; 
       } 

       frame[top] = refString[i]; 
      } 
     } 

     if (flag == 0) 
     { 
      count++; 
     } 
     else 
     { 
      flag = 0; 
     } 

    } 

    Console.WriteLine("\nThe number of page faults with LRU is: " + count); 
} 
+0

그것을 파악 및 표시 그것은 대답했다! – user3015999

+0

감사합니다. 그리고 Stackoverflow에 오신 것을 환영합니다! –

답변

2

코드에서 몇 가지 오류가 있습니다 프레임에 추가하지 마십시오. 여기

당신이 당신의 의심을 취소 도움이 가능성이있는 의사 코드입니다 : -

void LRU(int numframes,int refString[],int frames[]) { 

    int top = 0,fault=0; 
    int* count = new int[numframes]; 

    for(int i=0;i<refString.length;i++) { 

     int k = findmax(refString[i],frames,count,top,numframes); 

     if(k<0) { 
      count[top] = 0; 
      frames[top++] = refString[i]; 
      fault++; 
     } 

     else if(frames[k]!=refString[i]) { 

      count[k] = 0; 
      frames[k] = refString[i]; 
      fault++; 

     } 
     else count[k] = 0; 

    for(int j=0;j<top;j++) { 
      count[j]++; 

    } 

    } 

    return(fault); 

} 


int findmax(int keyframe,int frames[],int count,int top,int numframes) { 

    int max = 0; 
    for(int i=0;i<top;i++) { 

     if(frames[i]==keyframe) { 

      return(i); 
     } 
     if(count[max]<count[i]) 
      max = i; 

    } 

    if(top<numframes) 
      return(-1); 
    return(max); 
} 

편집 : 의사 코드의

설명 : -

1. check if current requested frame is in cache and if yes then get its index 
2. if frame is present then set its count to zero so as to indicate it is used very recently, higher the count the more least recently frame is used. 
3. if frame is not present in cache then 
    a. check if cache is full if not add new frame to end of cache and increment the fault and top of cache 
    b. else if chace is full then get frame with maximum count(LRU frame) and replace it with new frame and reset count to zero and increment fault. 
4. increment all the counts 
5. do 1 to 4 till end of all requests 
6. output the no of faults 
+0

답장을 보내 주셔서 감사합니다. 몇 가지 오류는 언급했지만 나열된 것은 하나뿐입니다. 내가 뭘 놓치고 있니? 또한 현재 refString [i]이 이미 프레임 []에 있는지 확인하는 함수를 추가해야합니까? 나는 당신이 게시 한 의사 코드를 이해하고 있지만, 사용하고있는 알고리즘과 약간 다르며이를 수정하는 방법을 이해하는데 어려움을 겪고 있습니다. – user3015999

+0

어떤 알고리즘을 사용하고 있는지 설명해주십시오. 코드에서 알기가 어렵습니다. –

+0

나는 당신이 가장 최근에 사용 된 프레임을 확인하기 위해 카운트를 유지하지 못했을 것이라고 생각한다. –