cheoljun.dev

혼공컴구

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

Computer Architecture
ID
43
status
Public
menu
Computer Science
submenu
React
tags
Computer Architecture
summary
혼자 공부하는 컴퓨터구조 + 운영체제 Chapter01 ~ Chapter08를 읽고 공부한 것을 기록합니다.
thumbnail
https://contents.kyobobook.co.kr/sih/fit-in/458x0/pdt/9791162243091.jpg
date
Apr 21, 2024
 

 

01. 컴퓨터 구조 시작하기

01-1. 컴퓨터 구조를 알아야 하는 이유

  • 컴퓨터 구조를 이해하면 문제 해결 능력 이 향상된다
  • 컴퓨터 구조를 이해하면 성능/용량/비용 을 고려하며 개발할 수 있다
즉, 컴퓨터 구조를 이해하면 입출력에만 집중하는 개발을 넘어 성능, 용량, 비용까지 고려하며 개발하는 개발자가 될 수 있다.
 

01-2. 컴퓨터 구조의 큰 그림

  • 컴퓨터 구조 지식은 크게 두 가지이다
      1. 컴퓨터가 이해하는 정보
          • 데이터: 컴퓨터와 주고받는 숫자, 문자, 이미지, 동영상과 같은 정보나 컴퓨터에 저장된 정보
          • 명령어: 데이터를 움직이고 컴퓨터를 실질적으로 동작시키는 정보
      1. 컴퓨터의 네 가지 핵심 부품
          • 중앙처리장치(CPU)
          • 주기억장치(메모리) → RAM, ROM
          • 보조기억장치
          • 입출력장치
 
💡
컴퓨터의 네 가지 핵심 부품에 대해 간략하게 알아보자
  1. 메모리: 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품
  1. CPU: 메모리에 저장된 명령어를 읽어 들이고, 해석하고, 실행하는 부품
      • 핵심 내부 구성 요소 세 가지
        • 산술논리연산장치(ALU, Arithmetic Logic Unit)
          • 계산만을 위해 존재하는 부품
        • 레지스터(Register)
          • CPU 내부의 작은 임시 저장 장치
        • 제어장치(CU, Control Unit)
          • 제어 신호(Control Signal)이라는 전기 신호를 내보내고 명령어를 해석하는 장치
  1. 보조기억장치: 전원이 꺼져도 보관할 프로그램을 저장하는 부품
      • 하드 디스크, SSD, USB메모리, DVD, CD-ROM 등
  1. 입출력장치: 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환할 수 있는 부품
 
💡
기타
  1. 시스템 버스: 컴퓨터의 네 가지 핵심 부품들이 서로 정보를 주고받는 통로
      • 주소 버스(address bus), 데이터 버스(data bus), 제어 버스(control bus)로 구성
  1. 메인보드: 여러 컴퓨터 부품을 부착할 수 있는 부품
      • 마더보드(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)라고 한다. 즉, 주소 지정 방식은 유효 주소를 찾는 방법이다.
 
주소 지정 방식에는 다섯가지 방식이다. 각각을 알아보자
 
  1. 즉시 주소 지정 방식(immediate addressing mode)
      • 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식
      • 앞서 언급했듯이 표현할 수 있는 데이터의 크기가 작아지는 단점이 있지만, 데이터를 메모리나 레지스터로부터 찾는 과정이 없어 빠름
  1. 직접 주소 지정 방식(direct addressing mode)
      • 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
      • 여전히 유효 주소를 표현할 수 있는 범위가 연산 코드의 비트 수만큼 줄어듦
  1. 간접 주소 지정 방식(indirect addressing mode)
      • 유효 주소의 주소를 오퍼랜드 필드에 명시하는 방식
      • 두 번의 메모리 접근이 필요하기 때문에 앞서 설명한 주소 지정 방식들보다 느림
  1. 레지스터 주소 지정 방식(register addressing mode)
    1. 💡
      때때로 데이터는 메모리 말고 레지스터에 저장된 경우도 있기 때문에 이 경우 레지스터 주소 지정 방식 또는 레지스터 간접 주소 지정 방식을 사용
      • 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방법
      • 하지만 직접 주소 지정 방식과 비슷한 문제를 가짐 → 표현할 수 있는 레지스터 크기에 제한이 생김
  1. 레지스터 간접 주소 지정 방식(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개의 레지스터에 대해 알아보자.
 
  1. 프로그램 카운터
  1. 명령어 레지스터
  1. 메모리 주소 레지스터
  1. 메모리 버퍼 레지스터
  1. 플래그 레지스터
  1. 범용 레지스터
  1. 스택 포인터
  1. 베이스 레지스터
 

프로그램 카운터

  • PC(Program Counter)
  • 프로그램 카운터를 명령어 포인터(IP, Instruction Pointer)라고 부르는 CPU도 있다
  • 메모리에서 가져올 명령어의 주소, 즉 메모리에서 읽어 들일 명령어의 주소를 저장함
 

명령어 레지스터

  • IR(Instruction Register)
  • 해석할 명령어, 즉 방금 메모리에서 읽어 들인 명령어를 저장하는 레지스터
  • 제어장치는 명령어 레지스터 속 명령어를 받아들이고 이를 해석한 뒤 제어 신호를 내보냄
 

메모리 주소 레지스터

  • MAR(Memory Address Register)
  • 메모리의 주소를 저장하는 레지스터
  • CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 메모리 주소 레지스터를 거침
 

메모리 버퍼 레지스터

  • MBR(Memory Buffer Register)
  • 메모리 데이터 레지스터(MDR, Memory Data Register)라고도 불림
  • 메모리와 주고받을 값(데이터와 명령어)을 저장하는 레지스터
  • CPU가 데이터 버스로 주고받을 값은 메모리 버퍼 레지스터를 거침
 

플래그 레지스터

 

범용 레지스터

 

스택 포인터

 

베이스 레지스터

 
 

04-3. 명령어 사이클과 인터럽트

 
 
 

 

05. CPU 성능 향상 기법

 
 
 
 

 

06. 메모리와 캐시 메모리

 
 
 
 
 
 

 

07. 보조기억장치

 
 
 
 
 
 
 
 

 

08. 입출력장치

 
 
Cheoljun Park
Fullstack Developer

구현 과정과 트러블슈팅, 배운 것들을 기록합니다.

댓글