[CS] #1 Computer Science
컴퓨터 공학 문제 오답 위주로 정리한 내용입니다.
컴퓨터 하드웨어에는 Output Device, Input Device,Storage가 속한다.
Operating System는 소프트웨어의 한 종류이다.
주기억장치에는 레지스터, SRAM, DRAM, ROM이 속하고, 보조기억장치에는 하드 디스크, USB memory, SSD, Bluray가 속한다.
양자컴퓨터는 양자의 기본 성질인 중첩, 얽힘 등을 이용하여 다수의 정보를 처리할 수 있는 새로운 개념의 컴퓨터이다. 현재 나노공정 설계로 제작되는 반도체 칩의 한계를 극복하기 위해 등장하였다. 양자컴퓨터는 큐비트(qubit)를 기준으로 하는 양자 병렬처리를 통해 엄청나게 빠른 속도로 문제 해결이 가능하다. 양자컴퓨터는 현재 양산 가능한 형태로 기술이 개발되어 있지 않다.
8bit는 1byte이며 64bit architecture에서 워드의 길이는 64bit이다. 1바이트의 가장 큰 자리수를 담당하는 비트를 MSB라고 부른다. 4bit는 1nibble이다.
주어진 부울 식 (BC' + A'D)(AB' + CD')을 부울 대수를 이용하여 간략화 시킨 결과는 0이다. (X * X' = 0)인 점을 고려
SR flip-flop은 Set-Reset 플립플롭으로서, S (Set) 입력과 R (Reset) 입력을 사용하여 특정 상태를 설정하거나 초기화하는데 사용된다. D flip-flop은 데이터(D) 플립플롭으로서, 하나의 입력 데이터(D)를 저장하고 출력으로 전달하는데 사용된다. JK flip-flop은 JK 플립플롭은 Set-Reset 플립플롭에 대한 확장으로서, 입력이 특정 조합일 때 Set 또는 Reset이 가능하도록 확장된 플립플롭이다. F flip-flop은 플립플롭의 종류가 아니다.
Instruction Pipeline은 CPU의 성능 향상을 위해 사용되는 기술로, 명령어를 여러 단계로 분할하여 병렬적으로 실행하는 방식을 지칭한다.
"rotate"는 레지스터 내용을 왼쪽이나 오른쪽으로 회전시키는 연산이므로 일반적으로 레지스터 마이크로 연산으로 취급되지 않는다. 레지스터 마이크로 연산에는 "load" (데이터 로드), "store" (데이터 저장), "add" (덧셈), "substract" (뺄셈), "increment" (증가), "decrement" (감소), "clear" (레지스터 초기화) 등이 포함된다.
레지스터들을 직접 연결 하면 장치 수의 제곱에 비례하는 복잡도가 발생한다. Common Bus line을 이용해서 레지스터들을 연결하면 MUX를 이용해서 손쉽게 구현할 수 있고, 레지스터들을 연결할 때 Decoder를 이용해서 구현할 수 있다. 하지만 CPU 디자인과 관련하여 내부 스택 구조는 주로 CPU의 레지스터나 명령어 실행과 같은 다른 부분과는 관련이 없다. CPU 디자인에서 스택 구조는 주로 메모리 계층 구조(Memory Hierarchy)에서 데이터나 명령어를 보관하고 가져오는 데 사용됩니다. 내부 스택 구조를 사용하는 것은 특정한 용도의 CPU나 임베디드 시스템에서 특별히 필요한 경우에만 선택적으로 사용될 수 있습니다. 따라서, 내부 스택 구조를 활용하여 Buffer와 같이 순차적 처리를 요하는 자료를 대기하게 만든다는 설명은 CPU 디자인과 일반적으로 관련이 없으므로 맞지 않는 설명입니다.
마이크로 연산은 ALU (산술 논리 장치) 내부에서 수행되는 기본적인 연산들을 의미합니다. ADD는 덧셈 연산을 수행하는 마이크로 연산입니다. XOR는 배타적 논리합 (XOR) 연산을 수행하는 마이크로 연산입니다. INC는 증가 연산을 수행하는 마이크로 연산으로, 특정 값을 1씩 증가시킵니다. RTD는 일반적으로 ALU에서 사용되는 마이크로 연산이 아닙니다.
XOR 연산은 각 비트별로 수행되며, XOR 연산은 같은 비트 값이면 0, 다른 비트 값이면 1을 결과로 A가 0010 (2진수)이고 B가 1101 (2진수)인 경우 A XOR B = 1111 (2진수)의 결과가 나온다.
시프트 연산은 데이터를 비트 단위로 이동시키는데 사용되며, CPU나 마이크로프로세서에서 다양한 작업에 활용됩니다.
- 논리 왼쪽 시프트 (Logical Shift Left, LSL 또는 SHL): 데이터의 비트를 왼쪽으로 이동시키는 연산으로, 왼쪽으로 이동한 비트는 0으로 채워집니다.
- 논리 오른쪽 시프트 (Logical Shift Right, LSR 또는 SHR): 데이터의 비트를 오른쪽으로 이동시키는 연산으로, 오른쪽으로 이동한 비트는 0으로 채워집니다.
- 산술 오른쪽 시프트 (Arithmetic Shift Right, ASR): 데이터의 비트를 오른쪽으로 이동시키는 연산으로, 오른쪽으로 이동한 비트는 부호 비트로 채워집니다. 이 연산은 음수를 산술적으로 나누는데 유용합니다.
- 순환 오른쪽 시프트 (Rotate Right, ROR): 데이터의 비트를 오른쪽으로 이동시키는 연산으로, 오른쪽으로 이동한 비트는 왼쪽 끝으로 회전합니다. 이러한 연산은 순환 연산에 사용됩니다.
- 순환 왼쪽 시프트 (Rotate Left, ROL): 데이터의 비트를 왼쪽으로 이동시키는 연산으로, 왼쪽으로 이동한 비트는 오른쪽 끝으로 회전합니다. 이러한 연산은 순환 연산에 사용됩니다.
"데이터 전송 명령어" 또는 "무연산 명령어"는 컴퓨터 아키텍처에서 데이터를 이동하거나 로드, 스토어하는 명령어들이다.
- MOV (Move): 한 레지스터나 메모리의 내용을 다른 레지스터나 메모리에 복사합니다. 예를 들어, MOV R1, R2는 R2 레지스터의 내용을 R1 레지스터로 복사합니다.
- MOVZ/MOVK: 레지스터에 16비트 또는 32비트의 상수를 로드하는데 사용되는 명령어입니다. MOVZ는 비트를 0으로 채우고 로드하며, MOVK는 비트를 변경하지 않고 로드합니다.
- MOV R1, #150: 레지스터 R1에 값 150을 직접 저장하는 명령어입니다. '#' 기호는 즉시 값을 의미하며, R1에 150이 저장됩니다.
- MOV R1, R2: 레지스터 R2에 저장된 값을 레지스터 R1으로 복사하는 명령어입니다. R2에 있는 값이 R1으로 복사됩니다.
- MOV R1, 190: 190이라는 값이 R1 레지스터로 이동하는 명령어입니다. 이 경우에는 숫자가 바로 레지스터로 이동됩니다.
- MOV R1, @190: 주소 190에 있는 데이터를 R1 레지스터로 이동하는 명령어입니다. '@' 기호는 해당 주소를 의미하며, 주소 190에 있는 데이터가 R1으로 이동됩니다.
- LDR (Load Register): 메모리에서 데이터를 읽어와 레지스터에 저장합니다. 예를 들어, LDR R1, [R2]는 R2 레지스터가 가리키는 메모리 주소의 데이터를 R1 레지스터로 로드합니다.
- STR (Store Register): 레지스터의 데이터를 메모리에 저장합니다. 예를 들어, STR R1, [R2]는 R1 레지스터의 데이터를 R2 레지스터가 가리키는 메모리 주소에 저장합니다.
- LDRB/LDRH/LDRSB/LDRSH: 바이트 또는 반워드 크기의 데이터를 로드하는데 사용되는 명령어들로, LDRB는 바이트 크기 데이터를, LDRH는 반워드 크기 데이터를 로드합니다. LDRSB와 LDRSH는 부호 확장을 수행하며, 각각 바이트와 반워드 크기의 부호 있는 데이터를 로드합니다.
- STRB/STRH: 바이트 또는 반워드 크기의 데이터를 저장하는데 사용되는 명령어들로, STRB는 바이트 크기 데이터를, STRH는 반워드 크기 데이터를 저장합니다.
FGI는 "End of Input (EOI)"를 나타내는 플래그 비트로, Input 장치의 데이터를 준비할 수 없을 때 0, 데이터를 준비할 수 있을 때 1로 세팅됩니다.
FGI가 1일 때, CPU는 해당 I/O 장치가 데이터를 전송할 준비가 되었다고 인식하고 해당 데이터를 받을 준비를 합니다.
FGI의 상태가 바뀌더라도 INPR의 정보는 바뀌지 않습니다. FGI가 1일 때, CPU는 준비된 데이터를 가져오기 위해 INPR로부터 데이터를 읽어옵니다.
OUTR, AC, INPR, FGI는 모두 병렬로 연결되어 있습니다.
OUTR를 통해서 데이터가 output device로 전송됩니다.
IEN 방식은 플래그 비트를 사용하지 않고도 외부 장치가 준비되었을 때 interrupt를 발생시키는 방법을 말합니다. IEN 방식은 인터럽트를 활성화하거나 비활성화하는데 사용되며, 입출력 장치가 인터럽트를 요청하면 해당 인터럽트를 처리하고, 이후에 다른 인터럽트 요청을 받기 위해 인터럽트를 활성화한 상태를 유지합니다.
I/O program이 실행되면 ION instruction에 의해 IEN이 1로 세팅이 되며 프로그램으로 복귀합니다.
컴퓨터 소프트웨어는 크게 시스템 소프트웨어와 응용 소프트웨어로 나눌 수 있습니다.
운영체제, 프로그래밍 언어 번역 프로그램은 모두 시스템 소프트웨어에 해당합니다. 운영체제는 컴퓨터 시스템의 자원을 관리하고 사용자와 하드웨어 간의 인터페이스 역할을 하며, 프로그래밍 언어 번역 프로그램은 소스 코드를 기계어로 번역하여 실행 가능한 파일을 생성하는 역할을 합니다.
Device Driver와 DBMS는 Application이 아닌 시스템 소프트웨어에 해당합니다. Device Driver는 하드웨어 장치와 운영체제 간의 통신을 관리하며, DBMS는 데이터베이스를 관리하는 소프트웨어입니다.
일반적으로 사용하는 Web Browser, 메신저 프로그램, 오피스 프로그램은 모두 응용 소프트웨어에 속합니다. 이러한 프로그램들은 사용자의 작업을 지원하고, 특정 작업을 수행하기 위해 개발된 소프트웨어입니다.
C언어 같은 고급 언어를 이용하여 작성한 프로그램은 어셈블리 프로그램으로 변환됩니다. 고급 언어로 작성된 프로그램은 어셈블리 코드로 컴파일되어 목적 파일(Object file)로 생성됩니다.
어셈블리 프로그램은 mnemonic(기호)을 이용하여 명령어를 표시합니다. 어셈블리어는 기계어에 가까운 형태로, 각 명령어와 메모리 주소 등을 직접 표기하는 언어입니다.
어셈블리 언어는 컴퓨터 아키텍처에 따라 다양한 규칙과 문법을 가지며, 각각의 아키텍처에 맞게 어셈블리 코드를 작성해야 합니다.
최종 기계어로 번역된 프로그램이 실제 CPU에서 수행됩니다. 어셈블리 코드를 기계어로 변환한 후 CPU에서 실행되어 원하는 작업을 수행합니다.
소프트웨어 개발 패러다임의 구조적 기법은 가장 초창기에 사용한 기법으로 함수들을 기준으로 프로그램을 작성하였다.
소프트웨어 개발 패러다임의 객체지향 기법은 객체 단위로 프로그램을 단위화하여 캡슐화, 상속 등을 사용하여 재사용성을 가능하게 하였다.
소프트웨어 개발 패러다임의 컴포넌트 기법은 interface를 통하여 외부와 쉽게 동작할 수 있고, 단순하게 통신 할 수 있게 하였다.
분산객체 프레임워크는 분산 환경에서 객체 지향 기법을 사용하여 분산 시스템을 구축하고 관리하기 위한 기술입니다. 분산객체 프레임워크는 네트워크를 통해 분산된 컴퓨터들을 통합하여 하나의 시스템처럼 동작하도록 지원하며, 다른 위치에 있는 객체들끼리도 투명하게 상호작용할 수 있도록 해줍니다. 분산 시스템에서 다수의 컴퓨터들이 연결되어 통신하며, 이들을 하나의 시스템으로 통합하여 동작하게 하는 것이 주요 목표입니다.