책/이것이 취업을 위한 컴퓨터 과학이다.

Chapter 1. 컴퓨터 구조

에린_1 2024. 11. 19. 16:23
728x90

개발자에게 필요한 역량은 근거를 설명하는 능력이다.

  • 특정 코드 혹은 프로그램이 어떻게 작동하며, 왜 특정 성능을 내는지에 대한 근거를 제시하고 설명하는 능력이야 말로 AI 도구에 종속되지 않는 진짜 역량이다. 코드와 프로그램의 근거를 설명하는 능력은 상당 부분 컴퓨터 과학에서 찾을 수 있다.CHAPTER 01 기술 면접과 실무를 위한 컴퓨터 과학
  • 프로그램 개발의 목적은 일단 작동하게 만드는 것을 넘어 제대로 작동하게 만드는 것이다.
  • 프로그래밍 언어의 기초 문법이나 프레임워크/라이브러리의 기초 사용법은 단순한 프로그램을 개발하기에는 충분한 지식이지만, 그를 확장/유지보수 하거나 실행의 전 과정을 이해하는 데에는 충분하지 않은 경우가 많기 때문이다. 내가 작성한 코드의 실행 과정을 나조차 설명할 수 없는 경우에는 더 큰 어려움으로 다가오게 된다.
  • 뛰어난 개발자일수록 문제를 정의하고 해결할 수 있어야 한다. 문제를 정의하고 해결하는 역량은 프로그램의 실행을 제대로 이해하는 것, 어떠한 과정을 거쳐 프로그램이 실행되는지 설명하는 것부터 시작된다.

CHAPTER 02 컴퓨터 구조

  • 컴퓨터가 이해하는 정보는 데이터와 명령어이다. 명령어는 수행할 동작과 수행할 대상으로 이루어져 있고, 데이터는 숫자, 문자, 이미지와 같은 정적인 정보를 의미한다.
  • 데이터는 명령어에 종속적인 정보이며, 명령의 대상이자, 명령어의 재료라고 할 수 있다.
  • 명령어를 실행하는 주체는 CPU이다. 명령을 이해하고 실행하는 주체가 CPU라는 말은 CPU의 종류에 따라 실행 가능한 세부적인 명령어의 종류와 처리의 양상이 달라질 수 있음을 의미한다.
  • 컴퓨터의 핵심부품
    • CPU
    • 메모리
    • 캐시메모리
    • 보조기억장치
    • 입출력장치
  • CPU
    • 정보를 읽어들이고, 해석하고 실행하는 부품이다.
    • 산술논리연산장치
      • 사칙연산, 논리 연산 같이 연산을 수행할 회로로 구성되어 있는 일종의 계산기이다. CPU가 처리할 명령어를 실질적으로 연산하는 요소이다.
    • 제어장치
      • 명령어를 해석해 제어신호를 전기신호로 내보내는 장치이다. 제어신호란 부품을 작동시키기 위한 신호를 말한다.
    • 레지스터
      • CPU 내부의 작은 임시저장 장치로, 데이터와 명령어를 처리하는 과정의 중간값을 저장한다. CPU내에는 여러 개의 레지스터가 존재하며, 각기 다른 이름과 역할을 가지고 있다.
    • 이중 가장 중요한 구성요소는 레지스터이다. CPU가 처리하는 명령어는 반드시 레지스터에 저장되기 떄문에 레지스터 값만 잘 확인해도 프로그램이 어떻게 실행되는지 낮은 단계에서 파악할 수 있다.
  • 메모리와 캐시메모리
    • 메인 메모리는 RAM과 ROM이 있고, 일반적으로 메모리는 RAM을 지칭하는 경우가 많다. CPU가 읽어들이고, 해석하고, 실행중인 모든 정보는 어딘가에 저장되어 있어야 하며, 이 정보를 저장하는 장치가 메모리이다. 여기서 중요한 것은 실행중인 프로그램을 저장한다는 것이다. 프로그램이 실행되려면 그 프로그램을 이루는 데이터와 명령어가 메모리에 저장되어 있어야 한다.
    • 메모리와 관련해 기억해야 할 중요한 배경지식 중 하나는 주소라는 개념이고, 다른 하나는 휘발성이라는 개념이다. CPU가 메모리에 접근할 때 컴퓨터가 빠르게 작동하기 위해서 주소를 사용한다.
    • 휘발성은 전원이 공급되지 않을 때 저장하고 있는 정보가 지워지는 특성을 의미한다. 메모리는 휘발성 저장장치로, 메모리에 저장된 정보는 컴퓨터의 전원이 꺼지면 모두 삭제된다.
    • 캐시 메모리는 CPU가 조금이라도 더 빨리 메모리에 저장된 값에 접근하기 위해 사용되는 저장장치이다.
    • 보조기억장치는 전원이 꺼져도 저장된 정보가 사라지지 않는 비활성 저장장치이다.
    • 메모리가 현재 실행중인 프로그램을 저장한다면, 보조기억장치는 보관할 프로그램을 저장한다고 할 수 있다. 유의할 점은 CPU가 보조기억장치에 저장된 프로그램을 곧장 실행할 수 없다. 어떠한 프로그램을 실행하려면 보조기억장치에서 보관하고 있는 프로그램을 메모리로 복사해야 한다.
  • 입출력 장치
    • 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치를 말한다.
    • 보조기억장치와 입출력장치는 완전히 배타적인 개념이 아니다. 보조기억장치는 결국 메모리를 보조하는 임무를 수행하는 특수한 입출력 장치로 볼 수 있다.
    • 보조기억장치와 입출력 장치를 주변장치라고 통칭하기도 한다.

컴퓨터가 이해하는 정보

  • CPU는 기본적으로 0과 1만을 이해할 수 있다. 이것을 비트라고 한다. N 비트는 2^N개의 정보를 표현할 수 있다.
  • 워드란 CPU가 한 번에 처리할 수 있는 데이터의 크기를 의미한다. CPU는 프로그램을 워드 단위로 읽어 들이고 처리한다. 워드의 크기는 CPU마다 다르지만, 현대컴퓨터 대부분의 워드 크기는 32비트, 혹인 64비트이다.
  • 컴퓨터 내부에서는 소수점을 나타내기 위해 대표적으로 부동소수점 표현 방식을 이용한다. 하지만 이 방식은 정밀도에 한계가 있다. 부동소수점은 소수점이 고정되어 있지 않은 소수 표현 방식으로, 필요에 따라 소수점의 위치가 이동할 수 있고 유동적이라는 의미에서 부동소수점이라는 이름이 붙었다. 오늘날 컴퓨터는 2진수의 지수와 가수를 다음과 같은 형식으로 저장하는데, 이와 같은 부동소수점 저장 방식을 IEEE754 라고 한다.
  • 컴퓨터가 이해할 수 있는 문자들의 집합은 문자 집합이라고 한다. 그리고 문자 집합에 속한 문자를 컴퓨터가 이해하는 0과 1로 이루어진 문자 코드로 변환하는 과정을 문자 인코딩이라고 한다. 반대로, 0과 1로 표현된 문자를 사람이 이해하는 문자로 변환하는 과정은 문자 디코딩이라고 한다. 가장 기본적인 문자 집합에는 아스키가 있다. 아스키는 초창기 컴퓨터에서 사용하던 문자 집합 중 하나이다. 하나의 아스키 문자를 표현하기 위해서는 8비트를 사용한다. 8비트 중 1비트는 패리티 비트라고 불리는데, 이는 오류 검출을 위해 사용되는 비트이기 때문에 실질적으로 문자 표현을 위해 사용되는 비트는 7비트이다.

명령어

  • 명령어가 수행할 동작은 연산 코드라고 하고, 동작에 사용된 데이터 혹은 동작에 사용될 데이터가 저장된 위치는 오퍼랜드라고 한다. 즉 하나의 명령어는 연산 코드와 0개 이상의 오퍼랜드로 구성되어 있으며, 명령어에서 연산코드가 담기는 영역은 연산 코드 필드, 오퍼랜드가 담기는 영역은 오퍼랜드 필드라고 한다.
  • 오퍼랜드 필드에는 숫자나 문자와 같이 연산 코드에 사용될 데이터가 직접 명시되기 보다는 많은 경우 연산 코드에 사용될 데이터가 저장된 위치, 메모리 주소나 레지스터 이름이 명시된다. 그래서 오퍼랜드 필드를 주소 필드라고 부르기도 한다.
  • 연산 코드의 유형에는 데이터 전송, 산술/논리 연산, 제어흐름 변경, 입출력 제어가 있다.

기계어와 어셈블리어

  • CPU가 이해할 수 있도록 0과 1로 표현된 정보를 있는 그대로 표현한 언어를 기계어라고 한다. 어셈블리어는 기계어를 읽기 편한 형태로 단순 번역한 언어이다.

명령어 사이클

  • CPU가 명령어를 처리하는 과정에서 프로그램 속 각각의 명령어들은 일정한 주기를 반복하며 실행하는데, 이 주기를 명령어 사이클이라고 한다.
  • 메모리에서 저장된 명령어 하나를 실행하고 싶을 때 메모리에 있는 명령어를 가져와야 한다. 가지고 오는 단계를 인출 사이클이라고 한다. 그 다음 실행을 해야 하는데, 그 단계를 실행 사이클이라고 한다.
  • 명령어를 실행하기 위해 한 번 더 메모리에 접근하는 단계를 간접 사이클이라고 한다.

레지스터

  • CPU안에는 다양한 레지스터들이 있고, 각기 다른 이름과 역할이 있다. 프로그램을 이루는 데이터와 명령어가 프로그램의 실행 전 후로 레지스터에 저장되기 때문에 레지스터에 저장된 값만 잘 관찰해도 비교적 낮은 프로그램이 어떻게 동작하는지 파악할 수 있다.
  • 프로그램 카운터는 메모리에서 다음으로 읽어들일 명령어의 주소를 저장한다.
  • 명령어 레지스터는 해석할 명령어를 저장하는 레지스터이다.
  • 범용 레지스터는 이름 그대로 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터이다.
  • 플래그 레지스터는 연산의 결과 혹은 CPU 상태에 대한 부가 정보인 플래그 값을 저장하는 레지스터이다.
  • 스택 포인터는 메모리내 스택 영역 최상단 스택 데이터 위치를 가리키는 특별한 레지스터를 말한다.

인터럽트

  • CPU의 작업을 방해시키는 신호를 의미한다. 크게 동기 인터럽트와 비동기 인터럽트로 나뉘는데 동기 인터럽트는 CPU에 의해 발생하는 인터럽트이다. CPU가 프로그래밍 오류와 같은 예외적인 상황을 마주쳤을 때 발생하는 인터럽트다. 예외라고도 불린다.
  • 비동기 인터럽트는 주로 입출력 장치에 의해 발생하는 인터럽트이다. 알림과 같은 역할을 하며 하드웨어 인터럽트라고도 한다.
  • 입출력 작업에서 폴링이란 입출력 장치의 상태가 어떤지, 처리할 데이터가 있는지 주기적으로 확인하는것을 말한다.
  • 인터럽트는 CPU의 정상적인 실행 흐름을 끊는 것이기 때문에 인터럽트 하기 전에 CPU에게 인터럽트의 가능 여부를 확인해야 한다. 이를 위한 신호를 인터럽트 요청 신호라고 한다. 이때 CPU가 인터럽트 요청을 수용하기 위해서는 플래그 레지스터의 인터럽트 플래그가 활성화 되어 있어야 한다. 인터럽트 플래그는 하드웨어 인터럽트를 받아들일지, 무시할지를 결정하는 플래그이다.

CPU 성능

  • 클럭이란 컴퓨터의 부품을 일사불란하게 움직일 수 있게 하는 시간의 단위이다. 클럭속도는 헤르츠 단위로 측정되는데, 이는 클럭이 1초에 몇 번 반복되는지를 나타낸다. 이런 점에서 클럭 속도는 CPU의 속도 단위로 간주되기도 한다.
  • 코어란 CPU내에서 명령어를 읽어들이고, 해석하고, 실행하는 부품을 의미한다
  • 스레드란 하드웨어적인 스레드와 소프트웨어적인 스레드로 나누어 기억하면 좋다. 하드웨어 스레드는 하나의 코어가 동시에 처리하는 명령어의 단위를 의미한다. 같은 의미로 하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 멀티스레드 프로세서, 혹은 멀티스레드 CPU라고 한다. 하드웨어 스레드를 논리 프로세서 라고 부르기도 한다.
  • 소프트웨어 스레드란 하나의 프로그램에서 독립적으로 실행되는 단위를 의미한다.
  • 병렬성은 작업을 물리적으로 동시에 처리하는 성질이다. 같은 시점에 여러 작업을 동시에 처리할 수 있을 것이다.
  • 동시성은 동시에 작업을 처리하는 것처럼 보이는 성질을 의미한다. 여러 작업이 동시에 처리되는 것처럼 보일 수 있지만, 물리적으로 같은 시점에 여러 작업이 동시에 처리되고 있는 것은 아니다.
  • 하드웨어 스레드는 병렬성을 구현하기 위한 물리적인 실행단위에 가깝고, 소프트웨어 스레드는 동시성을 구현하기 위한 논리적인 실행단위에 가깝다.

파이프라이닝을 통한 명령어 병렬 처리

  • 명령어 병렬 처리 기법은 여러 명령어를 동시에 처리하여 CPU를 한시도 쉬지 않고 작동시킴으로써 CPU의 성능을 높이는 기법을 의미한다.
  • 과정
    • 명령어 인출
    • 명령어 해석
    • 명령어 실행
    • 결과 저장
  • 여기서 중요한 점은 같은 단계가 겹치지만 않는다면 CPU가 각각의 단계를 동시에 실행할 수 있다는 점이다. 이처럼 공장의 생산 라인과 같이 명령어들을 명령어 파이프라인에 넣고 동시에 처리하는 기법을 명령어 파이프라이닝이라고 한다.
  • 파이프라이닝이 실패하여 성능 향상이 이루어지지 않는 상황은 파이프라인 위험이라고 부르며, 데이터 위험과 제어 위험, 구조적 위험으로 구분할 수 있다. 데이터 위험은 명령어 간의 데이터 의존성에 의해 발생한다. 제어 위험은 프로그램 카운터의 갑작스러운 변화에 의해 발생한다. 프로그램 실행의 흐름이 바뀌어 명령어가 실행되면서 프로그램 카운터 값에 갑작스러운 변화가 생기면 미리 인출하거나 해석중인 명령어들은 쓸모가 없어진다 이가 제어 위험이다.
  • 구조적 위험은 명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터같은 CPU 부품을 사용하려고 할 때 발생한다. 구조적 위험은 자원 위험이라고도 부른다.

RAM

  • RAM은 임의 접근 메모리의 약자로, 여기서 임의 접근이란 저장된 요소에 순차적으로 접근할 필요 없이 임의의 위치에 곧장 접근 가능한 방식을 의미한다. 그래서 직접 접근이라고도 부른다. 임의 접근과 반대되는 개념으로는 순차접근이 있다. 순차 접근은 이름 그대로 특정 위치에 저장된 요소에 접근하기 위해 처음부터 순차적으로 접근하는 방식이다.

메모리에 바이트를 밀어 넣는 순서 - 빅엔디안과 리틀 엔디안

  • 바이트를 어떤 순서로 저장하는지에 따라 빅엔디안과 리틀 엔디안으로 나뉜다. 빅엔디안은 낮은 번지의 주소에 상위 바이트부터 저장하는 방식을 말한다.
  • 리틀 엔디안은 낮은 번지의 주소에 하위바이트부터 저장하는 방식을 말한다.

캐시메모리

  • 캐시 메모리는 CPU의 연산 속도와 메모리 접근 속도의 차이를 줄이기 위해 탄생한 저장장치로, CPU와 메모리 사이에 위치한 SRAM 기반의 저장장치이다.
  • 컴퓨터 내부에는 여러 종류의 캐시 메모리가 있다. 코어와 가까운 캐시 메모리를 L1 캐시, 그 다음 L2 캐시, L3 캐시라고 부른다. 일반적으로 L1, L2캐시는 코어 내부에 L3는 코어 외부에 위치해있다. 코어와 가장 가까운 L1 캐시는 명령어만을 저장하는 L1I캐시와 데이터만을 저장하는 L2D 캐시로 구분하기도 하며 이러한 유형의 캐시 메모리를 분리형 캐시라고 한다.
  • 캐시 메모리가 예측하여 저장한 데이터가 CPU에 의해 실제로 사용되는 경우를 캐시히트라고 하며 반대로 자주 사용할 것으로 예측하여 캐시 메모리에 저장했지만 틀린 예측으로 인해 CPU가 메모리로 부터 필요한 데이터를 직접 가져와야 하는 경우를 캐시 미스라고 한다.
  • 캐시가 히트되는 비율을 캐시적중률이라고 한다.
  • 캐시 메모리는 참조 지역성의 원리라는 특정한 원칙에 따라 메모리로 부터 가져올 데이터를 결정한다.
    • 시간 지역성
      • CPU는 최근에 접근했던 메모리 공간에 다시 접근하려는 경향이 있다.
    • 공간 지역성
      • CPU는 접근한 메모리 근처에 접근하려는 경향이 있다.
    • 시간 지역성을 가장 잘보이는 사례는 프로그래밍 언어의 변수이다. 일반적으로 변수에 저장된 값은 한 번만 사용되지 않고, 프로그램이 실행되는 동안 여러번 사용된다. 이렇게 최근에 접근했던 메모리 공간에 다시 접근하려는 경향을 시간 지역성이라고 한다.
    • 접근한 메모리 공간의 근처에 접근하려는 경향인 공간지역성은 단적으로 배열이 보여준다.

캐시 메모리의 쓰기 정책

  • 즉시 쓰기(Write-Through)
    • 메모리를 항상 최신 상태로 유지하여 캐시 메모리와 메모리 간의 일관성이 깨지는 상황 방지, 데이터를 쓸 때마다 메모리를 참조해야 하므로 버스의 사용시간과 쓰기 시간이 늘어난다.
  • 지연 스기(Write-Back)
    • 캐시 메모리에만 값을 써두었다가 추후 수정된 데이터를 한 번에 반영한다. 메모리 접근 횟수를 줄일 수 있어 즉시 쓰기 방식에 비해 속도는 더 빠르지만, 메모리와 캐시 메모리간의 일관성이 깨질 수 있다.

보조기억장치

  • RAID는 데이터의 안정성 혹은 성능을 확보하기 위해 여러 개의 독립적인 보조기억장치를 마치 하나의 보조기억장치처럼 사용하는 기술이다. RAID를 구성하는 방법에는 여러가지가 있으며, RAID 레벨이라고 표현한다.
  • RAID0
    • 데이터를 여러 보조기억장치에 단순하게 나누어 저장하는 구성 방식이다. 줄무늬처럼 분산되어 저장된 데이터를 스트라입이라고 하고, 이렇게 분산하여 저장하는 동작을 스트라이핑이라고 한다.
  • RAID1
    • 완전한 복사본을 만들어 저장하는 구성 방식이다. 그래서 미러링이라고도 부른다. RAID1은 복구가 간단하고 안정성이 높다. 원본과 복사본을 써야하기 때문에 RAID0보다 쓰기 속도가 느려진다. 복사본이 저장된 크기만큼 사용 가능한 용량이 적어진다는 단점도 있다.
  • RAID4
    • 패리티 정보를 저장하는 디스크를 따로 두는 구성방식이다. 패리티란 오류를 검출할 수 있는 정보이다. 단점은 패리티를 저장하는 장치에 병목 현상이 발생한다는 점이다.
  • RAID5
    • 패리티를 분산하여 저장하는 구성방식이다. RAID4의 단점인 병목 현상을 보완할 수 있다.
  • RAID6
    • 기본적으로 구성은 RAID5와 같지만 서로 다른 2개의 패리티를 두는 구성방식이다 오류를 검출하고 복구할 수 있는 수단이 2개이다. 따라서 안정성이 높다.

입출력 장치

  • 장치드라이버는 장치 컨트롤러의 동작을 알고, 장치 컨트롤러가 컴퓨터 내부와 정보를 주고 받을 수 있도록 하는 프로그램이다.
  • 프로그램 입출력은 프로그램 속 명령어로 입출력 작업을 수행하는 방법이다. 입출력 명령어를 실행함으로써 장치 컨트롤러와 상호 작용한다.
  • 다중 인터럽트를 처리하기 위해서는 프로그래머블 인터럽트 컨트롤러라는 하드웨어를 사용한다. PIC는 여러 장치 컨트롤러에 연결되어 있어 장치 컨트롤러에서 보낸 하드웨어 인터럽트 요청들의 우선순위를 판별한 뒤, CPU에게 지금 처리해야 할 하드웨어 인터럽트가 무엇인지를 알려주는 장치이다.

DMA 입출력

  • 프로그램 기반의 입출력과 인터럽트 기반의 입출력에 공통점이 있다면 CPU가 입출력 장치와 메모리간의 데이터 이동을 주도해야 하며, 이동하는 데이터들도 반드시 CPU를 거친다는 점이다.
  • DMA는 이름 그대로 직접 메모리에 접근할 수 있는 입출력 기능을 말한다 DMA 입출력을 위해서는 시스템 버스에 연결된 DMA 컨트롤러라는 하드웨어가 필요하다. DMA 컨트롤러는 시스템 버스에 연결되고, 입출력 장치들의 장치 컨트롤러들은 입출력 버스라는 입출력 장치 컨트롤러의 전용 버스와 연결된다.
728x90