24-1
아래 Java 프로그램이 실행될 때, 실제로 수행되는 생성자·메서드·문장을 수행 순서대로 번호로 적으시오. (단, 같은 번호를 두 번 쓰지 않으며 수행되지 않는 번호는 적지 않는다.)
class Unit {
int atk, def;
Unit(int atk, int def) { // ①
this.atk = atk;
this.def = def;
}
int power() { // ②
return atk * def + bonus();
}
int bonus() { // ③
return 0;
}
}
class Tank extends Unit {
int hp;
Tank(int hp) { // ④
super(hp - 1, hp);
}
int power(int boost) { // ⑤
return hp * boost;
}
int bonus() { // ⑥
return atk % 3;
}
}
public class Main {
public static void main(String[] args) { // ⑦
Unit u = new Tank(5); // ⑧
System.out.println(u.power()); // ⑨
}
}⑦ → ⑧ → ④ → ① → ⑨ → ② → ⑥
[해설]
main(⑦)에서 new Tank(5)(⑧)를 만나면 Tank 생성자(④)가 호출되고, 그 첫 줄의 super가 부모 생성자 Unit(①)을 먼저 실행한다. atk = 4, def = 5가 된다.
⑨에서 u.power()를 부르면 Tank에는 인자 없는 power()가 없으므로 Unit.power()(②)가 실행된다. Tank의 power(int)(⑤)는 매개변수가 다른 오버로딩이라 호출되지 않는다.
power() 안의 bonus()는 Tank가 오버라이딩했으므로 Tank.bonus()(⑥)가 실행되고 Unit.bonus()(③)는 건너뛴다. 출력값은 4 × 5 + 4 % 3 = 21이다.
24-1
빈칸 ( ㉮ )에 공통으로 들어갈 라우팅 프로토콜을 적으시오.
- ( ㉮ )는 대규모 TCP/IP 망에서 쓰이는 내부 라우팅 프로토콜로, 각 라우터가 링크 상태(Link State) 정보를 모아 자신을 출발점으로 한 최단 경로 트리를 계산한다.
- ( ㉮ )는 경로 계산에 다익스트라(Dijkstra) 알고리즘을 쓰며, 망을 영역(Area)으로 나누고 변화가 생겼을 때만 그 영역의 라우터들에게 갱신 정보를 알린다.
OSPF
[해설]
링크 상태 방식, 다익스트라 알고리즘, 영역(Area) 구분을 쓰는 내부 라우팅 프로토콜은 OSPF(Open Shortest Path First)다.
각 라우터가 링크 상태 정보를 모아 자신을 루트로 한 최단 경로 트리를 만들고, 변화가 있을 때만 갱신을 보내 수렴이 빠르다. 망을 영역으로 나누면 갱신이 그 영역 안에 머물러 대규모 망에서도 부담이 적다.
혼동 주의: 주기적으로 전체 테이블을 보내는 거리 벡터 방식은 RIP, AS 사이 경로 교환은 BGP다.
24-1
아래 Python 프로그램을 실행한 결과를 적으시오.
fruits = ["Apple", "Mango", "Kiwi", "Lemon", "Grape", "Peach"]
out = "F"
for f in fruits:
out += f[-2]
print(out)Flgwopc
[해설]
f[-2]는 문자열의 뒤에서 두 번째 문자다. 시작값 "F" 뒤에 각 단어의 해당 문자를 차례로 붙인다.
- Apple → l, Mango → g, Kiwi → w
- Lemon → o, Grape → p, Peach → c
결과는 Flgwopc다. 음수 인덱스 -1이 마지막 문자라는 점만 기억하면 된다.
24-1
다음 설명에 해당하는 공격 기법을 [보기]에서 골라 적으시오.
- 특정 조직이나 기관을 표적으로 정해 두고, 여러 수단을 동원해 오랜 기간 은밀하고 끈질기게 수행하는 맞춤형 공격이다.
- 일반적으로 침투 → 검색 → 수집 → 유출의 네 단계를 거쳐 진행된다.
[보기] APT, HeartBleed, Key Logger, MITM, NAT, Replay Attack, Smishing, Watering Hole, XDR, 사회공학 기법
APT
[해설]
표적을 정해 장기간 지속적으로 공격하는 것은 APT(Advanced Persistent Threat, 지능형 지속 공격)다.
APT는 침투 단계에서 사회공학이나 워터링 홀 같은 기법을 수단으로 쓰기도 한다. 이들은 APT를 이루는 한 단계일 뿐 공격 전체를 가리키는 말은 아니다.
- MITM: 통신 중간에 끼어들어 가로채거나 변조
- Replay Attack: 가로챈 인증 데이터를 다시 보내 재사용
- XDR: 공격 기법이 아니라 여러 보안 계층을 통합한 탐지·대응 솔루션
24-1
아래 C 프로그램의 출력 결과를 적으시오.
#include <stdio.h>
#include <string.h>
void flip(char *lo, char *hi) {
char tmp;
while (lo < hi) {
tmp = *lo;
*lo++ = *hi;
*hi-- = tmp;
}
}
int main(void) {
char text[20] = "KLMNOPQ";
int n = strlen(text);
flip(text, text + n - 1);
for (int i = 0; i < n; i += 3)
printf("%c", text[i]);
printf("\n");
return 0;
}QNK
[해설]
flip은 양 끝 포인터를 안쪽으로 좁혀 가며 문자를 맞바꾸므로 문자열을 제자리에서 뒤집는다.
- 원래: K L M N O P Q (길이 7)
- 뒤집은 뒤: Q P O N M L K
- i = 0, 3, 6 → text[0] = Q, text[3] = N, text[6] = K
출력은 QNK다. 길이가 홀수라 가운데 N은 제자리에 남는다.
24-1
두 릴레이션을 결합하는 조인에 관한 물음에 답하시오.
(1) 관계 대수의 조인에 관한 설명이다. 빈칸 ①~③에 알맞은 조인의 이름을 적으시오.
- ( ① ): 두 릴레이션의 속성값을 =, <, > 등 임의의 비교 연산자로 비교해, 조건을 만족하는 튜플을 결합한다.
- ( ② ): ( ① ) 가운데 비교 연산자가 = 인 경우로, 두 속성값이 같은 튜플끼리만 결합한다. 결과에 조인 속성이 두 번 나타난다.
- ( ③ ): ( ② )의 결과에서 중복으로 나타나는 조인 속성 하나를 없앤 조인이다.
(2) SQL의 조인에 관한 설명이다. 빈칸 ④~⑥에 알맞은 조인을 SQL 키워드로 적으시오.
- ( ④ ): 양쪽 테이블에서 조인 조건이 일치하는 행만 결과에 남긴다.
- ( ⑤ ): FROM 절 뒤쪽(오른쪽) 테이블의 행은 모두 남기고, 앞쪽(왼쪽) 테이블은 일치하는 행만 붙인다. 짝이 없으면 NULL로 채운다.
- ( ⑥ ): 조건 없이 한쪽의 모든 행과 다른 쪽의 모든 행을 짝지은 곱집합을 만든다.
① 세타 조인(Theta Join)
② 동등 조인(Equi Join)
③ 자연 조인(Natural Join)
④ INNER JOIN
⑤ RIGHT OUTER JOIN
⑥ CROSS JOIN
[해설]
관계 대수에서 비교 연산자를 = 로 한정한 세타 조인이 동등 조인이고, 동등 조인에서 중복 속성을 없애면 자연 조인이 된다.
- 세타 조인(Theta Join) — =, <, > 등 임의의 비교 연산자로 튜플을 결합한다.
- 동등 조인(Equi Join) — 비교 연산자가 = 인 세타 조인으로, 조인 속성이 두 번 나타난다.
- 자연 조인(Natural Join) — 동등 조인 결과에서 중복된 조인 속성 하나를 제거한다.
- INNER JOIN — 양쪽에서 조건이 일치하는 행만 남긴다.
- RIGHT OUTER JOIN — 오른쪽 테이블 행은 모두 남기고, 짝이 없는 왼쪽 값은 NULL로 채운다.
- CROSS JOIN — 조건 없이 곱집합을 만들어 결과 행 수가 두 테이블 행 수의 곱이 된다.
혼동 주의: 왼쪽 테이블을 모두 남기면 LEFT OUTER JOIN, 양쪽을 모두 남기면 FULL OUTER JOIN이다.
24-1
테이블 [ITEM]이 아래와 같을 때, 주어진 SQL 문의 실행 결과를 적으시오.
| PID | PRICE |
|---|---|
| 11 | 500 |
| 22 | 2500 |
| 33 | 1800 |
| 44 | 900 |
SELECT COUNT(*)
FROM ITEM
WHERE PID < 40 AND PRICE < 600 OR PID = 44;2
[해설]
WHERE 절에서는 AND가 OR보다 먼저 계산된다. 조건은 (PID < 40 AND PRICE < 600) OR PID = 44로 묶인다.
- PID 11: 11 < 40이고 500 < 600 → 참
- PID 22, 33: 가격이 600 이상 → 거짓
- PID 44: 앞 조건은 거짓이지만 PID = 44 → 참
조건을 만족하는 행은 2개이므로 COUNT(*)는 2다. OR을 먼저 묶으면 1이 나오는 함정이다.
24-1
모듈 내부 요소들이 얼마나 밀접하게 관련되어 있는지를 나타내는 응집도(Cohesion)에 관한 물음에 답하시오.
- ㄱ. 교환적(통신적) 응집도(Communicational Cohesion)
- ㄴ. 기능적 응집도(Functional Cohesion)
- ㄷ. 시간적 응집도(Temporal Cohesion)
- ㄹ. 우연적 응집도(Coincidental Cohesion)
(1) 위 네 유형을 응집도가 가장 강한(좋은) 것부터 가장 약한(나쁜) 것까지 차례로 기호로 나열하시오.
(2) 응집도 유형은 모두 일곱 가지로, (1)에서 나열한 인접한 두 유형 사이마다 위 목록에 없는 유형이 하나씩 들어간다. 강한 쪽부터 차례로 ①, ②, ③에 해당하는 유형의 이름을 적으시오.
(1) ㄴ → ㄱ → ㄷ → ㄹ
(2) ① 순차적 응집도(Sequential Cohesion)
② 절차적 응집도(Procedural Cohesion)
③ 논리적 응집도(Logical Cohesion)
[해설]
응집도는 강한 순으로 기능적 → 순차적 → 교환적 → 절차적 → 시간적 → 논리적 → 우연적이다.
보기의 네 유형은 기능적(ㄴ), 교환적(ㄱ), 시간적(ㄷ), 우연적(ㄹ) 순이고, 그 사이에 순차적, 절차적, 논리적이 차례로 끼어든다.
- 순차적: 한 요소의 출력이 다음 요소의 입력으로 이어짐
- 절차적: 정해진 수행 순서에 따라 묶였을 뿐 데이터는 공유하지 않음
- 논리적: 비슷한 성격의 처리를 한 모듈에 모아 두고 플래그로 골라 실행
24-1
아래 C 프로그램의 출력 결과를 적으시오.
#include <stdio.h>
typedef struct {
int id;
double amt;
} Wallet;
double grow(double base, int n) {
double r = 1.0;
while (n-- > 0)
r *= base;
return r;
}
void setup(Wallet *w, int id, double amt) {
w->id = id;
w->amt = amt;
}
void adjust(Wallet *w, double v) {
if (v > 0 && v < w->amt)
w->amt -= v;
else
w->amt += v;
}
void interest(Wallet *w) {
w->amt *= grow(1.25, 2);
}
int main(void) {
Wallet my;
setup(&my, 4027, 1500.0);
adjust(&my, 2000.0);
interest(&my);
printf("%d / %.2f", my.id, my.amt);
return 0;
}4027 / 5468.75
[해설]
setup 후 my는 id = 4027, amt = 1500.0이다. adjust에 넘긴 2000.0은 잔액보다 커서 조건이 거짓이므로 else로 가 amt = 1500.0 + 2000.0 = 3500.0이 된다.
interest는 grow(1.25, 2)로 1.252 = 1.5625를 구해 곱한다.
%.2f로 소수 둘째 자리까지 찍으므로 출력은 4027 / 5468.75다. 구조체를 포인터로 넘겼기 때문에 함수 안의 변경이 main의 my에 그대로 반영된다.
24-1
다음 설명에 해당하는 테스트 커버리지를 [보기]에서 골라 적으시오.
- 결정문 안의 각 개별 조건이, 다른 조건의 값과 상관없이 홀로 결정의 결과(참/거짓)를 바꿀 수 있음을 보이도록 테스트 케이스를 설계한다.
[보기] 결정 커버리지, 구문 커버리지, 기본 경로 커버리지, 다중 조건 커버리지, 데이터 흐름 테스트, 루프 테스트, 변형 조건/결정 커버리지, 분기 커버리지, 제어 흐름 테스트, 조건 커버리지, 조건/결정 커버리지
변형 조건/결정 커버리지(MC/DC)
[해설]
각 개별 조건이 다른 조건과 무관하게 결정 결과를 바꿀 수 있음을 보이는 기준은 변형 조건/결정 커버리지(MC/DC)다.
- 조건 커버리지 — 각 개별 조건이 참·거짓을 한 번씩 가지면 충족한다.
- 조건/결정 커버리지 — 개별 조건과 전체 결정이 모두 참·거짓을 한 번씩 가지면 충족한다.
- 다중 조건 커버리지 — 개별 조건의 모든 참·거짓 조합을 시험한다.
MC/DC는 조건이 n개일 때 최소 n+1개 케이스로 각 조건의 독립적 영향을 확인하므로, 2n개가 필요한 다중 조건 커버리지보다 효율적이다.
24-1
테이블 [X]와 [Y]가 아래와 같을 때, 주어진 SQL 문의 실행 결과를 적으시오.
[X]
| K | M | N |
|---|---|---|
| 10 | p | u |
| 20 | q | v |
| 30 | r | u |
| 40 | s | t |
| 50 | t | w |
[Y]
| N | P | Q |
|---|---|---|
| u | m | 7 |
| v | n | 2 |
| w | m | 9 |
SELECT M
FROM X
WHERE N IN (SELECT N FROM Y WHERE Q > 5);| M |
|---|
| p |
| r |
| t |
[해설]
안쪽 서브쿼리가 먼저 Q가 5보다 큰 [Y]의 N 값을 모은다. Q = 7인 u와 Q = 9인 w가 해당하므로 결과 집합은 {u, w}다.
- K=10 (N=u), K=30 (N=u), K=50 (N=w): 포함
- K=20 (N=v): Q=2라 제외
- K=40 (N=t): [Y]에 없는 값이라 제외
남은 행의 M을 출력하면 p, r, t 세 행이다.
24-1
라우터 두 대로 세 개의 네트워크를 이은 구성이 아래 표와 같다. 각 라우터 인터페이스에는 그 인터페이스가 연결된 네트워크 대역의 주소를 할당해야 한다. ②, ④, ⑥에 알맞은 IP 주소를 [보기]에서 하나씩 고르시오.
| 구간 | 연결 | 네트워크 대역 |
|---|---|---|
| A | 호스트 ① ― ② 라우터1 | 192.168.35.x/24 |
| B | 라우터1 ― ④ ― 라우터2 (두 라우터 사이의 링크) | 129.200.10.x/22 |
| C | 라우터2 ⑥ ― 호스트 ⑤ | 192.168.36.x/24 |
[보기] 129.200.6.247, 129.200.7.248, 129.200.8.249, 192.168.33.28, 192.168.34.34, 192.168.35.72, 192.168.36.249, 192.168.37.248, 192.168.38.247
② 192.168.35.72
④ 129.200.8.249
⑥ 192.168.36.249
[해설]
/24 대역은 앞 세 옥텟이 같아야 하므로 ②는 192.168.35.72, ⑥은 192.168.36.249다.
④가 속한 /22는 셋째 옥텟의 상위 6비트까지 네트워크 부분이다. 10 = 0000 1010이고 마스크 252 = 1111 1100과 AND 하면 8이 된다.
- 대역: 129.200.8.0 ~ 129.200.11.255
- 129.200.6.247, 129.200.7.248은 129.200.4.0/22 대역이라 제외
- 129.200.8.249만 범위 안에 있다
따라서 ④는 129.200.8.249다. 셋째 옥텟이 같지 않아도 /22 범위에만 들면 같은 네트워크다.
24-1
아래 C 프로그램이 출력하는 문자열을 적으시오.
#include <stdio.h>
#include <ctype.h>
char rot(char c) {
if (isupper(c))
return (c - 'A' + 4) % 26 + 'A';
if (islower(c))
return (c - 'a' + 7) % 26 + 'a';
if (isdigit(c))
return (c - '0' + 6) % 10 + '0';
return c;
}
int main(void) {
const char *src = "Zip 47";
char dst[32];
int k = 0;
while (src[k] != '\0') {
dst[k] = rot(src[k]);
k++;
}
dst[k] = '\0';
printf("%s\n", dst);
return 0;
}Dpw 03
[해설]
rot은 문자 종류마다 다른 칸 수만큼 순환 이동하며, 끝을 넘으면 나머지 연산(% 26, % 10)으로 처음으로 되돌아온다.
- Z는 (25 + 4) % 26 = 3이라 D가 된다.
- 소문자는 7칸 이동해 i(8)는 p(15)가 되고 p(15)는 w(22)가 된다.
- 공백은 어느 조건에도 해당하지 않아 그대로 남는다.
- 숫자는 6칸 이동해 4는 (4 + 6) % 10 = 0, 7은 (7 + 6) % 10 = 3이 된다.
따라서 출력은 Dpw 03이다.
대문자(4칸)와 소문자(7칸)는 이동 칸 수가 달라 같은 공식으로 계산하면 틀린다.
24-1
아래 [수강신청] 릴레이션을 [학생튜터]와 [튜터과목] 두 릴레이션으로 분해하였다. [수강신청]에서 한 학생은 과목마다 튜터 한 명을 배정받고, 튜터 한 명은 한 과목만 맡는다. 분해하기 전 [수강신청] 릴레이션이 만족하는 가장 높은 정규형을 적으시오.
[수강신청]
| 학번 | 과목 | 튜터번호 |
|---|---|---|
| h11 | 파이썬 | T7 |
| h12 | 자바 | T8 |
| h13 | 파이썬 | T7 |
| h13 | 자바 | T5 |
| h14 | 파이썬 | T9 |
| h14 | 자바 | T5 |
[학생튜터]
| 학번 | 튜터번호 |
|---|---|
| h11 | T7 |
| h12 | T8 |
| h13 | T7 |
| h13 | T5 |
| h14 | T9 |
| h14 | T5 |
[튜터과목]
| 튜터번호 | 과목 |
|---|---|
| T5 | 자바 |
| T7 | 파이썬 |
| T8 | 자바 |
| T9 | 파이썬 |
제3정규형(3NF)
[해설]
제3정규형(3NF)은 모든 함수 종속 X → Y에서 X가 슈퍼키이거나 Y가 주요 속성(후보키에 속한 속성)이면 만족하고, BCNF는 X가 반드시 슈퍼키여야 한다.
[수강신청]의 함수 종속은 (학번, 과목) → 튜터번호와 튜터번호 → 과목이고, 후보키는 (학번, 과목)과 (학번, 튜터번호)다.
튜터번호 → 과목은 튜터번호가 슈퍼키가 아니라서 BCNF를 어기지만, 결정되는 과목이 주요 속성이라 3NF는 만족한다.
그래서 튜터번호를 결정자로 떼어 낸 분해로 BCNF를 얻는다.
24-1
아래 Java 프로그램을 실행하면 출력되는 값을 적으시오.
class Box {
int w, h;
Box(int w, int h) {
this.w = w;
this.h = h;
}
}
class Crate extends Box {
int d = 4;
Crate(int k) {
super(k * 2, k - 1);
d += h;
}
void show() {
System.out.println(w + d * 2);
}
}
public class Main {
public static void main(String[] args) {
Crate c = new Crate(6);
c.show();
}
}30
[해설]
Java 객체 생성은 부모 생성자 → 자식 필드 초기화 → 자식 생성자 본문 순서로 실행된다.
new Crate(6)은 먼저 super(12, 5)를 실행해 w = 12, h = 5를 만든다.
이어서 필드 d = 4가 초기화되고, 생성자 본문의 d += h로 d = 9가 된다.
show()에서는 곱셈이 덧셈에 앞서 계산되어 w + d × 2 = 12 + 18 = 30이 출력된다.
24-1
다음 설명에 해당하는 디자인 패턴을 [보기]에서 골라 적으시오.
- 구체적인 클래스를 직접 지정하지 않고도, 서로 관련되거나 함께 쓰여야 하는 객체들의 묶음(제품군)을 생성하는 인터페이스를 제공한다. 키트(Kit)라고도 부른다.
- 클라이언트는 이 패턴이 제공하는 인터페이스(API)만 사용하고, 실제 객체의 구현은 구체 제품(Concrete Product) 클래스가 담당한다.
[보기] Abstract Factory, Adapter, Bridge, Builder, Composite, Decorator, Facade, Factory Method, Flyweight, Prototype, Proxy, Singleton
Abstract Factory
[해설]
구체 클래스를 지정하지 않고 관련 객체 묶음(Kit)을 한꺼번에 생성하는 생성 패턴은 Abstract Factory(추상 팩토리)다.
클라이언트는 추상 팩토리 인터페이스만 호출하고, 실제 구현은 Concrete Product가 맡는다. 예를 들어 윈도용·맥용 버튼과 체크박스를 테마별로 한 벌씩 만든다.
혼동 주의: Factory Method는 객체 하나의 생성을 하위 클래스에 맡기고, Builder는 복잡한 객체 하나를 단계별로 조립한다.
24-1
아래 Java 프로그램을 실행했을 때 출력되는 값을 적으시오.
class Ledger {
private static Ledger only = null;
private int total = 0;
private Ledger() {}
static Ledger open() {
if (only == null) {
only = new Ledger();
}
return only;
}
void add(int v) { total += v; }
int total() { return total; }
}
public class Main {
public static void main(String[] args) {
Ledger x = Ledger.open();
x.add(2);
Ledger y = Ledger.open();
y.add(5);
x.add(1);
Ledger z = Ledger.open();
z.add(3);
System.out.print(y.total());
}
}11
[해설]
생성자가 private이고 open()이 처음 한 번만 객체를 만들므로 이 클래스는 싱글톤(Singleton)이다. x, y, z는 모두 같은 객체를 가리킨다.
- x.add(2) → total = 2
- y.add(5) → total = 7
- x.add(1) → total = 8
- z.add(3) → total = 11
어느 참조로 호출하든 하나의 total이 누적되므로 y.total()은 11이다.
24-1
다음 설명에 해당하는 해킹 도구를 적으시오.
- 공격자가 시스템에 침투한 뒤 관리자 권한을 유지하고, 백도어·원격 접속 등을 제공하며, 로그 등 사용 흔적을 지우는 기능을 한데 묶은 프로그램 모음이다.
- 운영체제의 핵심부인 커널 수준에 숨어 동작하는 경우가 많아, 사용자가 침해 사실을 알아차리기 어렵고 탐지와 분석도 까다롭다.
루트킷(Rootkit)
[해설]
침투 뒤 관리자 권한 유지·백도어·흔적 삭제 기능을 묶은 도구 모음은 루트킷(Rootkit)이다. 유닉스 관리자 계정 root와 도구 모음 kit를 합친 이름이다.
커널 루트킷은 프로세스 목록이나 파일 조회 결과 자체를 조작한다. 그래서 감염된 시스템 안에서 돌린 점검 도구로는 잘 드러나지 않는다.
혼동 주의: 백도어는 인증 없이 들어오는 뒷문 하나이고, 루트킷은 백도어와 은닉 기능까지 묶은 꾸러미다.
24-1
아래 C 프로그램이 출력하는 값을 적으시오.
#include <stdio.h>
int main(void) {
int p = 6, q = 2, r = 11;
if (p < q ? p : q - 2) {
q = q << 4;
} else {
r = r << 3;
}
printf("%d", q + r);
return 0;
}90
[해설]
if의 조건식은 삼항 연산자다. p < q(6 < 2)가 거짓이므로 q - 2 = 0이 선택되고, 0은 거짓이라 else 블록이 실행된다.
r = r << 3은 11을 왼쪽으로 3비트 이동하므로 11 × 23 = 88이 된다. q는 그대로 2다.
출력은 2 + 88 = 90이다.
24-1
프레임 3개로 이루어진 주기억장치가 처음에 비어 있다. 아래 순서로 페이지가 참조될 때 물음에 답하시오.
| 참조 순번 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 페이지 | 1 | 2 | 3 | 1 | 2 | 4 | 1 | 2 | 5 | 7 |
(1) LRU(Least Recently Used) 교체 기법을 쓸 때 페이지 부재(Page Fault) 횟수를 적으시오.
(2) LFU(Least Frequently Used) 교체 기법을 쓸 때 페이지 부재 횟수를 적으시오.
(1) 6
(2) 6
[해설]
빈 프레임 3개를 채우는 1, 2, 3에서 부재 3회가 나고, 이어지는 1, 2는 적중이다. 두 기법은 교체 대상만 다르다(LRU=가장 오래 안 쓴 페이지, LFU=참조 횟수가 가장 적은 페이지).
LRU 진행
4 참조 → 가장 오래 안 쓴 3 교체(부재)
5 참조 → 4 교체(부재)
7 참조 → 1 교체(부재)
부재 = 3 + 3 = 6회
LFU 진행
4 참조 → 참조 1회인 3 교체(부재)
5 참조 → 참조 1회인 4 교체(부재)
7 참조 → 참조 1회인 5 교체(부재)
부재 = 3 + 3 = 6회