인터프리터 방식이 아닌 언어는 C이다.
C는 소스 전체를 기계어로 미리 번역하는 컴파일러 방식 언어이고, 인터프리터 방식은 소스를 한 줄씩 해석하며 바로 실행한다.
- JavaScript: 브라우저 등 실행 환경이 소스를 해석해 실행하는 인터프리터 방식 언어이다.
- Basic: 대표적인 초기 인터프리터 방식 언어이다.
- LISP: 대화형 인터프리터 환경에서 실행되는 것이 전통적인 방식이다.
라운드 로빈이 FIFO보다 높은 처리량을 제공한다는 설명이 옳지 않다.
라운드 로빈은 응답 시간 공정성을 위한 방식으로, 잦은 문맥 교환 오버헤드 때문에 처리량은 오히려 FIFO보다 같거나 낮아지기 쉽다.
- 선점 스케줄링: 시간 할당량이 끝나면 CPU를 빼앗아 다음 프로세스에 넘기므로 선점형이다.
- 일정 시간 할당: 모든 프로세스에 동일한 시간 할당량을 순서대로 준다.
- 작은 시간 할당량: 교체가 잦아져 문맥 교환 횟수와 오버헤드가 늘어난다.
병렬처리 성능 향상의 한계를 지적한 법칙은 암달의 법칙이다.
프로그램에서 병렬화할 수 없는 순차 부분의 비율이 전체 속도 향상의 상한을 결정하므로, 프로세서 수를 아무리 늘려도 개선에 한계가 있다.
- 무어의 법칙: 집적회로의 트랜지스터 수가 일정 주기로 두 배씩 늘어난다는 경험 법칙이다.
- 구스타프슨의 법칙: 문제 크기를 함께 키우면 프로세서 수에 비례해 성능을 높일 수 있다는, 오히려 낙관적인 주장이다.
- 폰노이만 아키텍처: 프로그램과 데이터를 같은 메모리에 저장하는 내장 프로그램 방식의 컴퓨터 구조로, 법칙이 아니다.
순환 대기 조건에서 마지막 프로세스가 자원을 대기하지 않는다는 설명이 옳지 않다.
순환 대기는 대기 체인이 고리를 이루는 상태로, 마지막 프로세스는 첫 번째 프로세스가 점유한 자원을 대기해야 순환이 성립한다.
- 상호 배제: 비공유 자원은 한 번에 한 프로세스만 사용할 수 있다는 올바른 설명이다.
- 점유와 대기: 자원을 쥔 채 다른 프로세스의 자원을 추가로 기다린다는 올바른 설명이다.
- 비선점: 할당된 자원을 강제로 빼앗을 수 없다는 올바른 설명이다.
한 사이클에 여러 명령어를 동시에 처리하도록 설계한 구조는 슈퍼스칼라이다.
슈퍼스칼라는 여러 개의 파이프라인을 두고 하드웨어가 독립적인 명령어들을 찾아 같은 사이클에 동시에 발행·실행한다.
- 분기 예측: 분기 결과를 미리 예측해 파이프라인 지연을 줄이는 기법으로, 동시 처리 구조가 아니다.
- VLIW: 컴파일러가 여러 연산을 하나의 긴 명령어로 묶어 두는 방식으로, 병렬성 추출을 하드웨어가 아닌 컴파일러가 맡는다.
- SIMD: 하나의 명령어로 여러 데이터를 동시에 처리하는 데이터 병렬 구조이다.
평균 기억장치 접근시간은 46ns이다.
캐시 적중 시에는 캐시 접근시간, 실패 시에는 주기억장치 접근시간이 걸린다고 보고 적중률로 가중 평균한다.
입력형식이 부호·코드화된 숫자·문자·기호라는 설명은 디지털 컴퓨터의 특징이므로 옳지 않다.
아날로그 컴퓨터는 전압·전류·온도처럼 연속적으로 변하는 물리량을 입력으로 받는다.
- 곡선·그래프 출력: 연속량을 다루므로 결과도 곡선이나 그래프 형태로 나타난다.
- 미적분 연산: 연속 신호를 직접 적분·미분하므로 처리 속도가 빠르다.
- 증폭회로 구성: 연산증폭기 등 증폭회로로 회로를 구성한다.
RAID-4를 비트 단위로 분할 저장하는 방식이라고 한 설명이 옳지 않다.
RAID-4는 데이터를 블록 단위로 스트라이핑하고 별도의 패리티 전용 디스크를 두는 방식이며, 비트·바이트 단위 분할은 RAID-2·RAID-3의 특징이다.
- RAID-0: 스트라이핑만 하고 중복 저장이나 오류 교정이 없다.
- RAID-1: 같은 데이터를 두 디스크에 복제하는 미러링으로 신뢰도가 높다.
- RAID-5: 패리티 정보를 모든 디스크에 분산 기록해 패리티 디스크 병목을 없앤다.
int func (int n) { //재귀 함수
if (n == 0)
return 1;
else
return n * func (n - 1);
}
int iter_func (int n) { //반복 함수
int f = 1;
while ( ㉠ )
㉡
return f;
}빈칸에는 n > 0과 f = f * n--;가 들어간다.
재귀 함수는 n × (n−1) × … × 1, 즉 n!을 계산한다. 반복 함수는 f = 1에서 출발해 n이 0보다 큰 동안 f에 n을 곱하고 n을 1씩 줄이면 같은 결과가 된다. 예를 들어 n = 3이면 f는 3, 6, 6으로 변하고 n이 0이 되어 반복이 끝난다.
- n < 0과 f = f * n--;의 조합은 양수 n에서 반복문이 한 번도 실행되지 않아 항상 1을 반환한다.
- n < 0과 f = f * n++;의 조합도 양수 n에서 조건이 처음부터 거짓이라 항상 1을 반환한다.
- n > 0과 f = f * n++;의 조합은 n이 계속 커져 0에 도달하지 않으므로 반복이 끝나지 않는다.
크롤링으로 얻은 웹문서의 텍스트를 정형 데이터라고 한 설명이 옳지 않다.
웹문서 텍스트는 고정된 스키마가 없는 대표적인 비정형 데이터이다.
- XML 센서 데이터: 태그로 구조를 표현하므로 반정형 데이터로 분류된다.
- 반정형 데이터의 메타데이터: 태그·키처럼 데이터 구조를 설명하는 정보를 데이터 안에 포함한다.
- NoSQL·Hadoop: 스키마가 유연하고 분산 처리가 가능해 대규모 비정형 데이터 처리에 적합하다.
다중 프로그래밍 정도가 높을수록 스래싱이 증가한다는 설명이 옳다.
동시에 적재된 프로세스가 많아지면 프로세스당 프레임이 부족해져 페이지 부재가 급증하고, 실행보다 페이지 교체에 더 많은 시간을 쓰게 된다.
- 부재율이 크면 스래싱이 적다: 부재율이 클수록 스래싱이 많이 일어난다.
- 둘은 무관하다: 스래싱은 높은 페이지 부재율 때문에 발생하므로 밀접하게 관련된다.
- 스래싱이 많으면 부재율 감소: 스래싱이 심한 상태는 부재율이 높은 상태이다.
공급사슬 전체의 기능 통합과 최적화를 지향하는 시스템은 SCM이다.
SCM은 자재 조달부터 생산·판매·유통까지 기업 간 공급사슬의 흐름을 통합 관리한다.
- ERP: 기업 내부의 인사·재무·생산 등 자원을 통합 관리하는 시스템이다.
- EDI: 기업 간 거래 문서를 표준 형식으로 전자 교환하는 기술이다.
- KMS: 조직 내 지식을 축적·공유하는 지식관리 시스템이다.
SMTP를 데이터링크 계층에 연결한 것이 옳지 않다.
SMTP는 전자우편 전송 프로토콜로 TCP/IP의 응용 계층에 속한다.
- HTTP: 웹 서비스를 위한 응용 계층 프로토콜이다.
- IP: 주소 지정과 라우팅을 담당하는 네트워크(인터넷) 계층 프로토콜이다.
- UDP: 비연결형 전송을 제공하는 전송 계층 프로토콜이다.
<SQL 질의문>
SELECT SNO, NAME
FROM STUDENT
WHERE AGE>20;




동일한 관계대수식은 이다.
WHERE 절의 조건은 행을 고르는 셀렉트(σ)에, SELECT 절의 열 목록은 열을 고르는 프로젝트(π)에 대응한다. 먼저 AGE가 20보다 큰 행을 고른 뒤 SNO와 NAME 열만 남겨야 한다.
- 는 σ의 첨자에 속성 목록을, π의 첨자에 조건식을 두어 두 연산자의 역할이 뒤바뀌었다.
- 는 먼저 SNO, NAME만 남겨 AGE 속성이 사라진 뒤 조건을 평가하므로 성립하지 않는다.
- 는 π와 σ의 첨자가 모두 뒤바뀐 식이다.
설명에 해당하는 OSI 계층은 전송 계층이다.
전송 계층은 종단 간 흐름제어·오류제어를 수행하며, TCP 같은 연결형과 UDP 같은 비연결형 두 운용 모드를 제공한다.
- 데이터링크 계층: 인접한 노드 사이의 프레임 전송과 오류 제어를 담당한다.
- 네트워크 계층: 경로 선택과 논리 주소 지정을 담당한다.
- 응용 계층: 사용자에게 네트워크 서비스를 제공하는 최상위 계층이다.
Kotlin을 게임 개발 전용 언어라고 한 설명이 옳지 않다.
Kotlin은 JetBrains가 만든 JVM 기반의 범용 언어로, Java와 호환되며 안드로이드 공식 개발 언어로 널리 쓰인다.
- C#: 마이크로소프트 닷넷 프레임워크를 지원하는 객체지향 언어이다.
- Python: 인터프리터 방식이며 실행 시점에 타입이 정해지는 동적 타이핑 언어이다.
- Java: 바이트코드로 컴파일된 뒤 JVM에서 실행되므로 플랫폼에 독립적이다.
동적 관점의 도구가 아닌 것은 자료 흐름도(DFD)이다.
자료 흐름도는 데이터가 어떤 처리 과정을 거쳐 변환되는지를 나타내는 기능 관점의 도구이다.
- 사건 추적도: 시간 순서에 따른 객체 간 사건 흐름을 표현하는 동적 관점 도구이다.
- 상태 변화도: 사건에 따라 시스템 상태가 바뀌는 과정을 표현하는 동적 관점 도구이다.
- 페트리넷: 병행 시스템의 상태와 사건 발생을 모델링하는 동적 관점 도구이다.
- 송신측: 첫 번째 비트가 1로 시작하는 임의의 n+1비트의 제수를 결정한다. 그리고 전송하고자 하는 데이터 끝에 n비트의 0을 추가한 후 제수로 모듈로-2 연산을 한다. 그러면 n비트의 나머지가 구해지는데 이 나머지가 중복 정보가 된다.
- 수신측: 계산된 중복 정보를 데이터와 함께 전송하면 수신측에서는 전송받은 정보를 동일한 n+1제수로 모듈로-2 연산을 한다. 나머지가 0이면 오류가 없는 것으로 판단하고, 나머지가 0이 아니면 오류로 간주한다.
설명된 방법은 순환 중복 검사(CRC)이다.
CRC는 데이터 뒤에 n비트의 0을 붙여 n+1비트 생성 다항식(제수)으로 모듈로-2 나눗셈을 하고, 그 나머지를 중복 정보로 덧붙여 보낸다. 수신측은 같은 제수로 나누어 나머지가 0인지로 오류를 판단한다.
- 수직 중복 검사는 문자 단위로 패리티 비트 하나를 붙이는 방식이다.
- 세로 중복 검사는 데이터 블록의 같은 위치 비트끼리 패리티를 계산해 패리티 행을 붙이는 방식이다.
- 체크섬은 데이터를 일정 단위로 더한 합(보수)을 검사값으로 쓰는 방식으로, 모듈로-2 나눗셈을 쓰지 않는다.

삭제·대치 후 41의 왼쪽 자식 노드는 37이다.
28의 오른쪽 서브트리(43을 루트로 하는 부분)에서 가장 작은 원소는 왼쪽 끝까지 내려간 30이다. 30이 28 자리로 올라가면, 30이 있던 자리(41의 왼쪽)에는 30의 오른쪽 서브트리인 37(왼쪽 자식 32)이 연결된다.
- 13은 루트 노드로 삭제 과정에서 위치가 바뀌지 않는다.
- 17은 28 자리에 들어온 30의 왼쪽 자식으로 그대로 남는다.
- 32는 37의 왼쪽 자식으로 남으므로 41의 직접 자식이 아니다.
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<errno.h>
#include<sys/wait.h>
int main(void) {
int i=0, v=1, n=5;
pid_t pid;
pid = fork();
if( pid < 0 ) {
for(i=0; i<n; i++) v+=(i+1);
printf("c = %d ", v);
} else if( pid == 0 ) {
for(i=0; i<n; i++) v*=(i+1);
printf("b = %d ", v);
} else {
wait(NULL);
for(i=0; i<n; i++) v+=1;
printf("a = %d ", v);
}
return 0;
}
출력 결과는 b = 120 다음에 a = 6이 찍힌다.
fork()가 성공하면 자식 프로세스는 pid로 0을, 부모 프로세스는 자식의 PID(양수)를 받는다. 자식은 v = 1에 1, 2, 3, 4, 5를 차례로 곱해 120을 출력한다.
부모는 wait(NULL)로 자식이 끝날 때까지 기다린 뒤, 자신의 v = 1에 1을 다섯 번 더해 6을 출력한다. 두 프로세스는 변수를 따로 가지므로 자식의 계산이 부모의 v에 영향을 주지 않는다.
- c = 16과 b = 120을 함께 출력하는 경우는 없다. c를 출력하는 분기는 fork()가 실패해 음수를 반환할 때만 실행되므로, 생성 성공을 가정한 이 문항에서는 출력되지 않는다.
- b = 120 다음에 c = 16이 출력된다는 것도 같은 이유로 틀리다. 부모 프로세스는 pid가 양수이므로 a를 출력하는 분기로 간다.
- a = 6과 c = 16의 조합은 자식의 출력 b = 120이 빠지고, 실행되지 않는 c 분기가 들어가 있어 틀리다.