병렬 처리 기법이 아닌 것은 블루-레이 디스크로, 이는 광학식 저장 매체이다.
나머지는 여러 명령어를 동시에 처리하기 위한 CPU 수준의 병렬 처리 기법이다.
- VLIW는 컴파일러가 독립적인 명령어들을 하나의 긴 명령어로 묶어 동시에 실행시키는 기법이다.
- 파이프라인은 명령어 처리를 여러 단계로 나누어 중첩 실행하는 기법이다.
- 슈퍼스칼라는 여러 개의 실행 유닛으로 한 사이클에 복수 명령어를 하드웨어가 동시에 발행하는 기법이다.
IP 주소를 동적으로 할당하는 것은 DHCP(Dynamic Host Configuration Protocol)이다.
DHCP 서버는 접속한 호스트에 IP 주소·서브넷 마스크·기본 게이트웨이·DNS 서버 주소 등을 임대 방식으로 자동 배정한다.
- TCP는 연결지향의 신뢰성 있는 전송 계층 프로토콜이다.
- DNS는 도메인 이름을 IP 주소로 변환하는 서비스이다.
- SOAP는 XML 기반으로 웹 서비스 메시지를 교환하는 프로토콜이다.
옳지 않은 것은 순차적인 데이터 전송으로 전송을 보장한다는 설명이다. 이는 TCP의 특징이다.
UDP는 순서 번호·확인 응답·재전송 기능이 없어 전달 순서와 도착을 보장하지 않는 비신뢰적 프로토콜이다.
- 흐름 제어가 필요 없는 비신뢰적 통신에 쓴다는 설명은 옳다.
- 비연결지향으로 연결 설정 없이 전송한다는 설명은 옳다.
- 손실 데이터의 재전송을 요구하지 않는다는 설명은 옳다.
MIMD에 속하지 않는 것은 배열 프로세서로, 이는 SIMD 구조이다.
배열 프로세서는 하나의 제어 장치가 같은 명령어를 여러 처리 요소에 내려 서로 다른 데이터에 동시에 적용한다.
- 클러스터는 독립 컴퓨터들이 각자 명령어를 실행하는 MIMD 구조이다.
- 대칭형 다중 프로세서(SMP)는 공유 메모리를 쓰는 MIMD 구조이다.
- 불균일 기억장치 액세스(NUMA)도 여러 프로세서가 독립 명령어 흐름을 갖는 MIMD 구조이다.
- ㄱ. 입출력장치는 기계적 동작을 수반하기 때문에 동작 속도가 주기억장치보다 빠르다.
- ㄴ. 중앙처리장치는 명령어 실행단계에서 제어장치, 내부 레지스터, 연산기를 필요로 한다.
- ㄷ. 중앙처리장치는 명령어 인출단계에서 인출된 명령어를 저장하기 위한 명령어 레지스터와 다음에 실행할 명령어가 있는 기억장치의 주소를 저장할 프로그램 카운터를 필요로 한다.
- ㄹ. 입출력장치는 중앙처리장치와 직접 데이터를 교환할 수 있으며, 데이터 교환은 반드시 중앙처리장치의 입출력 동작 제어에 의해서만 가능하다.
옳은 것은 CPU 실행단계에 제어장치·내부 레지스터·연산기가 필요하다는 설명과, 인출단계에 명령어 레지스터·프로그램 카운터가 필요하다는 설명이다.
명령어 실행은 제어장치의 제어 아래 레지스터와 연산기(ALU)가 수행하고, 인출단계에서는 다음 명령어 주소를 가진 프로그램 카운터와 인출한 명령어를 담는 명령어 레지스터가 쓰인다.
- 입출력장치가 주기억장치보다 빠르다는 설명 — 기계적 동작을 수반하므로 오히려 훨씬 느리다.
- 데이터 교환이 반드시 CPU의 입출력 제어에 의해서만 가능하다는 설명 — DMA 방식은 CPU 개입 없이 입출력장치와 주기억장치가 직접 데이터를 주고받는다.
옳은 것은 SIGCHLD가 자식 프로세스의 종료 혹은 중지를 부모에게 알리는 시그널이라는 설명이다.
부모 프로세스는 SIGCHLD를 받아 wait 계열 호출로 자식의 종료 상태를 회수할 수 있다.
- abort()에서 발생하는 시그널은 SIGKILL이 아니라 SIGABRT이며, SIGKILL은 붙잡거나 무시할 수 없는 강제 종료 시그널이다.
- 잘못된 하드웨어 명령어 수행 시 발생하는 것은 SIGTERM이 아니라 SIGILL이며, SIGTERM은 일반 종료 요청 시그널이다.
- 터미널에서 Ctrl+Z로 발생하는 중지 시그널은 SIGILL이 아니라 SIGTSTP이다.
물리 메모리의 프레임당 단 한 개의 페이지 테이블 항목을 할당함으로써 페이지 테이블이 차지하는 공간을 줄이는 기술
물리 프레임마다 하나의 항목만 두어 페이지 테이블 공간을 줄이는 기술은 역 페이지 테이블이다.
역 페이지 테이블은 프로세스마다 테이블을 두는 대신 시스템 전체에 물리 프레임 수만큼의 항목만 두고, 각 항목에 그 프레임을 차지한 프로세스 ID와 페이지 번호를 저장한다. 테이블 크기는 줄지만 주소 변환 때 탐색이 필요하다.
- 변환 참조 버퍼(TLB) — 최근 주소 변환 결과를 저장하는 고속 캐시로 변환 속도를 높이는 장치이다.
- 계층적 페이지 테이블 — 페이지 테이블을 여러 단계로 나눠 필요한 부분만 메모리에 두는 구조로, 항목이 프레임당 하나인 구조가 아니다.
- 해시 페이지 테이블 — 가상 페이지 번호를 해시해 체인에서 찾는 구조이다.
#include <stdio.h>
void main() {
int x = 0x15213F10 >> 4;
char y = (char) x;
unsigned char z = (unsigned char) x;
printf("%d, %u", y, z);
}y는 -15, z는 241로 출력된다.
0x15213F10을 오른쪽으로 4비트 이동하면 0x015213F1이 되고, 1바이트 형으로 변환하면 하위 바이트 0xF1(11110001)만 남는다.
char는 부호 있는 값으로 해석되어 11110001의 2의 보수인 00001111에 음수 부호를 붙인 -15가 되고, unsigned char는 부호 없이 해석되어 15×16+1=241이 된다.
해당 프로토콜은 ICMP(Internet Control Message Protocol)이다.
ICMP는 인터넷 계층에서 목적지 도달 불가 같은 오류 보고, 에코 요청·응답 같은 상황 보고, 경로 재지정(redirect) 정보 전달을 맡으며 ping·traceroute가 이를 이용한다.
- RARP는 MAC 주소로 IP 주소를 알아내는 프로토콜이다.
- ARP는 IP 주소로 MAC 주소를 알아내는 프로토콜이다.
- IGMP는 멀티캐스트 그룹 가입·탈퇴를 관리하는 프로토콜이다.
제어장치에 해당하지 않는 것은 시프트 레지스터로, 데이터를 이동시키는 연산장치(ALU) 쪽 구성 요소이다.
제어장치는 명령어를 해독하고 실행 순서를 정해 각 장치에 제어 신호를 보내는 부분이다.
- 순서 제어 논리 장치는 마이크로 동작의 실행 순서를 결정하는 제어장치 구성 요소이다.
- 명령어 해독기는 명령어의 연산 코드를 해석하는 제어장치 구성 요소이다.
- 서브루틴 레지스터는 서브루틴 호출 시 복귀 주소를 보관하는 제어장치 구성 요소이다.
일정한 시간 간격으로 아날로그 신호 값을 추출하는 과정은 표본화(sampling)이다.
PCM 변환은 표본화 → 양자화 → 부호화 순으로 진행되며, 표본화가 시간 축을 이산화하는 첫 단계이다.
- 양자화는 표본화된 값을 정해진 이산 레벨로 근사하는 과정이다.
- 부호화는 양자화된 레벨을 2진 부호로 바꾸는 과정이다.
- 자동화는 신호 변환 과정과 관계없는 용어이다.
#include <stdio.h>
int funa(int);
void main() {
printf("%d, %d", funa(5), funa(6));
return 0;
}
int funa(int n) {
if(n > 1)
return (n + (funa(n-2)));
else
return (n % 2);
}funa(5)=9, funa(6)=12이므로 9, 12가 출력된다.
n>1이면 n+funa(n-2)를, 아니면 n%2를 반환한다.
funa(5)=5+funa(3)=5+3+funa(1)=8+1=9
funa(6)=6+funa(4)=6+4+funa(2)=10+2+funa(0)=12+0=12
결국 홀수 n은 n 이하 홀수의 합, 짝수 n은 n 이하 짝수의 합이 된다.
탐색키 값을 여러 부분으로 나눈 후 각 부분의 값을 더하거나 XOR(배타적 논리합) 연산하여 그 결과로 주소를 취하는 방법
탐색키를 여러 부분으로 나눈 뒤 각 부분을 더하거나 XOR해 주소를 얻는 방법은 폴딩함수이다.
폴딩은 키를 같은 길이의 조각으로 나눠 접듯이 겹쳐 합산(또는 XOR)하므로 키의 모든 자리가 주소에 반영된다.
- 숫자분석함수 — 키의 각 자릿수 분포를 분석해 고르게 분포한 자리만 골라 주소로 쓴다.
- 제산함수 — 키를 테이블 크기로 나눈 나머지를 주소로 쓴다.
- 중간제곱함수 — 키를 제곱한 값의 중간 자리 몇 개를 주소로 쓴다.
- (가) 컴퓨터가 데이터를 통해 스스로 학습하여 예측이나 판단을 제공하는 기술
- (나) 인간의 지적 능력을 컴퓨터를 통해 구현하는 기술
- (다) 인공 신경망을 활용하는 개념으로, 여러 계층의 신경망을 구성해 학습을 효과적으로 수행하는 기술
| (가) | (나) | (다) | |
|---|---|---|---|
| ① | 인공지능 | 머신러닝 | 딥러닝 |
| ② | 인공지능 | 딥러닝 | 머신러닝 |
| ③ | 머신러닝 | 인공지능 | 딥러닝 |
| ④ | 머신러닝 | 딥러닝 | 인공지능 |
(가) 머신러닝, (나) 인공지능, (다) 딥러닝으로 연결해야 한다.
인공지능은 인간의 지적 능력을 컴퓨터로 구현하는 가장 넓은 개념이고, 머신러닝은 그 안에서 데이터로 스스로 학습해 예측·판단하는 기술이며, 딥러닝은 머신러닝 중 여러 계층의 인공 신경망을 쓰는 기술이다.
- 인공지능·머신러닝·딥러닝 순의 연결 — 데이터로 스스로 학습하는 (가)는 인공지능이 아니라 머신러닝이다.
- 인공지능·딥러닝·머신러닝 순의 연결 — 지적 능력 구현이라는 포괄적 정의인 (나)는 인공지능이고, 다계층 신경망인 (다)는 딥러닝이다.
- 머신러닝·딥러닝·인공지능 순의 연결 — (나)와 (다)가 뒤바뀌었다.
옳은 것은 소단위 명세서 작성 도구로 구조적 언어, 의사결정표 등이 있다는 설명이다.
소단위 명세서(Mini-Spec)는 자료흐름도의 최하위 처리 절차를 기술하며, 구조적 언어·의사결정표·의사결정나무 등을 쓴다.
- 자료흐름도에서 자료저장소는 원이 아니라 평행선으로 표현하며, 원은 처리(프로세스)를 나타낸다.
- 계획(ISP)·분석(BAA)·설계(BSD)·구축(SC)은 자료사전 작성 절차가 아니라 정보공학 방법론의 단계이다.
- 자료사전에서 ( )는 생략 가능을 뜻하고, 선택은 [ ]로 표기한다.
주식회사의 주가를 보면 일일 가격은 급격히 변동할 수 있다. 하지만 긴 기간의 움직임을 보면 상승, 하락 또는 변동 없는 추세를 보인다.
단기 변동은 커도 장기적으로는 일정한 추세를 보인다는 내용은 리먼(Lehman)의 소프트웨어 진화 법칙 중 자기 통제의 법칙이다.
자기 통제(self regulation)의 법칙은 시스템 진화 과정이 스스로 조절되어, 릴리스마다 변화량은 들쭉날쭉해도 제품·프로세스 척도가 장기적으로는 통계적으로 일정한 추세를 따른다는 내용이다.
- 복잡도 증가의 법칙 — 구조 개선 작업을 하지 않으면 변경이 거듭될수록 복잡도가 증가한다는 법칙이다.
- 피드백 시스템의 법칙 — 진화 과정은 다단계·다중 피드백 시스템이므로 개선하려면 피드백을 고려해야 한다는 법칙이다.
- 지속적 변경의 법칙 — 사용 중인 시스템은 계속 변경되지 않으면 점점 쓸모가 줄어든다는 법칙이다.
S
| a | b |
|---|---|
| 1 | 가 |
| 2 | 나 |
| 3 | 다 |
| c | d |
|---|---|
| 나 | X |
| 다 | Y |
| 라 | Z |
SELECT S.a, S.b, T.d FROM S LEFT JOIN T ON S.b = T.c




옳지 않은 것은 fork() 호출 시 부모와 자식 프로세스가 같은 메모리 위치를 차지한다는 설명이다.
fork()로 생성된 자식은 부모의 주소 공간을 복사한 별도의 주소 공간을 가지므로, 한쪽의 변수 변경이 다른 쪽에 영향을 주지 않는다.
- fork()가 실행 중인 프로세스를 복사한다는 설명은 옳다.
- exec()가 새 프로세스를 만들지 않고 기존 프로세스 구조를 재활용해 다른 프로그램으로 교체한다는 설명은 옳다.
- wait()가 자식 프로세스의 종료를 기다리는 데 쓰인다는 설명은 옳다.
옳은 것은 뷰가 복잡한 질의를 간단하게 표현할 수 있게 한다는 설명이다.
뷰는 조인·조건이 들어간 질의를 이름 붙인 가상 테이블로 정의해, 이후 단순한 SELECT로 사용할 수 있게 하며 논리적 데이터 독립성도 제공한다.
- 뷰는 기반 테이블 구조가 바뀌어도 응용을 보호하는 논리적 독립성을 제공하므로, 독립성을 제공하지 않는다는 설명은 틀리다.
- 뷰를 제거할 때는 DELETE가 아니라 DROP VIEW 문을 쓴다.
- 동일한 데이터에 대해 목적에 따라 여러 개의 뷰를 만들 수 있다.
#include <stdio.h>
int C(int v) {
printf("%d ", v);
return 1;
}
int main() {
int a = -2;
int b = !a;
printf("%d %d %d %d ", a, b, a&&b, a||b);
if(b && C(10))
printf("A ");
if(b & C(20))
printf("B ");
return 0;
}출력 결과는 -2 0 0 1 20이다.
a=-2는 0이 아니므로 b=!a=0이고, a&&b=0, a||b=1이라 첫 printf는 -2 0 0 1을 출력한다.
b && C(10)은 단락 평가로 b가 0이면 C(10)을 호출하지 않는다. 반면 비트 연산 b & C(20)은 양쪽을 모두 평가하므로 C(20)이 20을 출력하고 1을 반환하지만, 0&1=0이라 B는 출력되지 않는다.