[혼공챌린지 : 혼공단 9기 컴퓨터 구조+운영체제] 2주차

김진환·2023년 1월 15일
0

2주차 학습 정리

Chapter 04 : CPU의 작동 원리

04-1 : ALU와 제어장치

ALU

  • 계산하는 부품으로 산술 연산, 논리 연산 등 다양한 연산을 수행합니다.
  • 레지스터를 통해 '피연산자'를 받아들이고, 제어장치로부터 수행할 연산을 알려주는 '제어 신호'를 받아들입니다.
  • 연산의 수행 결과는 특정 숫자, 문자, 메모리 주소가 될 수 있으며 결과값은 레지스터에 저장됩니다.
    • CPU가 메모리에 접근하는 속도가 레지스터에 접근하는 속도에 비해 훨씬 느리기 때문에 결과를 레지스터에 우선 저장합니다.
  • ALU는 계산 결과와 함께 '플래그(flag)'를 내보내며, '플래그 레지스터'에 저장됩니다.
  • 대표적인 플래그
    • 부호 플래그 : 연산한 결과의 부호를 나타냅니다. (1일 경우 음수, 0이면 양수)
    • 제로 플래그 : 연산 결과가 0인지 여부를 나타냅니다. (1일 경우 결과가 0, 0이면 0이 아님)
    • 캐리 플래그 : 연산 결과 올림수나 빌림수가 발생했는지를 나타냅니다.
    • 오버플로우 플래그 : 오버플로우(연산 결과가 연산 결과를 담을 레지스터 보다 큰 상황)가 발생했는지를 나타냅니다.
    • 인터럽트 플래그 : 인터럽트가 가능한지를 나타냅니다. (1일 경우 인터럽트가 가능)
    • 슈퍼바이저 플래그 : 커널 모드로 실행 중인지, 사용자 모드로 실행 중인지를 나타냅니다. (1일 경우 커널 모드로 실행 중)

제어장치

  • 제어장치 : 제어 신호를 내보내고, 명령어를 해석하는 부품
  • 제어 신호 : 컴퓨터 부품을 관리하고 작동시키기 위한 전기 신호
  • CPU 제조사마다 제어 장치의 구현 방식 및 명령어 해석, 입출력 정보에 조금씩 차이가 있습니다.
  • 제어 장치의 대표적인 입출력 정보
    • 클럭 신호 : 클럭 신호를 통해서 클럭(clock : 컴퓨터 모든 부품이 움직일 수 있게 하는 시간 단위) 주기를 받아 들여 레지스터 간의 데이터 이동이나, ALU에서 연산 수행, 메모리에 저장된 명령어 읽는 등의 동작을 합니다.
    • 해석해야 할 명령어 : CPU가 해석해야 할 명령어를 '명령어 레지스터'에서 읽은 후 제어 신호를 발생시켜 컴퓨터 부품들에 수행해야할 내용을 알려줍니다.
    • 플래그 레지스터 속 플래그 값 : 제어장치는 ALU 연산의 추가 상태 정보를 '플래그 레지스터'에서 플래그 값을 읽고 참조하여 제어 신호를 발생시킵니다.
    • 시스템 버스 중 제어 버스로 전달된 제어 신호 : 입출력장치를 비롯한 외부 장치에서 발생한 제어 신호를 받아들입니다.
      • ex) 메모리가 전달하는 제어신호, 입출력장치에 전달하는 제어 신호

04-2 : 레지스터

반드시 알아야 할 레지스터 (8가지)

  1. 프로그램 카운터(PC : Program Counter) : 메모리에서 가져올 명령어의 주소를 저장합니다. 명령어 포인터(IP : instruction Pointer)라고 부르는 CPU(주로 인텔 계열)도 있습니다.
  2. 명령어 레지스터(IR : Instruction Register) : 해석할 명령어(메모리에서 읽어 들인 명령어)를 저장하는 레지스터 입니다. 제어장치가 해당 레지스터 속 명령어를 받아들여 해석해 제어 신호를 내보냅니다.
  3. 메모리 주소 레지스터(MAR : Memory Address Register) : 메모리 주소를 저장하는 레지스터입니다. CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 거치게 됩니다.
  4. 메모리 버퍼 레지스터(MBR : Memory Buffer Register) : 메모리와 주고받을 값(데이터와 명령어)을 저장하는 레지스터입니다. 데이터 버스로 주고 받을 값(메모리에 쓰거나 전달받은 값)이 거칩니다.
  5. 플래그 레지스터(flag register) : 연산 결과 또는 CPU 상태에 대한 부가 정보를 저장하는 레지스터입니다.
  6. 범용 레지스터(general purpose register) : 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터입니다. 데이터와 주소를 모두 저장할 수 있으며, 일반적으로 CPU 안에 여러 개의 범용 레지스터가 있습니다.
  7. 스택 포인터(stack pointer) : 스택 주소 지정 방식에 사용될 수 있는 특별한 레지스터입니다.
  8. 베이스 레지스터(base register) : '프로그램 카운터'와 함께 변위 주소 지정 방식에 사용되는 특별한 레지스터입니다.

특정 레지스터를 이용한 주소 지정 방식(1): 스택 주소 지정 방식

  • 스택 주소 지정 방식 : 스택과 스택포인터를 이용한 주소 지정 방식입니다.
  • 스택 포인터 : 해당 레지스터는 스택의 꼭대기를 가리키는 레지스터입니다.
    • 스택에서 마지막으로 저장한 값의 위치를 저장하는 레지스터
  • 스택 영역 : 메모리 안의 스택처럼 사용할 영역을 의미합니다.해당 영역은 다른 주소 공간과 다르게 스택처럼 사용하기로 암묵적으로 약속된 영역입니다.

특정 레지스터를 이용한 주소 지정 방식(2): 변위 주소 지정 방식

  • 변위 주소 지정 방식(displacement addressing mode) : 명령어의 '오퍼랜드 필드의 값(변위)'과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식입니다.
    • 변위 주소 지정 방식의 명령어 : 연산 코드 + 레지스터 필드(어떤 레지스터 값과 더할지를 나타내는 레지스터 필드) + 오퍼랜드 필드(주소)
    • 레지스터 필드에 따른 '상대 주소 지정 방식', '베이스 레지스터 주소 지정 방식' 등으로 나뉩니다.
  • 상대 주소 지정 방식(relative addressing mode)
    • 오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식입니다.
    • 프로그래밍 언어의 if문과 유사하게 모든 코드를 실행하는 것이 아닌, 분기하여 특정 주소의 코드를 실행할 때 사용됩니다.
  • 베이스 레지스터 주소 지정 방식(base-register addressing mode)
    • 오퍼랜드와 베이스 레지스터의 값을 더하여 유효 주소를 얻는 방식입니다.
    • 베이스 레지스터는 '기준 주소'로 사용되고, 오퍼랜드는 '기준 주소로부터 떨어진 거리'로서의 역할을 합니다.

상용화된 CPU 속 레지스터 및 주소 지정 방식

실제 CPU 작동법은 전공서와 가장 다른 부품으로 '임베디드 개발자', '게임 엔진 개발자', '보안 솔루션 개발자', '시스템 해커' 등과 같이 실제 CPU 작동법을 자세히 알아야하는 경우에는 상용 CPU의 동작을 확인해야하며, 각 CPU 제조사별 레지스터의 이름을 중점으로 실제 동작을 확인할 필요가 있습니다.

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

명령어 사이클

  • 명령어 사이클(instruction cycle) : 프로그램 속 각각의 명령어들은 일정한 주기가 반복되며 실행되며, 이때의 주기를 의미합니다.
    • 인출 사이클(fetch cycle) : 메모리에 있는 명령어를 CPU로 가지고 오는 단계
      • 프로그램 카운터의 주소를 메모리 주소 레지스터를 통해 주소 버스로 전달 및 '메모리 읽기' 제어 신호를 제어 버스로 전달하여, 데이터 버스를 통해 메모리 버퍼 레지스터를 통해 명령어 레지스터에 이동하는 단계
    • 실행 사이클(execution cycle) : CPU로 가져온 명령어를 실행하는 단계
      • 제어 장치가 명령어 레지스터에 담긴 값을 해것하고, 제어 신호를 발생시키는 단계
    • 간접 사이클(indirect cycle) : '간접 주소 지정 방식'의 경우 명령어 실행을 위해 메모리 접근을 한 번 더 해야하며, 이 때의 단계를 의미합니다.
    • 인터럽트 사이클(interrupt cycle) : 명령어 수행시 발생한 '인터럽트'를 처리하는 단계

인터럽트

  • 인터럽트(interrupt) : CPU의 작업을 방해하는 신호, CPU가 수행 중인 작업은 인터럽트 신호 시 방해를 받아 잠시 중단됩니다.
    • CPU 작업을 잠시 중단할 정도의 'CPU가 꼭 주목해야 할 때' 혹은 'CPU가 얼른 처리해야 할 다른 작업이 생겼을 때' 발생합니다.
  • 인터럽트의 종류 (인텔 공식 문서 기준)
    • 동기 인터럽트(synchronous interrupts)
      • CPU에 의해 발생하는 인터럽트, CPU가 명령어들을 수행하다 예상치 못한 상황에 처했을 때(프로그래밍상의 오류) 발생하는 인터럽트입니다.
      • 이러한 동기 인터럽트를 '예외(exception)'라고 부릅니다.
    • 비동기 인터럽트(asynchronous interrupts)
      • 주로 입출력장치에 의해 발생하는 인터럽트, 입출력장치에 의한 완료 알림과 같은 역활을 합니다.
      • 일반적으로 비동기 인터럽트를 인터럽트라고 칭하며, '하드웨어 인터럽트'라고도 사용할 수 있습니다.
  • 하드웨어 인터럽트
    • 알림과 같은 인터럽트입니다.
    • 입출력 작업 도중 효율적인 명령어 처리를 위해 '하드웨어 인터럽트'를 사용합니다.
      • CPU에 비해 속도가 현저히 느린 입출력 장치의 작업의 끝을 주기적으로 확인하는 대신, '하드웨어 인터럽트'를 통해서 작업의 끝을 전달 받을 때까지 다른 작업을 진행할 수 있습니다.
  • 하드웨어 인터럽트 처리 순서
    1. 입출력장치는 CPU에 '인터럽트 요청 신호'를 보냅니다.
    2. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인합니다.
    3. CPU는 인터럽트 요청을 확인하고 '인터럽트 플래그'를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인합니다.
    4. 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업합니다.
    5. CPU는 '인터럽트 벡터'를 참조하여 '인터럽트 서비스 루틴'을 실행합니다.
    6. 인터럽트 서비스 루틴 실행이 끝나면 4번에서 백업해 둔 작업을 복구하여 실행을 재개합니다.
  • 용어 설명
    • 인터럽트 요청 신호 : CPU의 작업을 방해하는 인터럽트에 대한 요청
      • CPU의 정상적인 실행 흐름을 끊기 전 CPU에 물어보는 것을 의미합니다.
    • 인터럽트 플래그(interrupt flag) : 인터럽트 요청 신호를 받아들일지 무시할지를 결정하는 비트
      • 하드웨어 인터럽트를 받아들일지, 무시할지를 결정하는 플래그입니다.
      • CPU가 중요한 작업을 처리하거나 방해 받지 않아야 할 경우 불가능으로 설정됩니다.
      • 불가능으로 설정된 경우에는 인터럽트 요청을 무시합니다.
      • 단, 인터럽트 플래그가 불가능으로 설정되어 있어도 막을 수 없는 인터럽트 요청이 있으며, 무시할 수 없는 인터럽트는 가장 우선 순위가 높은, 가장 먼저 처리해야할 인터럽트이며 정전이나 하드웨어 고장으로 인한 인터럽트 등이 있습니다.
    • 인터럽트 벡터(interrupt vector) : 인터럽트 서비스 루틴의 시작 주소를 포함하는 인터럽트 서비스 루틴의 식별 정보
      • 인터럽트 서비스 루틴을 식별하기 위한 정보입니다.
      • 인터럽트 서비스 루틴의 시작 주소를 알 수 있으며, 인터럽트 벡터를 통해 특정 인터럽트 서비스 루틴을 처음부터 실행 할 수 있습니다.
    • 인터럽트 서비스 루틴(ISR : Interrupt Service Routine) : 인터럽트를 처리하는 프로그램
      • CPU가 인터럽트 요청을 받아들일 경우 실행할 프로그램입니다.
      • 인터럽트 핸들러(interrupt handler)라고도 부릅니다.
      • 인터럽트를 처리하는 방법이 각 입출력장치마다 다르기 때문에 각각의 인터럽트 서비스 루틴을 가지고 있습니다.

예외의 종류

  • 폴트(fault) : 예외를 처리한 직후 예외가 발생한 명령어부터 실행을 재개하는 예외입니다.
    • ex) 명령어 실행에 필요한 데이터가 메모리가 아닌 보조기억장치에 있는 경우, CPU는 폴트 예외를 발생 시키고 보조기억장치로부터 필요한 데이터를 메모리로 가져와 저장합니다. 이후 폴트가 발생한 명령어부터 다시 실행합니다.
  • 트랩(trap) : 예외를 처리한 직후 예외가 발생한 명령어의 다음 명령어부터 실행을 재개하는 예외입니다.
    • ex) 디버깅 중 break 시를 의미합니다. 중단 이후 실행을 재개할 수 있습니다.
  • 중단(abort) : 실행 중인 프로그램을 강제로 중단시킬 수밖에 없는 심각한 오류를 발견한 경우 발생하는 예외입니다.
  • 소프트웨어 인터럽트(software interrupt) : 시스템 호출이 발생했을 때 나타나는 예외입니다.

Chapter 05 : CPU 성능 향상 기법

05-1 : 빠른 CPU를 위한 설계 기법

클럭

  • 클럭은 '클럭 신호'가 발생하는 속도의 단위입니다.
  • 클럭 속도는 헤르츠(Hz) 단위로 측정합니다. 해당 속도는 1초에 클럭이 몇 번 반복되었는지를 나타냅니다.
  • CPU는 일정한 클럭 속도를 유지하지 않고 고성능이 필요한 순간 클럭 속도를 높이며, 필요하지 않을 경우에는 낮춥니다.
  • 클럭 속도가 높을수록 속도가 빠르지만 발열 문제가 더 심각해지는 문제가 있습니다.

코어와 멀티코어

  • 코어(core) : 명령어를 실행하는 부품
    • 기존 CPU의 정의인 '명령어를 실행하는 부품'이 현대에서는 한 CPU에 여러 개를 탑재할 수 있습니다.
    • 따라서, 기존 CPU 정의인 '명령어를 실행하는 부품'을 '코어(Core)'라는 명칭으로 사용하게되었습니다.
  • 멀티코어(multi-core) : 코어를 여러 개 포함하고 있는 CPU를 지칭합니다. 멀티코어 프로세서나 멀티코어 CPU라고 부릅니다.

스레드와 멀티스레드

  • 스레드(thread) : '실행 흐름의 단위'
    • 하드웨어적 스레드 : CPU에서 지칭하는 스레드를 의미합니다.
    • 소프트웨어적 스레드 : 프로그램에서 지칭하는 스레드를 의미합니다.
  • 하드웨어적 스레드 : '하나의 코어가 동시에 처리하는 명령어 단위'입니다.
    • 멀티스레드 : 하나의 코어로 여러 명령어를 동시에 처리하는 것을 의미합니다.
    • 멀티스레드 프로세서 : 하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 의미합니다.
  • 소프트웨어적 스레드 : '하나의 프로그램에서 독립적으로 실행되는 단위'입니다.
    • '소프트웨어적 스레드'는 실행되는 단위를 따로 선언하는 것입니다.
    • 멀티 스레드 프로그램은 실행되는 단위를 여러 개를 선언한 프로그램입니다.
    • 여러 기능을 작동시키는 프로그램의 기능의 각 부분의 코드를 '소프트웨어적 스레드'로 만들면 각 기능을 동시에 실행이 가능합니다.
  • 멀티스레드 프로세서의 동작 원리
    • 코어에서 명령어 처리에는 '프로그램 카운터', '스택 포인터', '데이터 버퍼 레지스터', '데이터 주소 레지스터' 등의 필수 레지스터인 '레지스터 세트'가 필요합니다.
    • 하나의 코어로 여러 명령어를 동시에 처리하기 위해서는 '레지스터 세트'를 여러 개를 가지면 됩니다.
    • 코어가 명령어 실행 시 '레지스터 세트'에 번갈아 기록하며 명령어를 처리하면 동작이 가능합니다.
  • 논리 프로세서(logical processor) : '하드웨어 스레드'를 부르는 다른 명칭입니다.
    • 프로세스 입장에서는 별개의 '레지스터 세트'를 사용하여 동작하는 '하드웨어 스레드'가 CPU와 동일한 동작을 합니다.
    • 따라서, 프로세스 입장에서는 '하드웨어 스레드'가 CPU와 동일하기 때문에 '논리 프로세서(logical processor)'라고도 부릅니다.

05-2 : 명령어 병렬 처리 기법

  • 명령어 병렬 처리 기법(ILP : Instruction-Level Parallelism) : 명령어를 동시에 처리하여 CPU를 쉬지 않고 작동시키는 기법

명령어 파이프라인

  • 명령어 처리 과정(클럭 단위)
    1. 명령어 인출(Instruction Fetch)
    2. 명령어 해석(Instruction Decode)
    3. 명령어 실행(Execute Instruction)
    4. 결과 저장(Write Back)
  • 명령어 파이프라이닝(instruction pipelining) : 명령어 파이프라인(instruction pipline)에 넣고 동치에 처리하는 기법
    • 같은 단계가 겹치지 않는 다면 CPU는 각 단계를 동시에 실행할 수 있습니다.
      • ex. 한 명령어를 '인출'하는 동안 다른 명령어 '실행'하거나 '저장'할 수 있습니다.
    • 겹치지 않는 단계의 명령어를 겹쳐서 수행하는 기법
  • 파이프라인 위험(pipeline hazard) : 파이프라이닝이 특정 상황에서 성능 향상에 실패하는 경우를 의미합니다.
    • 데이터 위험(data hazard) : 명령어 간 '데이터 의존성'에 의해 발생합니다.
      • 이후 명령어의 데이터가 이전 명령어의 결과값을 사용하는 경우와 같이 데이터가 의존적인 경우를 의미합니다.
      • 끝까지 실행해야 비로소 실행 가능한 경우, 동시에 실행하려고 하는 경우 파이프라인이 제대로 작동하지 않습니다.
    • 제어 위험(control hazard) : 분기 등으로 인한 '프로그램 카운터의 갑작스러운 변화'에 의해 발생합니다.
      • 프로그램 카운터가 다음 주소로 갱신되지 않고 실행 흐름이 바뀌어 프로그램 카운터 값에 갑작스러운 변화가 생기는 경우 미리 파이프라인에서 처리 중이었던 명령어들이 쓸모 없어지는 상황을 의미합니다.
      • 이를 방지하기 위한 기술 중 하나가 분기 예측(branch prediction : 프로그램이 어디로 분기할지 미리 예측 후 해당 주소를 인출하는 기술)입니다.
    • 구조적 위험(structural hazard) : 명령어들을 겹처 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 등의 CPU 부품을 사용하려고 할 때 발생합니다.
      • 자원 위험(resource hazard)이라고도 합니다.

슈퍼스칼라

  • 슈퍼스칼라(superscalar) : CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조를 의미합니다.
  • 슈퍼스칼라 프로세서(슈퍼스칼라 CPU) : 슈퍼스칼라 구조로 명령어 처리가 가능한 CPU를 의미합니다.
    • 매 클럭 주기마다 동시에 여러 명령어를 인출, 실행할 수 있어야 합니다.
    • 멀티스레드 프로세서는 한 클럭에 여러 명령어를 인출, 해석, 실행할 수 있어 슈퍼스칼라 구조를 사용할 수 있습니다.
    • 이론상으로는 파이프라인 개수에 비례하여 프로그램 처리 속도가 빠랄져야하지만, 파이프라인 위험 등의 문제로 비례하여 빨라지지 않습니다.

비순차적 명령어 처리

  • 비순차적 명령어 처리(OoOE: Out-of-order execution) : 명령어들을 순차적으로 실행하지 않는 기법입니다.
  • 기존의 방식인 '명령어 파이프라이닝', '슈퍼스칼라' 기법은 명령어의 순차적인 처리를 상정한 방법이지만, 여러 문제로 예상치 못한 상황에서는 파이프라인이 멈춰지게 됩니다.
  • 명령어를 순차적으로 처리하지 않고, 명령어 간의 서로 데이터 의존성이 전혀 없는 명령어들과 같이 순서를 바꿔도 무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지하는 기법입니다.

05-3 : CISC와 RISC

명령어 집합

  • 명령어 집합(instruction set) : CPU가 이해할 수 있는 명령들의 모음
    • 명령어 집합 구조(ISA : Instruction Set Architecture)이라고도 합니다.
    • CPU마다 ISA가 다를 수 있습니다.
    • CPU가 어떤 명령어를 이해하는지에 따라서 컴퓨터 구조 및 설계 방식이 달라지기 때문에 '구조'를 추가해서 부르기도합니다.
    • ISA가 다르면 CPU가 이해할 수 있는 명령어가 다르고, 따라서 어셈블리어가 달라집니다.
    • 따라서, 같은 소스 코드여도 ISA가 다를 경우 CPU가 이해할 수 있는 명령어도 어셈블리어도 달라집니다.

CISC : Complex Instruction Set Computer

  • '복잡한 명령어 집합을 활용하는 컴퓨터(CPU)'를 의미합니다.
  • x86, x86-64 등이 대표적인 CISC 기반의 ISA입니다.
  • 특징
    • 복잡하고 다양한 명령들을 활용하는 CPU 설계 방식입니다.
    • 가변 길이 명령어를 활용합니다.
  • 장점
    • 다양하고 강력한 명령어를 통해서 상대적으로 적은 수의 명령어로도 프로그램을 실행할 수 있습니다.
    • 메모리를 최대한 아끼며 개발하는 경우 유리합니다. (과거에는 인기가 높았습니다.)
  • 단점
    • 명령어의 크기와 실행되기까지의 시간이 일정하지 않습니다.
    • 복잡한 명령어 때문에 명령어 하나를 실행하는데 여러 클럭 주기를 필요로 하며, 파이프라인이 효율적으로 명령어를 처리할 수 없습니다. (명령의 규격화가 어렵기 때문입니다.)
    • 대다수의 복잡한 명령어는 사용 빈도가 낮습니다. (20% 명령어가 전체 명령어 사용 통계에서 80% 가량을 차지했습니다.)

RISC : Reduced Instruction Set Computer

  • RISC 탄생 원칙
    1. 빠른 처리를 위해 명령어 파이프라인을 십분활용해야 합니다. 원활한 파이프라이닝을 위해서는 '명령어 길이와 수행 시간이 짧고 규격화'되어 있어야 합니다.
    2. 자주 쓰이는 명령어만 줄곧 사용됩니다. 따라서, 복잡한 기능의 명령어보다 '자주 쓰이는 기본적인 명령어를 작고 빠르게 만드는 것'이 중요합니다.
  • 특징
    • 단순하고 적은 명령어를 활용하는 CPU 설계 방식입니다.
    • 고정 길이 명령어입니다.
  • 장점
    • 명령어가 규격화 되어 명령어 1클럭 내외로 실행되기 때문에 명령어 파이프라이닝에 최적화되어 있습니다.
  • 단점
    • 프로그램을 이루는 명령어의 수가 많습니다.

2주차 미션

1. 기본 미션 : p. 125의 확인 문제 2번, p. 155의 확인 문제 4번 풀고 인증하기

1.1. p. 125 : 확인 문제 2번 : 설명에 맞는 레지스터를 보기에서 찾아 빈칸을 채워 보세요.

[보기] 프로그램 카운터, 명령어 레지스터, 플래그 레지스터, 범용 레지스터
  • (1) : 연산 결과 혹은 CPU 상태에 대한 부가 정보를 저장하는 레지스터
    • 답 : 플래그 레지스터
  • (2) : 메모리에서 가져올 명령어의 주소를 저장하는 레지스터
    • 답 : 프로그램 카운터
  • (3) : 데이터와 주소를 모두 저장할 수 있는 레지스터
    • 답 : 범용 레지스터
  • (4) : 해석할 명령어를 저장하는 레지스터
    • 답 : 명령어 레지스터

1.2. p. 155 : 확인 문제 4번 : 다음 그림은 멀티코어 CPU를 간략하게 도시과한 그림입니다. 빈칸에 알맞은 용어를 써 넣으세요.

  • 답 : 코어

2. 선택 미션 : Ch.05(05-1) 코어와 스레드, 멀티 코어와 멀티 스레드의 개념을 정리하기

2.1. 코어와 멀티 코어

코어

기존 CPU의 정의인 '명령어를 실행하는 부품'은 1개이었지만, 현대의 CPU에서는 기술적 발전으로,
CPU 내부에 '명령어를 실행하는 부품'을 여러 개 탑재가 가능해졌습니다.
대신 기존 CPU 정의인 '명령어를 실행하는 부품'을 '코어(Core)'라는 명칭으로 사용하게되었습니다.

멀티 코어

현대 CPU의 발전으로 CPU 1개에 코어('명령어를 실행하는 부품')를 여러 개를 탑재하는 것을 의미합니다.
CPU 내부에 여러 개의 '코어'를 여러 개의 명령어를 처리할 수 있기 때문에 성능이 상승합니다.
단, CPU 내부의 코어 수에 비례하여 증가하지 않습니다. (처리하고자 하는 작업량과 적절한 분배에 따라 다릅니다.)

2.2. 스레드와 멀티스레드

스레드

  • 스레드의 정의
    • 스레드(thread)는 '실행 흐름의 단위'로 프로그래밍 언어, 운영체제, CPU 등에서 학습할 때 포함되는 개념입니다.
      • 하드웨어적 스레드 : CPU에서 사용됩니다.
      • 소프트웨어적 스레드 : 프로그램에서 사용됩니다.
  • 하드웨어적 스레드
    • 정의 : '하나의 코어가 동시에 처리하는 명령어 단위'
    • CPU에서 사용되는 스레드라는 용어는 '하드웨어적 스레드'를 지칭합니다.
  • 소프트웨어적 스레드
    • '하나의 프로그램에서 독립적으로 실행되는 단위'
    • 프로그램이 언어나 운영체제에서의 스레드라는 용어는 '소프트웨어적 스레드'를 지칭합니다.

소프트웨어적 스레드의 멀티 스레드

기본적으로 하나의 프로그램은 실행 시 한 부분만 실행되어 진행될 수 있습니다.
'소프트웨어적 스레드'는 실행되는 단위를 따로 선언하는 것으로 멀티 스레드는 실행되는 단위를 여러 개를 선언하는 것입니다.
즉, 여러 기능을 작동시키는 프로그램의 기능의 각 부분의 코드를 '소프트웨어적 스레드'로 만들면 각 기능을 동시에 실행이 가능합니다.

하드웨어적 스레드의 멀티 스레드(멀티스레드 프로세서)

  • 멀티스레드 : 하나의 코어로 여러 명령어를 동시에 처리하는 것을 의미하며,
  • 멀티스레드 프로세서 : 하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 의미합니다.
  • 멀티스레드 프로세서의 동작 원리
    • 하나의 코어로 여러 명령어를 동시에 처리하도록 하기위해서는 '프로그램 카운터', '스택 포인터', '데이터 버퍼 레지스터', '데이터 주소 레지스터'와 같이 명령어를 처리하기 위해 꼭 필요한 레지스터인 '레지스터 세트'가 여러개 필요합니다.
    • 하나의 코어로 각 '레지스터 세트'에 번갈아 기록하며 명령어를 처리하면 됩니다.
  • 논리 프로세서(logical processor)
    • 메모리 속 프로그램에서는 각 '레지스터 세트'에 기록하는 '하드웨어 스레드'가 '한 번에 하나의 명령어'를 처리하는 CPU와 같으며, 프로그램 입장에서는 '하드웨어 스레드'가 CPU와 동일하게보여 '논리 프로세서(logical processor)'라고도 부릅니다.

참조 자료

  • 혼자 공부하는 컴퓨터 구조+운영체제 : Chapter 04 ~ 05
profile
발전 중인 주니어 개발자

0개의 댓글