제시된 특성은 트랜잭션의 고립성(Isolation)이다.
동시에 실행되는 트랜잭션이 서로의 중간 결과에 간섭하지 않고, 혼자 실행되는 것처럼 보이게 하는 성질이다.
- 일관성: 트랜잭션 전후로 데이터베이스가 무결성 제약을 만족하는 상태를 유지하는 성질이다.
- 원자성: 트랜잭션의 연산이 전부 반영되거나 전혀 반영되지 않아야 하는 성질이다.
- 지속성: 완료된 트랜잭션의 결과가 장애 후에도 보존되는 성질이다.
- 투명성: 트랜잭션의 ACID 특성에 속하지 않으며, 분산 시스템 등에서 내부 구조를 사용자에게 감추는 개념이다.
옳지 않은 것은 입출력 완료 후 바로 실행 상태로 전이된다는 설명이다.
입출력이 끝난 프로세스는 CPU를 곧바로 받는 것이 아니라 준비(ready) 상태로 옮겨 가 스케줄러의 선택을 기다린다.
- 시간 할당량 소진: 실행 중이던 프로세스는 CPU를 내놓고 준비 상태로 전이되므로 옳다.
- 동기식 입출력 요청: 완료될 때까지 CPU를 반납하고 대기 상태가 되므로 옳다.
- 다중 처리기 시스템: 처리기마다 프로세스를 실행할 수 있어 실행 상태가 여러 개일 수 있으므로 옳다.
- 대기 상태 프로세스: 사건 완료를 기다리는 중이라 CPU 할당 대상에서 제외되므로 옳다.
옳지 않은 것은 수신 측이 상위 계층에서 하위 계층 순으로 처리한다는 설명이다.
수신 측은 물리 계층에서 응용 계층 방향, 즉 하위에서 상위 순으로 헤더를 벗겨 가며 처리한다. 상위에서 하위로 내려가는 것은 송신 측의 동작이다.
- 물리 계층: 전송 매체와 직접 연관되어 비트를 신호로 전달하므로 옳다.
- 전송 계층: TCP, UDP가 대표 프로토콜이므로 옳다.
- 네트워크 계층: 경로 선택(라우팅)과 패킷 전달을 맡으므로 옳다.
- 응용 계층: 전자우편, 파일 전송 등 사용자 서비스를 제공하므로 옳다.
삽입 정렬(insertion sort), 퀵 정렬(quick sort), 힙 정렬(heap sort)
최악 수행시간이 같은 조합은 선택 정렬, 삽입 정렬, 퀵 정렬이다.
이 세 정렬의 최악은 모두 이다. 반면 합병 정렬과 힙 정렬은 최악에도 이다.
- 합병 정렬, 퀵 정렬, 힙 정렬: 퀵 정렬만 최악이 이다.
- 힙 정렬, 선택 정렬, 퀵 정렬: 힙 정렬만 최악이 이다.
- 합병 정렬, 선택 정렬, 삽입 정렬: 합병 정렬만 최악이 이다.
- 합병 정렬, 힙 정렬, 삽입 정렬: 삽입 정렬만 최악이 이다.
ㄱ. 스키마 변환 시 정보의 무손실, 자료 중복의 감소, 관련된 구조 간의 통합의 원칙을 준수하여야 한다.
ㄴ. 관계대수(relational algebra)의 연산에서 피연산자는 모두 릴레이션이지만 연산결과는 릴레이션이 아니다.
ㄷ. 릴레이션에 연산을 수행 시 삽입이상(insertion anomaly), 삭제이상(deletion anomaly), 갱신이상(update anomaly)이 발생할 수 있다.
ㄹ. 튜플을 구성하는 속성 사이에 존재하는 종속관계를 고려하지 않고 하나의 릴레이션으로 표현하여 이상(anomaly)을 해결할 수 있다.
ㅁ. 릴레이션이 여러 속성을 표현할 때 이를 작게 분해(decomposition)하는 과정을 정규화(normalization)라고 한다.
ㅂ. 릴레이션들은 관계대수(relational algebra)로 조작이 가능하다.
옳은 것은 ㄷ, ㅁ, ㅂ이다.
각 지문을 판정하면 ㄷ, ㅁ, ㅂ만 참이고, 이 세 지문으로만 이루어진 조합은 하나뿐이다.
- ㄱ(X): 정규화의 스키마 변환 원칙은 정보의 무손실, 중복 감소, 분리의 원칙이다. 관련 구조의 통합이 아니다.
- ㄴ(X): 관계대수는 연산 결과도 릴레이션이다(폐쇄 성질).
- ㄷ(O): 설계가 잘못된 릴레이션에서는 삽입·삭제·갱신 이상이 발생할 수 있다.
- ㄹ(X): 종속관계를 무시하고 한 릴레이션에 모으면 이상이 해결되지 않고 오히려 생긴다.
- ㅁ(O): 여러 속성을 가진 릴레이션을 작게 분해하는 과정이 정규화이다.
- ㅂ(O): 릴레이션은 관계대수로 조작할 수 있다.
주어진 식의 전위표기는 +-A/+BCD/+AE*BF이다.
스택 방식으로 후위식을 읽어 부분식을 묶는다.
왼쪽 부분: ABC+D/- → A - ((B+C)/D)
오른쪽 부분: AE+BF*/ → (A+E)/(B*F)
마지막 +가 두 부분을 더한다.
각 부분을 전위로 바꾸면 왼쪽은 -A/+BCD, 오른쪽은 /+AE*BF이고, 맨 앞에 최상위 연산자 +를 붙인다.
- -+A/BC+D/+AE*BF: 최상위 연산자가 -로 시작하므로 틀리다.
- +-A/+BCD/+*AEBF: 오른쪽이 ((A*E)+B)/F가 되어 틀리다.
- +A-/+BCD/+AE*BF: 최상위 +의 왼쪽 피연산자가 A 하나가 되어 틀리다.
- -+/A+BCD/+*AEBF: 최상위 연산자가 -로 시작하므로 틀리다.
| BC\A | 0 | 1 |
|---|---|---|
| 00 | 0 | 1 |
| 01 | 0 | 0 |
| 11 | 1 | 0 |
| 10 | 1 | 0 |
맵을 간소화한 논리식은 F = A′B + AB′C′이다.
A=0 열에서는 BC가 11, 10일 때 1이므로 두 칸을 묶어 A′B가 된다.
A=1 열에서는 BC가 00인 칸만 1이므로 AB′C′이고, 이 칸은 인접한 1과 묶이지 않는다.
- AB + AB′C: A=1, BC=10에서 1이 되지만 맵의 값은 0이다.
- A′B′ + A′B′C′: A=0, BC=00에서 1이 되지만 맵의 값은 0이다.
- AB′ + A′BC: A=1, BC=01에서 1이 되지만 맵의 값은 0이다.
- AB + BC: A=1, BC=11에서 1이 되지만 맵의 값은 0이다.
옳지 않은 것은 Belady’s anomaly를 LRU의 현상으로 설명한 것이다.
페이지 프레임을 늘렸는데 페이지 폴트가 늘어나는 현상은 FIFO에서 나타난다. LRU는 스택 알고리즘에 속해 이 이상이 발생하지 않는다.
- LRU의 정의: 가장 오랫동안 참조되지 않은 페이지를 교체하므로 옳다.
- LRU 근사 알고리즘: 정확한 LRU는 오버헤드가 커서 근사 기법을 쓰므로 옳다.
- 최적 페이지 교체: 앞으로 가장 오랫동안 참조되지 않을 페이지를 교체하는 것이 이론적 최적이므로 옳다.
- FIFO의 정의: 가장 먼저 적재된 페이지를 교체하므로 옳다.
IP 주소를 자동으로 할당하는 프로토콜은 DHCP이다.
공유기의 DHCP 서버가 접속한 기기에 사설 IP 주소, 게이트웨이, DNS 서버 정보 등을 임대해 준다.
- ARP: IP 주소에 대응하는 MAC 주소를 찾는 프로토콜이다.
- TCP: 연결 지향의 신뢰성 있는 전송 계층 프로토콜이다.
- UDP: 비연결형 전송 계층 프로토콜이다.
- ICMP: 오류 보고와 진단 메시지를 전달하는 프로토콜이다.
#include <stdio.h>
int foo(int a, int *b)
{
int c;
*b = a + 1;
c = a - 1;
return c;
}
void main()
{
int a = 5;
int b = 3;
int c = 0;
b = foo(a, &c);
c = foo(b, &a);
printf("a=%d b=%d c=%d\n", a, b, c);
}출력되는 값은 a=5, b=4, c=3이다.
foo는 포인터가 가리키는 변수에 a+1을 넣고 a-1을 반환한다. 초기값은 a=5, b=3, c=0이다.
첫 호출 b = foo(a, &c): 인자 5이므로 c = 6, 반환값 4가 b에 대입되어 b = 4이다.
둘째 호출 c = foo(b, &a): 인자 4이므로 a = 5, 반환값 3이 c에 대입되어 c = 3이다.
- 4, 3, 2: a는 둘째 호출에서 5가 되고 b는 첫 호출의 반환값 4이므로 틀리다.
- 6, 3, 4: 6은 첫 호출에서 c에 들어간 값이고 둘째 호출의 반환값 3으로 덮어써지며, b도 3이 아니므로 틀리다.
- 4, 3, 5: 둘째 호출에서 a가 5, c가 3이 되므로 틀리다.
- 5, 3, 0: b와 c를 초기값 그대로 둔 값으로, 두 변수 모두 호출 결과로 바뀌므로 틀리다.
ㄱ. 뷰의 정의는 변경할 수 없다.
ㄴ. 뷰는 삽입, 갱신, 삭제 연산에 제약이 있다.
ㄷ. 뷰 위에 다른 뷰를 정의할 수 없다.
ㄹ. 뷰가 정의된 테이블이 삭제되더라도 뷰는 남는다.
ㅁ. 뷰는 물리적으로 구현되는 테이블이다.
옳은 것은 ㄱ, ㄴ이다.
뷰는 기본 테이블에서 유도된 가상 테이블이라는 점에서 나머지 지문의 판정이 나온다.
- ㄱ(O): 표준 SQL에는 뷰 정의를 고치는 ALTER 문이 없어, 삭제 후 다시 생성한다.
- ㄴ(O): 뷰를 통한 삽입·갱신·삭제에는 제약이 있다.
- ㄷ(X): 뷰 위에 다른 뷰를 정의할 수 있다.
- ㄹ(X): 기본 테이블이 삭제되면 그에 의존하는 뷰는 함께 삭제되거나 사용할 수 없게 된다.
- ㅁ(X): 뷰는 물리적으로 저장되지 않는 가상 테이블이다.
임계 구역을 보호하는 기법은 상호배제(mutual exclusion)이다.
한 프로세스나 스레드가 임계 구역에 있는 동안 다른 쪽의 진입을 막아 공유 자원의 경쟁 상태를 방지한다.
- 인터럽트: 예외나 입출력 완료 같은 사건을 CPU에 알리는 메커니즘이다.
- 선점 스케줄링: 실행 중인 프로세스에서 CPU를 빼앗을 수 있는 스케줄링 방식이다.
- 문맥교환: CPU를 다른 프로세스로 넘길 때 상태를 저장하고 복원하는 과정이다.
- 교착상태: 서로 상대의 자원을 기다리며 진행하지 못하는 현상으로, 보호 기법이 아니다.
(단, 배열 array의 시작주소는 10840h로, int의 크기는 4바이트로 가정한다. 배열 첨자는 0부터 시작하며 숫자에 붙은 h는 16진수 표기를 의미한다.)
원소 array[7][12]의 시작주소는 11E50h이다.
행우선에서는 앞선 7개 행과 현재 행의 12개 원소를 건너뛴다.
공식: 시작주소 + (행 × 열 크기 + 열) × 원소 크기
오프셋:
16진수 변환: 5648 = 1610h
주소: 10840h + 1610h = 11E50h
- 16488h: 10840에 5648을 십진수로 더한 값으로, 16진수 변환을 빠뜨린 결과이다.
- 10804h: 배열 시작주소 10840h보다 작아 배열 안의 주소가 될 수 없다.
- 108BFh: 끝자리가 홀수로, 4바이트 원소의 시작주소 간격에 맞지 않는다.
- 10A3Ch: 열우선으로 계산한 값 을 더한 결과로, 행우선 조건에 맞지 않는다.
| 식별자 | 품목 |
|---|---|
| 1 | 맥주, 땅콩, 기저귀 |
| 2 | 맥주, 커피, 기저귀 |
| 3 | 맥주, 기저귀, 계란 |
| 4 | 땅콩, 계란, 우유 |
| 5 | 땅콩, 커피, 기저귀, 우유 |
규칙 기저귀 → 맥주의 신뢰도는 0.75이다.
신뢰도는 기저귀를 포함한 거래 중 맥주도 포함한 거래의 비율이다.
기저귀 포함 거래: 식별자 1, 2, 3, 5로 4건
기저귀와 맥주 동시 포함 거래: 식별자 1, 2, 3으로 3건
신뢰도:
- 0.33: 분모를 3건으로 잡아야 나오는 비율이지만 기저귀 포함 거래는 4건이다.
- 0.5: 기저귀 포함 4건 중 2건으로 센 값이지만 동시 포함 거래는 3건이다.
- 0.8: 전체 5건 중 기저귀가 포함된 비율 로, 기저귀의 지지도이다.
- 1.00: 맥주가 포함된 3건 모두에 기저귀가 있다는 값으로, 방향이 반대인 규칙 맥주 → 기저귀의 신뢰도이다.
옳지 않은 것은 DNS 서버로부터 웹 서버의 MAC 주소를 얻는다는 설명이다.
DNS가 알려 주는 것은 도메인 이름에 대응하는 IP 주소이다. MAC 주소는 같은 네트워크 안의 다음 홉을 찾을 때 ARP로 얻는다.
- DNS 질의 메시지: 접속 시 이름 해석을 위해 DNS 서버에 질의를 보내므로 옳다.
- DNS 간 질의: 재귀형 또는 반복형으로 연계되므로 옳다.
- TCP 3-방향 핸드셰이크: HTTP 요청 전에 연결을 수립하므로 옳다.
- HTTP 응답 처리: 응답 바디의 HTML을 해석해 페이지를 표시하므로 옳다.
비교경로로 옳지 않은 것은 7, 816, 68, 714, 121, 561, 278, 395, 573이다.
이진탐색트리에서는 573보다 작은 값을 만나면 하한이, 큰 값을 만나면 상한이 갱신되고, 이후 값은 그 범위 안에 있어야 한다.
이 경로는 561까지 범위가 561~714로 좁혀졌는데, 다음 값 278이 범위 밖이므로 불가능하다.
- 2, 173, 241, 856, 301, 489, 710, 516, 573: 모든 값이 범위 안이며 마지막 범위 516~710에 573이 있다.
- 981, 825, 693, 38, 137, 608, 224, 461, 573: 모든 값이 범위 안이며 마지막 범위 461~608에 573이 있다.
- 926, 139, 884, 278, 734, 319, 662, 481, 573: 모든 값이 범위 안이며 마지막 범위 481~662에 573이 있다.
- 14, 970, 831, 765, 111, 249, 318, 473, 573: 모든 값이 범위 안이며 마지막 범위 473~765에 573이 있다.
유니버설 게이트 집합이 아닌 것은 { XOR }이다.
XOR를 아무리 조합해도 출력은 입력 일부를 XOR한 형태에 머물러 AND 기능을 만들 수 없다.
- { NAND }: NAND만으로 NOT, AND, OR를 모두 만들 수 있다.
- { OR, DECODER }: 디코더가 모든 최소항을 만들고 OR로 합치면 임의의 논리함수를 구현할 수 있다.
- { MULTIPLEXER }: 선택선에 입력을 넣고 데이터 입력에 상수나 변수를 주어 임의의 논리함수를 구현할 수 있다.
- { OR, NOT }: 드모르간 법칙으로 AND를 만들 수 있다.
#include <stdio.h>
int recursion(int n)
{
if (n < 5) return 1;
else if (n % 5 == 1) return n + recursion(n - 1);
else recursion(n - 1);
}
int main()
{
int n = recursion(16);
printf("%d", n);
return 0;
}프로그램의 출력값은 34이다.
n을 5로 나눈 나머지가 1일 때만 n을 더하고, 그 외에는 n-1로 내려간다. 마지막 else에 return이 없어 표준상 미정의 동작이지만, 재귀 결과가 그대로 전달된다고 보고 추적한다.
r(16) = 16 + r(15), r(15)부터 r(12)까지는 r(11)로 내려간다.
r(11) = 11 + r(10), r(10)부터 r(7)까지는 r(6)으로 내려간다.
r(6) = 6 + r(5), r(5) = r(4) = 1이다.
합계: 16 + 11 + 6 + 1 = 34
- 33: 기저 사례의 반환값 1을 빠뜨린 값이다.
- 31: 합계 16 + 11 + 6 + 1보다 3 작아 추적 결과와 맞지 않는다.
- 29: 합계 16 + 11 + 6 + 1보다 5 작아 추적 결과와 맞지 않는다.
- 28: n = 6에서의 덧셈을 빠뜨린 값이다.
옳지 않은 것은 TCP가 올바른 순서의 전달을 보장하지 못한다는 설명이다.
TCP는 순서 번호로 세그먼트를 재정렬하여 수신 프로세스에 바이트 스트림을 순서대로 전달한다.
- 혼잡 제어: TCP는 네트워크 폭주를 막는 혼잡 제어 기능을 포함하므로 옳다.
- UDP의 서비스: 비신뢰적이고 비연결형이므로 옳다.
- 패킷 재전송: TCP는 손실이 감지되면 재전송하므로 옳다.
- UDP 헤더: 출발지 포트, 목적지 포트, 길이, 체크섬으로 구성되므로 옳다.
옳지 않은 것은 패킷 교환보다 더 많은 동시 접속자를 수용할 수 있다는 설명이다.
회선 교환은 연결마다 자원을 고정 점유하므로 수용 인원이 제한된다. 패킷 교환은 회선을 공유하여 더 많은 사용자를 수용한다.
- 종단 간 연결: 데이터 전송 전에 연결 설정 과정이 필요하므로 옳다.
- 회선 독점: 연결이 수립되면 해당 회선을 독점하므로 옳다.
- 전화망: 회선 교환의 대표 사례이므로 옳다.
- 안정적 전송속도: 자원이 예약되어 있어 일정한 속도를 보장하기 쉬우므로 옳다.