LRU 알고리즘

가장 오랫동안 참조되지 않은 페이지를 교체하는 기법

 

 

 

페이지 교체 알고리즘

페이징 기법으로 메모리를 관리하는 운영체제에서

새로운 페이지를 할당하기 위해 현재 할당된 페이지 중 어느 것과 교체할 지를 결정하는 방법

 

종류 : FIFO, LFU, LRU

 

1) FIFO : 페이지가 주기억장치에 적재된 시간을 기준으로 교체될 때 페이지를 선정하는 기법

2) LFU : 가장 최근에 사용한 프로그램 중 적은 횟수로 참조하는 페이지 교체

3) LRU : 가장 오랫동안 참조되지 않은 페이지 교체

 

 

LRU 알고리즘

[ 예시 ]

Input : 12345

Output : 5413

위의 그림에서 참조 스트링이 입력되고, 이에 따른 주기억 장치의 상태를 보면 됩니다.

 

- 4초 : 1 이 재참조되어 순서가 변경됩니다.

- 6초 : 캐시사이즈가 가득차서 가장 오랫동안 참조되지 않은 2를 제거 후 저장합니다.

 

 

[ 문제 ]

캐시 크기가 주어지고, 캐시가 비어 있는 상태에서 N개의 작업을 CPU가 차례대로 처리한다면 N개의 작업을 처리한 후

캐시 메모리 상태를 가장 최근 사용된 작업부터  차례대로 출력하는 프로그램을 작성하시오.

 

- 입력

1) 첫 번째 줄에 캐시 크기 (S) 와 작업 개수 (N) 이 입력됨

2) 두 번째 줄에 N 개의 작업 번호가 처리순으로 주어짐 ( 1 ~ 100 )

 

- 출력

마지막 작업 후 캐시메모리의 상태를 가장 최근 사용된 작업부터 차례로  출력

 

[ 예시 입력 ]

5 9

1 2 3 2 6 2 3 5 7

[ 과정 ]

1) 1

2) 2 1

3) 3 2 1

4) 2 3 1

5) 6 2 3 1

6) 2 6 3 1

7) 3 2 6 1

8) 5 3 2 6 1

9) 7 5 3 2 6

 

[ 예시 출력 ]

7 5 3 2 6

 

[ 소스코드 ]

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class LRU {
    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        int s = kb.nextInt();
        int n = kb.nextInt();
        List<Integer> arr = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            arr.add(kb.nextInt());
        }
        myLRU(s, arr);
    }

    public static void myLRU(int s, List<Integer> arr) {
        List<Integer> temp = new ArrayList<>();
        int cnt = 0;
        boolean check = false;

        while (cnt < arr.size()) {
            // 이미 숫자가 있는지 확인
            for (int i = 0; i < temp.size(); i++) {
                if (temp.get(i) == arr.get(cnt)) {
                    temp.remove(i);
                    temp.add(0,arr.get(cnt));
                    check = true;
                    break;
                }
            }
            if(!check){
                temp.add(0,arr.get(cnt));
            }
            // 최대 크기를 넘은 경우
            if(temp.size() > s){
                temp.remove(temp.size() - 1);
            }
            cnt++;
            check = false;
        }
        
        for (Integer i : temp) {
            System.out.print(i + " ");
        }
    }
}

'알고리즘' 카테고리의 다른 글

다항식 프로그램 ( c++ )  (0) 2022.10.14
시뮬레이션과 완전탐색  (0) 2022.10.10
DFS 코드 이해하기 ( java )  (1) 2022.10.06
Dynamic Programming  (0) 2022.09.26
후위 표기식  (0) 2022.09.25

+ Recent posts