25단원 '운영체제: 메모리와 명령어'의 일곱 레슨에서 7문제, 앞 단원(21·22·23)에서 3문제를 섞었고, 끝에 실기 꼴 3문제가 있습니다. 앞 단원 문제가 어느 레슨인지는 정답을 펼치면 보입니다. Linux 명령과 셸 스크립트의 결과는 Linux(GNU) 기준입니다. 실기 꼴은 종이에 답을 끝까지 쓴 뒤 펼치세요. 띄어쓰기만 다르면 같은 답입니다.
문제 1
주기억장치를 크기가 다른 영역 다섯으로 나눠 두고, 한 영역에 프로그램 하나만 넣습니다. 빈 영역은 주소 차례로 다음과 같습니다.
| 영역 | A | B | C | D | E |
|---|---|---|---|---|---|
| 크기 | 28K | 22K | 31K | 23K | 5K |
프로그램 29K·22K·34K가 이 차례로 와서 최적 적합(best fit)으로 넣었더니, 34K는 들어갈 영역이 없었습니다. 이때 외부 단편화의 크기로 알맞은 것을 고르세요.
- ① 2K
- ② 50K
- ③ 56K
- ④ 58K
정답
③ — 29K가 들어가는 영역은 C(31K)뿐이라 C에 넣습니다. 22K는 들어가는 A(28K)·B(22K)·D(23K) 가운데 가장 작은 B에 넣습니다. 남은 빈 영역 A·D·E는 모두 34K보다 작아 쓰이지 못하므로, 외부 단편화는 28 + 23 + 5 = 56K입니다.
| 프로그램 | 들어간 영역 | 내부 단편화 |
|---|---|---|
| 29K | C(31K) | 2K |
| 22K | B(22K) | 0K |
| 34K | 없음 | — |
- ① 내부 단편화를 셌습니다. 넣은 영역 안에 남은 2K와 0K는 내부 단편화이고, 묻는 것은 프로그램을 넣지 못한 빈 영역입니다.
- ② 최초 적합으로 넣었습니다. 22K를 앞에서 처음 만나는 A(28K)에 넣으면 남는 빈 영역이 B·D·E로 50K입니다. 최적 적합은 들어가는 영역 가운데 가장 작은 B를 고릅니다.
- ④ 내부 단편화까지 더했습니다. 56K에 넣은 영역 안의 2K를 더한 값입니다. 외부 단편화는 쓰이지 못한 빈 영역만 셉니다.
다시 볼 레슨: 기억장치 배치와 단편화
문제 2
페이지 크기가 2KB(2,048바이트)인 페이징 시스템의 페이지 표입니다. (가) 논리 주소 3000의 물리 주소와 (나) 논리 주소 5000을 바꿀 때 일어나는 일로 알맞은 것을 고르세요.
| 페이지 | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| 프레임 | 4 | 6 | 없음 | 1 |
- ① (가) 13240 · (나) 페이지 부재
- ② (가) 13240 · (나) 물리 주소 5000
- ③ (가) 13000 · (나) 페이지 부재
- ④ (가) 13000 · (나) 물리 주소 5000
정답
① — (가) 3000 ÷ 2048 = 1 … 952라 페이지 1, 오프셋 952입니다. 페이지 1은 프레임 6에 있어 6 × 2048 + 952 = 13240입니다. (나) 5000 ÷ 2048 = 2 … 904라 페이지 2인데, 표에 프레임이 적혀 있지 않아 페이지 부재가 납니다. 운영체제가 페이지 2를 빈 프레임에 올리고 표를 고친 뒤 주소를 다시 바꿉니다.
- ② (가)는 맞게 셌지만, 표에 프레임이 없는 페이지는 논리 주소를 그대로 쓴다고 봤습니다. 표에 없는 페이지를 쓰는 것이 페이지 부재입니다.
- ③ (나)는 맞게 봤지만 (가)에서 2KB를 2,000바이트로 셌습니다. 3000 ÷ 2000 = 1 … 1000으로 셈하면 6 × 2000 + 1000 = 13000이 나옵니다. 1KB는 1,024바이트입니다.
- ④ 2KB를 2,000바이트로 셌고, 표에 없는 페이지는 논리 주소를 그대로 쓴다고도 봤습니다.
다시 볼 레슨: 가상 메모리: 페이징과 세그먼테이션
문제 3
해시 테이블이 0~12번 칸(13칸)이고, 해시 함수는 나누는 수가 13인 제산법입니다. 충돌은 체이닝으로 풀고, 같은 칸으로 계산된 키는 그 칸의 줄 끝에 이어 답니다. 키 14, 27, 5, 40을 이 차례로 넣은 뒤 40을 찾습니다. (가) 40이 든 칸과 (나) 40을 찾을 때까지 견주는 키의 수로 알맞은 것을 고르세요.
- ① (가) 1번 칸 · (나) 1개
- ② (가) 1번 칸 · (나) 3개
- ③ (가) 3번 칸 · (나) 1개
- ④ (가) 3번 칸 · (나) 3개
정답
② — 제산법은 키를 나눈 나머지를 칸 번호로 씁니다. 14·27·40은 13으로 나눈 나머지가 모두 1이라 1번 칸에 14 → 27 → 40 차례로 매달리고, 5는 5번 칸에 들어갑니다. 40을 찾으면 1번 칸을 연 뒤 매달린 줄을 따라 14, 27, 40을 차례로 견주어 셋째에서 찾습니다.
- ① 해시는 늘 한 번에 찾는다고 봤습니다. 칸은 계산으로 바로 열지만, 체이닝에서는 그 칸에 매달린 줄을 따라가며 견줍니다.
- ③ 40을 13으로 나눈 몫 3을 칸 번호로 썼습니다. 몫을 쓰는 것은 페이징에서 페이지 번호를 구할 때이고, 제산법은 나머지를 씁니다. 몫으로 셈하면 40이 3번 칸에 혼자 들어 한 번에 찾는 것처럼 보입니다.
- ④ 칸 번호를 몫으로 셌습니다. 칸은 나머지인 1번이고, 견주는 수 3개는 그 1번 칸의 줄에서 나옵니다.
다시 볼 레슨: 이진 탐색과 해싱 · 가상 메모리: 페이징과 세그먼테이션
문제 4
프레임 셋이 빈 채로 시작해 참조열 5 4 2 5 1 2 5 3 2 4 1 2가 차례로 옵니다. LRU(Least Recently Used)로 교체할 때, 8번째 참조(3)까지 마친 뒤 프레임에 있는 페이지로 알맞은 것을 고르세요. 페이지는 작은 번호부터 적었습니다.
- ① 1 · 2 · 3
- ② 1 · 3 · 4
- ③ 1 · 3 · 5
- ④ 2 · 3 · 5
정답
④ — LRU는 마지막으로 쓴 때가 가장 이른 페이지를 내보냅니다. 1~3번째에 5·4·2가 들어오고 4번째 5는 적중입니다. 5번째 1이 올 때 마지막으로 쓴 때가 4는 2번째, 2는 3번째, 5는 4번째라 4를 내보냅니다. 6·7번째 2·5는 적중이고, 8번째 3이 올 때 1(5번째)·2(6번째)·5(7번째) 가운데 1을 내보내 2·3·5가 남습니다.
- ① 앞으로 가장 오래 쓰이지 않을 페이지를 내보냈습니다. OPT라면 8번째에 다시 쓰이지 않는 5를 내보내 1·2·3이 남습니다.
- ② 가장 최근에 쓴 페이지를 내보냈습니다. LRU를 거꾸로 읽은 것입니다. LRU는 가장 오래전에 쓴 페이지를 내보냅니다.
- ③ 가장 먼저 들어온 페이지를 내보냈습니다. FIFO라면 5번째에 5, 7번째에 4, 8번째에 2를 내보내 1·3·5가 남습니다.
다시 볼 레슨: 페이지 교체 알고리즘
문제 5
어느 서버의 CPU 이용률이 떨어지자, 운영자가 주기억장치에 함께 올리는 프로세스를 더 늘렸습니다. 그러자 디스크 읽기만 쉬지 않고 CPU 이용률은 더 떨어졌습니다. 가장 알맞은 조치를 고르세요.
- ① CPU가 놀고 있으니 프로세스를 더 올린다
- ② CPU를 더 빠른 것으로 바꾼다
- ③ 프로세스마다 받는 프레임을 줄이고, 남는 프레임으로 프로세스를 더 올린다
- ④ 프로세스 몇을 잠시 내보내, 남은 프로세스가 워킹 셋만큼 프레임을 받게 한다
정답
④ — 프레임이 워킹 셋보다 모자라 페이지 부재가 몰린 스래싱입니다. CPU가 노는 것은 할 일이 없어서가 아니라 디스크를 기다려서라, 다중 프로그래밍 정도를 낮춰 남은 프로세스가 워킹 셋만큼 프레임을 받게 해야 부재가 줄어듭니다.
- ① CPU 이용률이 낮다는 것만 봤습니다. 지금은 프로세스를 더 올릴수록 저마다 받는 프레임이 줄어 스래싱이 깊어집니다.
- ② CPU가 느려서 떨어졌다고 봤습니다. CPU는 디스크에서 페이지가 오기를 기다리느라 노는 중이라, 빨라져도 기다림은 그대로입니다.
- ③ 프레임을 쪼개 더 많이 돌리면 낫다고 봤습니다. 프레임이 워킹 셋보다 더 모자라져 부재가 더 몰립니다.
다시 볼 레슨: 지역성·워킹 셋·스래싱
문제 6
logs 디렉터리를 안에 든 파일과 함께, 이미 있는 old 디렉터리 안에 한 벌 더 두려 합니다. 현재 디렉터리의 logs는 그대로 남아야 합니다. 알맞은 명령을 고르세요.
- ①
cp logs old - ②
cp -r logs old - ③
mv logs old - ④
mv -r logs old
정답
② — cp는 원본을 남기고 복사합니다. 디렉터리는 안에 든 것까지 차례로 복사하는 -r을 붙여야 하고, 그러면 old 안에 logs가 한 벌 더 생깁니다.
- ①
-r을 빠뜨렸습니다. 디렉터리를-r없이 주면cp는-r not specified라며 그 디렉터리를 건너뛰고 아무것도 복사하지 않습니다. - ③ 원본이 남지 않습니다.
mv는 디렉터리도-r없이 옮기지만, 옮기고 나면 현재 디렉터리의logs가 사라집니다. - ④
cp -r·rm -r처럼mv에도-r을 붙인다고 봤습니다.mv에는-r옵션이 없어 오류가 나고, 붙일 수 있었다 해도 옮기기라 원본이 남지 않습니다.
다시 볼 레슨: 리눅스 기본 명령어
문제 7
어느 Linux 서버의 크론탭에 다음 한 줄이 있습니다. 이 줄이 도는 때로 알맞은 것을 고르세요.
30 6 1,5 * * /opt/report.sh
- ① 매달 1일과 5일 6시 30분
- ② 매달 1일부터 5일까지 날마다 6시 30분
- ③ 매주 월요일과 금요일 6시 30분
- ④ 매주 월요일부터 금요일까지 날마다 6시 30분
정답
① — 크론 식의 칸 차례는 분·시·일·월·요일입니다. 셋째 칸(일)의 1,5는 쉼표로 이은 목록이라 1일과 5일이고, 월과 요일 칸이 *라 달마다 그 두 날 6시 30분에 돕니다.
- ② 쉼표를 범위로 읽었습니다. 범위는 하이픈(
1-5)으로 적고, 쉼표는 적은 값만 고르는 목록입니다. - ③ 셋째 칸을 요일로 읽었습니다. 요일은 다섯째 칸이고, 셋째 칸은 날짜입니다.
- ④ 셋째 칸을 요일로 읽고, 쉼표까지 범위로 읽었습니다. 월요일부터 금요일까지 6시 30분이라면
30 6 * * 1-5로 적습니다.
다시 볼 레슨: 배치 프로그램
문제 8
backup.sh의 권한이 rwxr-xr-x(755)입니다. chmod o=r backup.sh를 친 뒤의 권한 숫자로 알맞은 것을 고르세요.
- ① 004
- ② 455
- ③ 754
- ④ 755
정답
③ — o는 기타 사용자이고, =는 적은 칸만 켜고 그 묶음의 나머지 칸은 끕니다. 기타의 r-x가 r--가 되어 rwxr-xr--, 숫자로 754입니다. 소유자와 그룹 묶음은 그대로입니다.
- ①
=가 다른 묶음까지 끈다고 봤습니다.=는 앞에 적은 묶음(o) 안에서만 칸을 맞춥니다. - ② o를 소유자(owner)로 읽었습니다. 소유자는 u(user)이고, o는 기타(others)입니다.
- ④
=를+처럼 읽었습니다.+라면 이미 켜진 r을 다시 켤 뿐이라 755 그대로이지만,=는 적지 않은 x를 끕니다.
다시 볼 레슨: 파일 권한과 링크
문제 9
다음 셸 스크립트의 출력으로 알맞은 것을 고르세요.
#!/bin/bash
i=10
c=0
while [ $i -ge 4 ]
do
c=$((c + 1))
i=$((i - 3))
done
echo "$c $i"
- ①
0 10 - ②
2 4 - ③
3 1 - ④
3 4
정답
③ — -ge는 '크거나 같다'라서 조건을 볼 때 i가 10·7·4이면 돕니다. 돌 때마다 c가 1씩 늘고 i가 3씩 줄어, 세 번째를 돈 뒤 i가 1이 되면 조건이 거짓이 되어 나옵니다.
| 회차 | 조건을 볼 때 i | 돈 뒤 c | 돈 뒤 i |
|---|---|---|---|
| 1 | 10 | 1 | 7 |
| 2 | 7 | 2 | 4 |
| 3 | 4 | 3 | 1 |
- ①
-ge를 '작거나 같다'로 거꾸로 읽었습니다. 그러면 10이 4보다 작거나 같지 않아 한 번도 돌지 않습니다. - ②
-ge를-gt(크다)로 읽었습니다. i가 4일 때도 '4는 4보다 크거나 같다'가 참이라 한 번 더 돕니다. - ④ 세 번째 회차에서 i를 줄이기 전 값을 찍었습니다. 반복 안에서 i는 4에서 1로 줄어든 뒤 조건을 다시 봅니다.
다시 볼 레슨: 환경 변수와 셸 스크립트
문제 10
bash로 짠 셸 스크립트 count.sh를 고친 뒤 곧바로 다시 돌렸습니다. 같은 일을 C로 짠 프로그램과 견줄 때, (가) 셸 스크립트를 고친 뒤 곧바로 다시 돌릴 수 있는 까닭과 (나) 대체로 빠르게 도는 쪽으로 알맞은 것을 고르세요.
- ① (가) 셸이 소스를 읽으며 바로 돌린다 · (나) C 프로그램
- ② (가) 셸이 소스를 읽으며 바로 돌린다 · (나) 셸 스크립트
- ③ (가) 셸이 고칠 때마다 실행 파일을 새로 만든다 · (나) C 프로그램
- ④ (가) 셸이 고칠 때마다 실행 파일을 새로 만든다 · (나) 셸 스크립트
정답
① — 셸 스크립트는 스크립트 언어처럼 실행 파일을 따로 만들지 않고, 명령어 해석기인 셸이 소스를 읽으며 바로 돌립니다. 그래서 고친 뒤 곧바로 돌려 볼 수 있지만, 돌릴 때마다 읽어 해석하므로 미리 기계어로 번역해 둔 C 실행 파일보다 대체로 느립니다.
- ② 번역 단계가 없으니 더 빠르다고 봤습니다. 미리 번역하지 않는 대신 돌릴 때마다 해석하느라 대체로 느립니다.
- ③ 셸 스크립트도 실행 파일을 만든다고 봤습니다. 소스를 미리 실행 파일로 번역하는 것은 C 같은 컴파일 언어이고,
chmod +x는 실행 권한을 줄 뿐입니다. - ④ 두 가지를 모두 거꾸로 봤습니다. 실행 파일 없이 바로 돌리고, 그 대가로 대체로 느립니다.
다시 볼 레슨: 프로그래밍 언어의 종류 · 환경 변수와 셸 스크립트
문제 11 (실기)
프레임 셋이 빈 채로 시작해 참조열 5 4 2 5 1 2 5 3 2 4 1 2가 차례로 옵니다. FIFO·LRU·OPT로 교체할 때의 페이지 부재 횟수를 차례로 쓰세요. 빈 프레임에 처음 들어오는 것도 부재로 셉니다. 답을 끝까지 쓴 뒤 정답을 펼치세요.
정답
받는 답: FIFO 9 · LRU 7 · OPT 6
세 알고리즘 모두 1~3번째(5·4·2)는 빈 프레임에 들어가는 부재입니다. 그 뒤 부재가 난 참조와 내보낸 페이지는 이렇습니다.
| 알고리즘 | 4번째부터 부재가 난 참조(내보낸 페이지) | 부재 |
|---|---|---|
| FIFO | 5번째(5) · 7번째(4) · 8번째(2) · 9번째(1) · 10번째(5) · 11번째(3) | 3 + 6 = 9 |
| LRU | 5번째(4) · 8번째(1) · 10번째(5) · 11번째(3) | 3 + 4 = 7 |
| OPT | 5번째(4) · 8번째(5) · 10번째(3) | 3 + 3 = 6 |
OPT는 5번째에 10번째에야 다시 쓰이는 4를, 8번째와 10번째에는 다시 쓰이지 않는 5와 3을 내보냅니다.
- 틀리는 꼴 FIFO 6 · LRU 4 · OPT 3: 빈 프레임에 처음 들어온 셋을 세지 않았습니다.
- 틀리는 꼴 FIFO 9 · LRU 9 · OPT 6: LRU를 들어온 때로 셌습니다. 그러면 FIFO와 같은 셈이 됩니다. LRU는 마지막으로 쓴 때를 봐, 5번째에는 4번째에 다시 쓴 5 대신 2번째에 쓴 4를 내보냅니다.
- 틀리는 꼴 FIFO 9 · LRU 7 · OPT 7: OPT를 지나간 쓰임으로 셌습니다. OPT는 앞으로 올 참조를 보고 다음 쓰임이 가장 먼 페이지를 내보냅니다.
다시 볼 레슨: 페이지 교체 알고리즘
문제 12 (실기)
웹 서버가 설정 파일 /etc/web/on/shop을 읽습니다. 이 파일에는 내용 대신 /etc/web/all/shop이라는 경로 글자만 들어 있고, 이런 식으로 디렉터리를 가리키게 만들 수도 있습니다. 관리자가 /etc/web/all/shop을 지우자, 웹 서버가 /etc/web/on/shop을 열지 못했습니다. /etc/web/on/shop처럼 만든 것의 이름을 한글로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
정답
받는 답: 심볼릭 링크 또는 소프트 링크
실마리는 '내용 대신 원본의 경로 글자만 담는다', '디렉터리도 가리킨다', '원본을 지우자 열리지 않는다'입니다. 소프트 링크는 자료에 따라 부르는 이름이라 함께 받습니다.
- 같은 이름의 다른 꼴: Symbolic Link — 영문 이름입니다. 문제가 한글로 물었습니다.
- 틀리는 꼴 하드 링크: 원본과 같은 아이노드를 가리켜, 원본 이름을 지워도 내용을 그대로 읽습니다. 디렉터리는 가리킬 수 없습니다.
- 틀리는 꼴 복사본:
cp로 만든 다른 파일이라 원본을 지워도 그대로 열리고, 원본의 경로가 아니라 내용을 담습니다.
다시 볼 레슨: 파일 권한과 링크
문제 13 (실기)
같은 웹 서버 nginx를 Ubuntu 서버에서는 apt install nginx로, Red Hat 계열 서버에서는 yum install nginx로 깔았습니다. 두 명령 모두 저장소에서 nginx를 받으면서, nginx가 돌려면 있어야 하는 다른 꾸러미까지 찾아 함께 깔았습니다. apt·yum 같은 도구를 통틀어 부르는 이름을 영문으로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
정답
받는 답: Package Manager
실마리는 '저장소에서 받아 깔고, 기대는 다른 꾸러미까지 함께 깐다'와 'Linux 계열마다 apt·yum으로 이름만 다르다'입니다.
- 같은 이름의 다른 꼴: 패키지 관리자 — 한글 이름입니다. 문제가 영문으로 물었습니다.
- 틀리는 꼴 Repository: 꾸러미를 받아 오는 저장소의 이름입니다. 받아서 까는 도구가 아닙니다.
- 틀리는 꼴 Package: 도구가 받아 까는 꾸러미 하나의 이름입니다. 이름의 일부만 쓴 꼴이라 받지 않습니다.
다시 볼 레슨: 개발환경 구축