혼공컴구
혼자 공부하는 컴퓨터구조 + 운영체제 Chapter01 ~ Chapter08를 읽고 공부한 것을 기록합니다.

01. 컴퓨터 구조 시작하기01-1. 컴퓨터 구조를 알아야 하는 이유01-2. 컴퓨터 구조의 큰 그림02. 데이터02-1. 0과 1로 숫자를 표현하는 방법02-2. 0과 1로 문자를 표현하는 방법03. 명령어03-1. 소스 코드와 명령어고급 언어와 저급 언어컴파일 언어와 인터프리터 언어03-2. 명령어의 구조연산 코드와 오퍼랜드주소 지정 방식04. CPU의 작동 원리04-1. ALU와 제어장치ALU제어장치04-2. 레지스터프로그램 카운터명령어 레지스터메모리 주소 레지스터메모리 버퍼 레지스터플래그 레지스터범용 레지스터스택 포인터베이스 레지스터04-3. 명령어 사이클과 인터럽트05. CPU 성능 향상 기법06. 메모리와 캐시 메모리07. 보조기억장치08. 입출력장치
01. 컴퓨터 구조 시작하기
01-1. 컴퓨터 구조를 알아야 하는 이유
- 컴퓨터 구조를 이해하면 문제 해결 능력 이 향상된다
- 컴퓨터 구조를 이해하면 성능/용량/비용 을 고려하며 개발할 수 있다
즉, 컴퓨터 구조를 이해하면 입출력에만 집중하는 개발을 넘어 성능, 용량, 비용까지 고려하며 개발하는 개발자가 될 수 있다.
01-2. 컴퓨터 구조의 큰 그림
- 컴퓨터 구조 지식은 크게 두 가지이다
- 컴퓨터가 이해하는 정보
- 데이터: 컴퓨터와 주고받는 숫자, 문자, 이미지, 동영상과 같은 정보나 컴퓨터에 저장된 정보
- 명령어: 데이터를 움직이고 컴퓨터를 실질적으로 동작시키는 정보
- 컴퓨터의 네 가지 핵심 부품
- 중앙처리장치(CPU)
- 주기억장치(메모리) → RAM, ROM
- 보조기억장치
- 입출력장치
컴퓨터의 네 가지 핵심 부품에 대해 간략하게 알아보자
- 메모리: 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품
- CPU: 메모리에 저장된 명령어를 읽어 들이고, 해석하고, 실행하는 부품
- 핵심 내부 구성 요소 세 가지
- 산술논리연산장치(ALU, Arithmetic Logic Unit)
- 계산만을 위해 존재하는 부품
- 레지스터(Register)
- CPU 내부의 작은 임시 저장 장치
- 제어장치(CU, Control Unit)
- 제어 신호(Control Signal)이라는 전기 신호를 내보내고 명령어를 해석하는 장치
- 보조기억장치: 전원이 꺼져도 보관할 프로그램을 저장하는 부품
- 하드 디스크, SSD, USB메모리, DVD, CD-ROM 등
- 입출력장치: 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환할 수 있는 부품
기타
- 시스템 버스: 컴퓨터의 네 가지 핵심 부품들이 서로 정보를 주고받는 통로
- 주소 버스(address bus), 데이터 버스(data bus), 제어 버스(control bus)로 구성
- 메인보드: 여러 컴퓨터 부품을 부착할 수 있는 부품
- 마더보드(mother board)라고도 부름
02. 데이터
02-1. 0과 1로 숫자를 표현하는 방법
- 비트는 0과 1로 표현할 수 있는 가장 작은 정보 단위이다
- 참고로 1KB는 1,024byte, 1MB는 1,204KB와 같이 1,024개로 묶어 표현한 단위는 KiB, MiB, GiB, TiB이다
1바이트(1byte) | 8비트(8bit) |
1킬로바이트(1KB) | 1,000바이트(1,000byte) |
1메가바이트(1MB) | 1,000킬로바이트(1,000KB) |
1기가바이트(1GB) | 1,000메가바이트(1,000MB) |
1테라바이트(1TB) | 1,000기가바이트(1,000GB) |
- 이진법은 1을 넘어가는 시점에서 자리 올림을 하여 0과 1만으로 수를 표현하는 방법이다
- 이진법에서 음수는 2의 보수로 표현할 수 있다
- 0이나 2ⁿ 형태는 2의 보수를 취하면 원하는 음수값을 얻을 수 없다
- 십육진법(16진법) 은 15를 넘어가는 시점에 자리 올림하여 수를 표현하는 방법이다
02-2. 0과 1로 문자를 표현하는 방법
- 컴퓨터가 인식하고 표현할 수 있는 문자의 모음을 문자 집합이라고 한다
- 문자를 0과 1로 변환하는 과정을 문자 인코딩이라 한다
- 반대로 0과 1로 이루어진 문자 코드를 사람이 이해할 수 있는 문자로 변환하는 과정을 문자 디코딩이라 한다
- 아스키 문자 집합에 0부터 127까지의 수가 할당되어 아스키 코드로 인코딩 된다
- EUC-KR은 한글을 2바이트 크기로 인코딩할 수 있는 완성형 인코딩 방식이다
- 유니코드는 여러 나라의 문자들을 광범위하게 표현할 수 있는 통일된 문자 집합이며, UTF-8, UTF-16, UTF-32는 유니코드 문자의 인코딩 방식이다
03. 명령어
03-1. 소스 코드와 명령어
고급 언어와 저급 언어
- C, C++, Java, Python과 같은 프로그래밍 언어는 사람이 이해하고 작성하기 쉽게 만들어진 언어이다. 이를 고급 언어(High-level programming language)라고 한다
- 컴퓨터가 직접 이해하고 실행할 수 있는 언어를 저급 언어(Low-level programming language)라고 한다
- 저급 언어는 명령어로 이루어짐
- 종류
- 기계어
- 어셈블리어
컴파일 언어와 인터프리터 언어
- 컴파일 언어
- 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 언어
- 인터프리터 언어
- 인터프리터에 의해 소스 코드가 한 줄씩 저급 언어로 변환되어 실행되는 언어
- 컴파일 언어 vs 인터프리터 언어
- 컴파일 언어가 인터프리터 언어보다 빠르다
03-2. 명령어의 구조
연산 코드와 오퍼랜드
- 연산 코드(operation code)
- 명령어가 수행할 연산
- 종류
- 데이터 전송(MOVE, STORE, LOAD(FETCH), PUSH, POP)
- 산술/논리 연산(ADD, SUBTRACT, MULTIPLY, DIVIDE, INCREMENT, DECREMENT, AND, OR, NOT, COMPARE)
- 제어 흐름 변경(JUMP, CONDITIONAL JUMP, HALT, CALL, RETURN)
- 입출력 제어(READ(INPUT), WRITE(OUTPUT), START IO, TEST IO)
- 연산자
- 오퍼랜드(operand)
- 연산에 사용할 데이터 or 데이터가 저장된 위치
- 다만 숫자나 문자와 같이 연산에 사용할 데이터를 직접 명시하기 보다는 데이터가 저장된 위치, 즉 메모리 주소나 레지스터 이름이 담김 → 이런 이유로 오퍼랜드 필드를 주소필드라고 부르기도 함
- 오퍼랜드가 하나도 없는 명령어를 0-주소 명령어, 하나인 명령어를 1-주소 명령어, 두개인 명령어를 2-주소 명령어, 세 개인 명령어를 3-주소 명령어라고 함
- 피연산자
주소 지정 방식
앞서 오퍼랜드 필드에는 메모리나 레지스터의 주소를 담아서 주소 필드라고 부르기도 한다고 하였다. 하지만 왜 연산 코드에 사용될 데이터 대신 주소를 담을까? 그 이유를 알아보자.
오퍼랜드 필드 개수에 따라 0-주소 명령어, 1-주소 명령어, 2-주소 명령어, 3-주소 명령어로 나뉜다고 하였다. 이 때 명령어에서 연산 필드를 제외하면 각 주소 명령어 마다 오퍼랜드 크기는 달라진다. 예를 들어 명령어의 크기가 16비트, 연산 코드 필드가 4비트라면 2-주소 명령어에서 오퍼랜드 필드는 개당 6비트가 남는다. 3-주소 명령어라면 오퍼랜드 필드당 4비트가 남는다.
따라서 데이터 대신 주소를 담는다면 주소에 저장할 수 있는 크기만큼 데이터를 저장할 수 있다.
연산 코드에 사용할 데이터가 저장된 위치, 즉 연산의 대상이 되는 데이터가 저장된 위치를 유효 주소(effective address)라고 한다. 오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방법을 주소 지정 방식(addressing mode)라고 한다. 즉, 주소 지정 방식은 유효 주소를 찾는 방법이다.
주소 지정 방식에는 다섯가지 방식이다. 각각을 알아보자
- 즉시 주소 지정 방식(immediate addressing mode)
- 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식
- 앞서 언급했듯이 표현할 수 있는 데이터의 크기가 작아지는 단점이 있지만, 데이터를 메모리나 레지스터로부터 찾는 과정이 없어 빠름
- 직접 주소 지정 방식(direct addressing mode)
- 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
- 여전히 유효 주소를 표현할 수 있는 범위가 연산 코드의 비트 수만큼 줄어듦
- 간접 주소 지정 방식(indirect addressing mode)
- 유효 주소의 주소를 오퍼랜드 필드에 명시하는 방식
- 두 번의 메모리 접근이 필요하기 때문에 앞서 설명한 주소 지정 방식들보다 느림
- 레지스터 주소 지정 방식(register addressing mode)
- 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방법
- 하지만 직접 주소 지정 방식과 비슷한 문제를 가짐 → 표현할 수 있는 레지스터 크기에 제한이 생김
때때로 데이터는 메모리 말고 레지스터에 저장된 경우도 있기 때문에 이 경우 레지스터 주소 지정 방식 또는 레지스터 간접 주소 지정 방식을 사용
- 레지스터 간접 주소 지정 방식(register indirect addressing mode)
- 연산에 사용할 데이터는 메모리에 저장하고, 그 유효 주소를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방식
- 메모리에 접근하는 횟수가 한 번으로 줄어듦
- 따라서 간접 주소 지정 방식보다 빠름
04. CPU의 작동 원리
04-1. ALU와 제어장치
ALU
- 받아들이는 정보
- ALU는 레지스터를 통해 피연산자를 받아들이고, 제어장치로부터 수행할 연산을 알려주는 제어신호를 받아들인다
- 내보내는 정보
- 연산을 수행한 결과는 특정 숫자나 문자, 혹은 메모리 주소가 될 수 있다
- 이 결과값을 바로 메모리에 저장하지 않고 일시적으로 레지스터에 저장한다
- ALU는 계산 결과와 더불어 플래그를 내보낸다 → 플래그 레지스터에 저장
플래그 종류 | 의미 | 사용 예시 |
부호 플래그 | 연산한 결과의 부호를 나타냄 | 부호 플래그가 1일 경우 계산 결과는 음수, 0일 경우 계산 결과는 양수를 의미 |
제로 플래그 | 연산 결과가 0인지 여부를 나타냄 | 제로 플래그가 1일 경우 연산 결과는 0, 0일 경우 연산 결과는 0이 아님을 의미 |
캐리 플래그 | 연산 결과 올림수나 빌림수가 발생했는지를 나타냄 | 캐리 플래그가 1일 경우 올릶수나 빌림수가 발생했음을 의미, 0일 경우 발생하지 않았음을 의미 |
오버플로우 플래그 | 오버플로우가 발생했는지를 나타냄 | 오버플로우 플래그가 1일 경우 오버플로우가 발생했음을 의미, 0일 경우 발생하지 않았음을 의미 |
인터럽트 플래그 | 인터럽트가 가능한지를 나타냄 | 인터럽트 플래그가 1일 경우 인터럽트가 가능함을 의미, 0일 경우 인터럽트가 불가능함을 의미 |
슈퍼바이저 플래그 | 커널 모드로 실행 중인지, 사용자 모드로 실행 중인지를 나타냄 | 슈퍼바이저 플래그가 1일 경우 커널 모드로 실행 중임을 의미, 0일 경우 사용자 모드로 실행 중임을 의미 |
제어장치
- 제어 신호를 내보내고, 명령어를 해석하는 부품
- 제어 신호란 컴퓨터 부품들을 관리하고 작동시키기 위한 일종의 전기 신호
- 제어장치는 CPU 제조사마다 제어장치의 구현 방식이나 명령어를 해석하는 방식, 받아들이고 내보내는 정보에는 조금씩 차이가 있음
- 제어장치는 클럭, 현재 수행할 명령어, 플래그, 제어 신호를 받아들임
04-2. 레지스터
상용화된 CPU 속 레지스터들은 CPU 마다 이름, 크기, 종류가 매우 다양해서 모두 다룰 수는 없지만, 여러 전공 서적에서 중요하게 다루는 8개의 레지스터에 대해 알아보자.
- 프로그램 카운터
- 명령어 레지스터
- 메모리 주소 레지스터
- 메모리 버퍼 레지스터
- 플래그 레지스터
- 범용 레지스터
- 스택 포인터
- 베이스 레지스터
프로그램 카운터
- PC(Program Counter)
- 프로그램 카운터를 명령어 포인터(IP, Instruction Pointer)라고 부르는 CPU도 있다
- 메모리에서 가져올 명령어의 주소, 즉 메모리에서 읽어 들일 명령어의 주소를 저장함
명령어 레지스터
- IR(Instruction Register)
- 해석할 명령어, 즉 방금 메모리에서 읽어 들인 명령어를 저장하는 레지스터
- 제어장치는 명령어 레지스터 속 명령어를 받아들이고 이를 해석한 뒤 제어 신호를 내보냄
메모리 주소 레지스터
- MAR(Memory Address Register)
- 메모리의 주소를 저장하는 레지스터
- CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 메모리 주소 레지스터를 거침
메모리 버퍼 레지스터
- MBR(Memory Buffer Register)
- 메모리 데이터 레지스터(MDR, Memory Data Register)라고도 불림
- 메모리와 주고받을 값(데이터와 명령어)을 저장하는 레지스터
- CPU가 데이터 버스로 주고받을 값은 메모리 버퍼 레지스터를 거침


댓글