간접 주소지정 방식을 쓰는 이유는 지정 가능한 주소 범위의 확대이다.
명령어의 주소 필드는 비트 수가 짧아 표현할 수 있는 주소가 제한된다. 간접 방식은 이 필드에 실제 주소가 저장된 위치를 담고, 메모리의 한 워드 전체를 주소로 쓰므로 더 넓은 공간을 가리킬 수 있다.
- 보안 강화: 메모리에 접근하지 못하게 하는 기법이 아니라, 오히려 메모리를 거쳐 주소를 얻는 방식이다.
- 메모리 접근 속도 향상: 주소를 읽기 위한 메모리 접근이 한 번 더 필요해 유효 데이터 접근은 더 느려진다.
- 제작 비용 절감: 주소 해석 방식일 뿐 비용 절감을 위한 기법이 아니다.
- CPU 실행 속도 향상: 추가 메모리 접근 때문에 명령어 실행 시간은 늘어난다.
행동에 따른 보상으로 스스로 해결 방법을 찾는 기법은 강화학습이다.
강화학습의 에이전트는 환경에서 행동을 시도하고, 받은 보상을 최대화하는 방향으로 행동 전략을 개선한다.
- 베이시안 네트워크: 변수 사이의 확률적 의존 관계를 그래프로 표현하는 모델이다.
- 지도학습: 정답(레이블)이 붙은 데이터로 입력과 출력의 관계를 학습한다.
- 군집화: 레이블 없이 비슷한 데이터끼리 묶는 비지도학습 기법이다.
- 경사 하강법: 손실 함수의 기울기를 따라 값을 줄여 가는 최적화 방법이다.
옳지 않은 설명은 세그먼트 방식에 외부 단편화가 발생하지 않는다는 내용이다.
세그먼트는 크기가 서로 달라 메모리에 동적으로 할당하고 해제하는 과정에서 조각난 빈 공간이 생긴다. 즉 세그먼트 방식에서는 외부 단편화가 발생한다.
- 실제 메모리보다 큰 프로그램 실행: 필요한 부분만 적재하므로 가상메모리의 기본 장점이 맞다.
- 페이지 사상의 부담: 주소 변환 과정이 추가되어 비용이 늘고 수행속도가 떨어지는 것이 맞다.
- 작은 페이지와 내부 단편화: 페이지가 작을수록 마지막 페이지에 남는 공간이 줄어 내부 단편화가 감소한다.
- 세그먼트의 가상주소: 세그먼트 번호와 변위로 구성되는 것이 맞다.
i-node에 존재하지 않는 정보는 파일 이름이다.
UNIX에서 파일 이름은 디렉터리 항목에 저장되며, 디렉터리 항목이 이름과 i-node 번호를 연결한다. 그래서 한 i-node에 여러 이름을 연결하는 하드 링크가 가능하다.
- 파일 저장 위치: 데이터 블록을 가리키는 포인터로 i-node에 들어 있다.
- 파일 생성 일시: 파일의 시간 정보는 i-node가 관리하는 메타데이터에 해당한다.
- 파일 소유자: 소유자 정보가 i-node에 기록된다.
- 파일 접근권한 비트: 읽기·쓰기·실행 권한이 i-node에 기록된다.
옳지 않은 설명은 내부 스키마를 범 기관적 입장의 정의라고 한 내용이다.
범 기관적 입장에서 데이터베이스 전체를 정의하는 것은 개념 스키마이고, 내부 스키마는 저장 구조와 접근 경로 같은 물리적 저장 방식을 정의한다.
- 개념 스키마의 명세 내용: 데이터 개체, 관계, 제약 조건, 접근권한, 무결성 규칙을 포함하는 것이 맞다.
- 스키마의 일반적 의미: 단순히 스키마라고 하면 보통 개념 스키마를 가리킨다.
- 외부 스키마: 사용자나 응용프로그래머가 보는 데이터베이스의 논리적 구조를 정의한다.
- 스키마의 정의: 데이터베이스의 논리적 정의, 데이터 구조, 제약 조건을 기술한 명세가 맞다.
구문이 옳은 문장은 SELECT COUNT(DISTINCT CNO) FROM ENROL WHERE SNO = 100;이다.
집계 함수 COUNT 안에 DISTINCT를 써서 중복을 제외한 CNO의 개수를 구하는 올바른 형식이다.
- DELETE FROM STUDENT, ENROL …: 표준 DELETE 문은 FROM 절에 테이블 하나만 지정한다.
- WHERE DEPT = NULL: NULL 비교는 IS NULL로 써야 하며, = 비교는 참이 되지 않는다.
- INSERT STUDENT INTO VALUES(…): 올바른 순서는 INSERT INTO STUDENT VALUES(…)이다.
- GROUP BY DNO WHERE SUM(SNAME)<100: WHERE는 GROUP BY 앞에 오고 집계 함수를 쓸 수 없으므로, 그룹 조건은 HAVING으로 써야 한다.
제어키 5로 처음 분할한 직후의 두 리스트는 (3 2 1 4), (7 8 6)이다.
왼쪽에서는 5보다 큰 값, 오른쪽에서는 5보다 작은 값을 찾아 교환한다.
1회 교환 6↔1: 5 2 1 4 7 3 8 6
2회 교환 7↔3: 5 2 1 4 3 7 8 6
탐색이 교차하면 제어키 5를 3과 교환: 3 2 1 4 5 7 8 6
- (5 2 6 4), (7 3 8 1): 리스트를 가운데서 자른 것일 뿐 제어키 기준 분할이 아니다.
- (2 4 3 1), (6 7 8): 작은 값과 큰 값을 원래 순서대로 모은 것으로, 교환 결과가 아니다.
- (3 1 2 4), (7 6 8): 값의 구성은 같지만 위 교환 과정에서 나오는 순서가 아니다.
- (1 2 3 4), (6 7 8): 양쪽이 이미 정렬된 상태로, 첫 분할 직후의 모습이 아니다.
int fib(int n)
{
if(n == 0) return 0;
if(n == 1) return 1;
return(fib(n-1) + fib(n-2));
}
int main()
{
fib(5);
}
fib(5)를 실행하면 fib() 함수는 모두 15회 호출된다.
fib(n)의 호출 횟수는 자기 자신 1회에 두 재귀 호출의 횟수를 더한 값이다.
- 3회: fib(5)와 그 직접 호출인 fib(4), fib(3)만 센 값이다.
- 5회: fib(5)에서 fib(1)까지 가장 깊은 경로 하나만 센 값이다.
- 10회: fib(5) 1회와 fib(4) 쪽 9회만 더해 fib(3) 쪽 5회가 빠진 값이다.
- 12회: fib(3) 쪽 호출의 중복 호출을 일부 빠뜨린 값이다.
옳지 않은 설명은 객체는 재사용이 가능하나 클래스는 불가능하다는 내용이다.
클래스는 객체를 만드는 틀로, 여러 객체를 생성하고 상속으로 확장할 수 있어 재사용의 핵심 단위이다.
- 객체의 선언: 객체는 하나의 클래스 타입으로 선언되는 것이 맞다.
- 오버라이딩과 오버로딩: 같은 이름으로 다른 동작을 제공하므로 둘 다 다형성을 지원한다.
- 추상메소드: 선언만 하고 구현 내용은 하위 클래스에 맡기는 메소드가 맞다.
- Smalltalk, Simula, Java: 객체지향 개념을 대표하는 언어들이다.
옳지 않은 설명은 TCP에서 송신측이 수신 여부를 확인할 수 없다는 내용이다.
TCP는 수신측이 보내는 확인 응답(ACK)으로 전달 여부를 확인하고, 응답이 없으면 재전송하는 신뢰성 있는 프로토콜이다.
- 사전 연결: TCP는 3-way 핸드셰이크로 연결을 맺는 연결 지향 프로토콜이다.
- 흐름 제어: 수신측의 윈도우 크기에 맞춰 전송량을 조절해 버퍼 오버플로우를 막는다.
- 혼잡 제어: 네트워크 상황에 따라 전송량을 조절해 패킷 과잉을 방지한다.
- FTP에서의 이용: FTP는 전송 계층 프로토콜로 TCP를 사용한다.
옳지 않은 설명은 입출력 장치마다 DMA 제어기가 한 개씩 사용된다는 내용이다.
DMA 제어기 하나는 여러 채널을 두어 여러 입출력 장치를 함께 담당할 수 있으므로, 장치마다 따로 둘 필요가 없다.
- 전송 경로: 입출력 장치와 메인메모리 사이에서 CPU를 거치지 않고 데이터를 전송한다.
- 사이클 스틸링: DMA 제어기가 CPU의 메모리 사이클을 빌려 전송하는 DMA의 대표적 동작을 가리키는 표현이다.
- 전송 시점: CPU가 메인메모리를 사용하지 않는 동안 버스를 이용해 전송한다.
- 완료 통지: 전송이 끝나면 DMA 제어기가 CPU에 인터럽트로 알린다.
구성한 메모리의 마지막 주소는 16진수로 7FF이다.
직렬 연결은 주소 공간을 이어 붙이는 것이므로 워드 수가 4배가 된다.
주소는 0부터 시작하므로 마지막 주소는 다음과 같다.
- 1FF: RAM 한 개(512워드)의 마지막 주소이다.
- 200: 512를 16진수로 나타낸 워드 수이다.
- 800: 2048을 16진수로 나타낸 워드 수로, 마지막 주소보다 1 크다.
- FFF: 4096워드 메모리의 마지막 주소이다.
인접 노드 간에 프레임을 전송하는 계층은 데이터 링크 계층이다.
데이터 링크 계층은 비트를 프레임 단위로 묶고, MAC 주소로 목적지를 지정하며, 흐름 제어와 오류 제어를 수행한다.
- 물리 계층: 비트를 전기·광 신호로 전송할 뿐 프레임을 다루지 않는다.
- 네트워크 계층: IP 주소로 패킷의 경로를 정하는 라우팅을 맡는다.
- 트랜스포트 계층: 인접 노드가 아니라 종단 프로세스 사이의 전달을 맡는다.
- 응용 계층: 사용자 응용 서비스를 제공한다.
옳지 않은 설명은 다른 프로세스의 스레드 사이에 교착상태가 발생하지 않는다는 내용이다.
교착상태는 자원을 서로 점유한 채 기다릴 때 생긴다. 파일, 장치, 공유 메모리의 락처럼 프로세스 간에 공유되는 자원이 있으면 다른 프로세스의 스레드끼리도 발생할 수 있다.
- 스레드 수: 프로세스마다 서로 다른 수의 스레드를 가질 수 있다.
- 메모리 공유: 같은 프로세스의 스레드는 코드, 데이터, 힙을 공유한다.
- 스케줄링 단위: 리눅스에서는 커널이 스레드 단위로 CPU를 스케줄링한다.
- 문맥교환 속도: 같은 프로세스 안에서는 주소 공간을 바꾸지 않아 더 빠르다.
서버 없이 동작하는 대표적인 임베디드 데이터베이스 엔진은 SQLite이다.
SQLite는 응용 프로그램에 라이브러리로 포함되어 별도의 서버 프로세스 없이 파일 하나에 데이터를 저장하므로 모바일 기기에서 널리 쓰인다.
- MySQL: 클라이언트가 서버에 접속해 사용하는 서버형 DBMS이다.
- mSQL: 가벼운 편이지만 역시 서버 프로세스를 두는 클라이언트-서버형이다.
- Oracle: 대규모 업무용 서버형 DBMS이다.
- SQL Server: Microsoft의 서버형 DBMS이다.
옳지 않은 설명은 뷰의 정의를 ALTER 문으로 변경할 수 있다는 내용이다.
표준 SQL을 다루는 교과서 기준으로 뷰의 정의는 변경할 수 없고, DROP VIEW로 삭제한 뒤 다시 CREATE VIEW로 생성해야 한다.
- 독자적 인덱스 불가: 뷰는 물리적으로 저장되지 않는 가상 테이블이므로 맞는 설명이다.
- 실행 시 구축: 정의만 시스템 카탈로그에 저장하고 필요할 때 기본 테이블에서 구성한다.
- 보안 제공: 사용자에게 필요한 열과 행만 보여 주어 데이터를 보호할 수 있다.
- 뷰 위의 뷰: 뷰는 다른 뷰를 정의하는 기반으로 쓸 수 있다.
주어진 식의 후위 표기는 8 2 3 * - 2 / 6 3 * 2 / +이다.
우선순위가 높은 연산부터 변환하면 된다.
(8 – 2 * 3) → 8 2 3 * -
(8 – 2 * 3) / 2 → 8 2 3 * - 2 /
6 * 3 / 2 → 6 3 * 2 /
두 결과를 마지막에 +로 잇는다.
- 2 3 * 8 – 2 / 6 3 * 2 / +: 뺄셈의 피연산자 순서가 뒤바뀌어 2 * 3 – 8을 뜻한다.
- 8 2 – 3 * 2 / 6 + 3 * 2 /: 괄호 안의 뺄셈을 곱셈보다 먼저 계산한 형태이다.
- 8 2 3 * - 2 / 6 3 * 2 + /: 끝부분이 6 * 3 / 2가 아니라, 앞의 값을 (6 * 3 + 2)로 나눈 형태이다.
- + / – 8 * 2 3 2 / * 6 3 2: 연산자가 피연산자 앞에 오는 전위 표기이다.
int main()
{
int i = 3;
int j = 4;
if((++i > j--) && (i++ < --j)) i = i-- + ++j;
else j = i-- - --j;
printf(”%d\n”, i);
}
조건식이 거짓이 되어 else 문이 실행되고, 출력되는 i의 값은 3이다.
시작 값은 i = 3, j = 4이다.
++i로 i가 4가 되고, j--는 4를 내놓은 뒤 j가 3이 된다.
4 > 4는 거짓이므로 단락 평가로 뒤의 조건은 실행되지 않는다.
else 문의 i--는 4를 내놓은 뒤 i를 3으로 만들고, --j로 j는 2가 되어 j에 2가 대입된다.
printf는 i를 출력하므로 결과는 3이다.
- 1: else 문의 뺄셈을 감소된 i로 잘못 계산한 값이며 i의 값도 아니다.
- 2: i가 아니라 j에 대입된 값이다.
- 4: i--의 후위 감소를 반영하지 않은 값이다.
- 5: 첫 조건을 참으로 보고 i++까지 실행했다고 착각한 값이다.
옳지 않은 설명은 게이트웨이의 예로 모뎀을 든 내용이다.
게이트웨이는 서로 다른 네트워크 사이의 출입구로서 프로토콜을 변환하는 장비이다. 모뎀은 디지털 신호와 아날로그 신호를 바꾸는 변복조 장치로 게이트웨이가 아니다.
- 허브: 여러 포트로 데이터를 중계하며 더미 허브와 스위칭 허브로 나뉜다.
- 리피터: 약해진 신호를 재생해 전송 거리를 연장한다.
- 브리지: 세그먼트를 연결하고 프레임의 물리 주소로 필터링한다.
- 라우터: 서로 다른 네트워크를 연결하고 IP 주소로 패킷의 경로를 정한다.
| <보 기> | ||
| ㄱ. FIFO(First In First Out) 스케줄링 ㄴ. RR(Round Robin) 스케줄링 ㄷ. Priority 스케줄링 ㄹ. HRN(Highest Response ratio Next) 스케줄링 ㅁ. SJF(Shortest Job First) 스케줄링 | ||
기아 현상이 발생할 수 있는 기법은 ㄷ(Priority)과 ㅁ(SJF)이다.
기아는 특정 작업이 계속 뒤로 밀려 CPU를 받지 못하는 현상이다. 우선순위가 높거나 실행 시간이 짧은 작업을 앞세우는 기법에서 생기며, 아래와 같이 다섯 지문을 판정하면 해당하는 조합은 ㄷ, ㅁ 하나이다.
- ㄱ FIFO(발생 안 함): 도착 순서대로 처리하므로 언젠가 반드시 차례가 온다.
- ㄴ RR(발생 안 함): 모든 작업이 시간 할당량을 돌아가며 받는다.
- ㄷ Priority(발생): 낮은 우선순위 작업은 높은 작업이 계속 들어오면 밀린다.
- ㄹ HRN(발생 안 함): 대기 시간이 길수록 응답 비율이 커져 기아를 막는다.
- ㅁ SJF(발생): 긴 작업은 짧은 작업이 계속 들어오면 밀린다.