독학/[책] 컴퓨터구조 + 운영체제

[혼공학습단 11기 혼공컴운💿] 컴퓨터구조+운영체제 week2

최연재 2024. 1. 8. 16:14

✍️ 기본 미션

p. 125의 확인 문제 2번, p. 155의 확인 문제 4번 풀고 인증하기.

 
P. 125 확인문제 2

Q. 설명에 맞는 레지스터를 찾아 빈칸을 채워 보시오.
A.
[ 플래그 레지스터 ] : 연산 결과 혹은 CPU 상태에 대한 부가정보를 저장하는 레지스터
[ 프로그램 카운터 ] : 메모리에서 가져올 명령어의주소를 저장하는 레지스터
범용 레지스터 ] : 데이터와 주소를 모두 저장할 수 있는 레지스터
명령어 레지스터 ] : 해석할 명령어를 저장하는 레지스터
 

P. 155 확인문제 4

Q. 빈칸에 알맞은 용어를 써 넣으시오.
A.

✍️선택미션

Ch.05(5-1) 코어와 스레드, 멀티 코어와 멀티 스레드의 개념을 정리하기

: 아래 [내용 정리]에서 확인하실 수 있습니다!


🗒️내용 정리

Chap04. CPU의 작동 원리

4.1 ALU와 제어장치

1) ALU

- ALU는 레지스터를 통해 피연산자를 받아들이고, 제어장치로부터 수행할 연산을 알려주는 제어신호를 받아들인다.
- CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느리므로 ALU의 결괏값은 레지스터에 저장된다.
- ALU는 계산정보와 더불어 플래그를 내보낸다. 
- 플래그 (flag)

  • 연산 결과에 대한 추가적인 상태 정보
  • 플래그들은 플래그 레지스터에 저장됨.
플래그 종류의미사용 예시
부호 플래그연산한 결과의 부호를 나타냄.부호 플래그 : 1 -> 계산결과는 음수
부호 플래그 : 0 -> 계산결과는 양수
제로 플래그연산 결과가 0인지 여부를 나타냄.제로 플래그 : 1 -> 연산 결과가 0
제로 플래그 : 0 -> 연산 결과가 0이 아님.
캐리 플래그연산 결과 올림수나 빌림수가 발생했는지를 나타냄.캐리 플래그 : 1 -> 올림수나 빌림수 발생
캐리 플래그 : 0 -> 올림수나 빌림수 발생 x
오버플로우 플래그오버플로우가 발생했는지를 나타냄오버플로우 플래그 : 1 -> 오버플로우 발생
오버플로우 플래그 : 0 -> 오버플로우 발생 x
인터럽트 플래그인터럽트가 가능한지를 나타냄.인터럽트 플래그 : 1 -> 인터럽트 가능
인터럽트 플래그 : 0 -> 인터럽트 불가능
슈퍼바이저 플래그커널 모드로 실행 중인지, 사용자모드로 실행 중인지를 나타냄.슈퍼바이저 플래그 : 1 -> 커널 모드로 실행 중임
슈퍼바이저 플래그 : 0 -> 사용자 모드로 실행 중임

 

2) 제어장치

- 제어 신호(컴퓨터 부품을 관리하고 작동시키기 위한 일종의 전기신호)를 내보내고, 명령어를 해석하는 부품
- 제어장치가 받아들이는 정보

  • 클럭 신호
    • 클럭(clock) : 컴퓨터의 모든 부품을 움직이게 하는 시간 단위
  • 해석해야 할 명령어
    • CPU가 해석해야 할 명령어는 명령어 레지스터에 저장됨.
    • 제어장치는 명령어 레지스터로부터  해석할 명령어를 받아들이고 해석한 뒤 제어신호를 발생시켜 컴퓨터 부품들에게 수행해야 할 내용을 알림.
  • 플래그 레지스터 속 플래그 값
  • 시스템 버스, 그중에서도 제어 버스로 전달된 제어 신호
    • 제어 버스를 통해 외부로부터 전달된 제어 신호를 받아들임. 

- 제어장치가 내보내는 정보

  • CPU 외부에 전달하는 제어 신호
    • 제어 버스로 제어 신호를 내보낸다.
    • 메모리에 전달하는 제어 신호와 입출력장치(보조기억장치 포함)에 전달하는 제어 신호가 있음.
    • 메모리나 입출력장치의 값을 읽거나 새로운 값을 쓸 때 내보냄. 
  • CPU 내부에 전달하는 제어 신호
    • ALU에 전달하는 제어 신호와 레지스터에 전달하는 제어 신호가 있음.
    • ALU에 전달하는 제어 신호 : 수행할 연산을 지시하기 위함.
    • 레지스터에 전달하는 제어 신호 : 레지스터 간 데이터를 이동시키거나 레지스터에 저장된 명령어를 해석하기 위함.

 
 

4.2 레지스터

1) 반드시 알아야 할 레지스터

(1) 프로그램 카운터 (PC ; Program Counter)
- 메모리에서 가져올 명령어의 주소를 저장
- 변위 주소 지정 방식에 사용되는 레지스터
- 명령어 포인터라고도 부르는 CPU 있음.
 
(2) 명령어 레지스터 (IR ; Instruction Register)
- 해석할 명령어를 저장하는 레지스터
- 제어장치는 명령어 레지스터 속 명령어를 받아들이고 해석한 뒤 제어신호를 내보냄.
 
(3) 메모리 주소 레지스터 (MAR ; Memory Address Register)
- 메모리의 주소를 저장하는 레지스터
- CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 내보낼 때 MAR을 거치게 됨.
 
(4) 메모리 버퍼 레지스터 (MBR ; Memory Buffer Register)
- 메모리와 주고받을 값(데이터, 명령어)을저장하는 레지스터
- 데이터 버스로 주고받을 값이 MBR을 거치게 됨.
- 메모리 데이터 레지스터(MDR ; Memory Data Register)라고도 함.
 
(5) 플래그 레지스터 (flag register) : 연산 결과 또는 CPU 상태에 대한 부가 정보를 저장하는 레지스터
 
(6) 범용 레지스터 (general purpose register) : 데이터와 주소 모두 저장이 가능한 레지스터
 
(7) 스택 포인터 (stack pointer) : 스택 주소 지정 방식에 사용되는 레지스터 
 
(8) 베이스 레지스터 : 변위 주소 지정 방식에 사용되는 레지스터
 

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

- 스택 주소 지정 방식 :  스택과 스택 포인터를 이용한 주소 지정 방식
- 스택 포인터는 스택에 마지막으로 저장된 값의 위치를 저장함.
- 스택은 메모리 내 스택 영역에 위치함.
 

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

(1) 변위 주소 지정 방식 (displacement addressing mode) 
- 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더해 유효 주소를 얻어내는 주소 지정 방식
- 변위 주소 지정 방식을 사용하는 명령어는 연산 코드 필드, 레지스터 필드, 오퍼랜드 필드가 있음.
- 오퍼랜드 필드의 주소와 어떤 레지스터를 더하는지에 따라 상대 주소 지정 방식, 베이스 레지스터 주소 지정 방식 등으로 나뉨.
 
(2) 상대 주소 지정 방식 (relative addressing mode)
- 오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 지정하는 방식
- 모든 코드를 실행하는 것이 아니라 분기하여 특정 주소의 코드를 실행할 때 사용됨.
 
(3) 베이스 레지스터 주소 지정 방식 (base-register addressing mode)
- 오퍼랜드와 베이스 레지스터의 값을 더하여 유효 주소를 얻는 방식
- 베이스 레지스터 속 기준 주소로부터 얼마나 떨어져 있는 주소에 접근할지를 연산해 유효 주소를 얻어냄.
 
 

4.3  명령어 사이클과 인터럽트

1) 명령어 사이클 (instruction cycle)

- 프로그램 속 각각의 명령어가 반복되며 실행되는 주기
- 프로그램을 이루는 수많은 명령어는 일반적으로 인출과 실행 사이클을 반복하며 실행됨.

  1. 인출 사이클 (fetch cycle) :  메모리에 있는 명령어를 CPU로 가져오는 단계
  2. 실행 사이클 (execution cycle) : CPU로 가져온 명령어를 실행하는 단계
    • 제어장치가 명령어 레지스터에 담긴 값을 해석하고, 제어신호를 발생시키는 단계

- 간접 사이클 (indirect cycle)

  • 명령어를 인출하여 CPU로 가져왔더라도 바로 실행할 수 없는 경우(명령어를 실행하기 위해 추가적인 메모리 접근이 필요)에 거치게됨.
  • ex) 간접 주소 지정 방식

 

2) 인터럽트 (interrupt)

- CPU의 작업을 방해하는 신호
- 비동기 인터럽트와 동기 인터럽트가 있음.
 
(1) 동기 인터럽트 (synchronous interrupts) == 예외(execption)
- CPU에 의해 발생하는 인터럽트
- CPU가 명령어들을 수행하다가 예외적인 상황이 발생했을 때 발생함 
- 예외의 종류

  • 폴트 (fault) : 예외를 처리한 직후 예외가 발생한 명령어부터 실행을 재개하는 예외
  • 트랩 (trap) : 예외를 처리한 직후 예외가 발생한 명령어의 다음 명령어부터 실행을 재개하는 예외
  • 중단 (abort) : CPU가 실행 중인 프로그램을 강제로 중단시킬 수밖에 없는 심각한 오류를 발견했을 때 발생하는 예외
  • 소프트웨어 인터럽트 (software interrupt) : 시스템 호출이 발생했을 때

 
(2) 비동기 인터럽트 (asynchronous interrupts) == 하드웨어 인터럽트
- 주로 입출력장치에 의해 발생 
- CPU가 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 사용 
- 하드웨어 인터럽트 처리 순서

  1.  입출력 장치는 CPU에 인터럽트 요청 신호를 보냄
  2. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전에 항상 인터럽트 여부를 확인함.
  3. CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인함
    • CPU가 인터럽트 요청을 수용하기 위해 플래그 레지스터의 인터럽트 플래그가 활성화되어 있어야 함.
    • 인터럽트 플래그(interrupt flag) : 하드웨어 인터럽트를 받아들일지 여부를 결정
    • 인터럽트 플래그가 '불가능' -> 보통 요청 무시
    • 인터럽트 플래그가 '불가능'으로 되어 있더라도 무시할 수 없는 인터럽트 요청도 있음. 
    • 막을 수 있는 인터럽트(maskable interrupt) : 인터럽트 플래그로 막을 수 있음
    • 막을 수 없는 인터럽트(non maskable interrup) : 인터럽트 플래그로 막을 수 없음 
  4. 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업함. 
    • 현재 프로그램을 재개하기 위한 모든 내용을 스택에 저장
  5. CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행함.
    • 인터럽트 서비스 루틴 (ISR ; Interrput Service Routine) 
      • 인터럽트를 처리하기 위한 프로그램
      • 인터럽트 핸들러(interrupt handler)라고도 함.
      • 인터럽트를 처리하는 방법은 입출력장치마다 다르므로 각각의 ISR을 가짐.
    • 인터럽트 벡터 (interrupt vector)
      • 인터럽트 서비스 루틴을식별하기 위한 정보
      • 인터럽트 벡터를 통해 인터럽트 서비스 루틴의 시작 주소를 알 수 있기 때문에 CPU는 인터럽트 벡터를 통해 특정 인터럽트 서비스 루틴을 처음부터 실행할 수 있음.
  6. 인터럽트 서비스 루틴이 끝나면 4.에서 백업했던 작업을 복구해 실행을 재개함. 

 
 

Chap05. CPU 성능 향상 기법

5.1 빠른 CPU를 위한 설계 기법

1) 클럭

- 일반적으로 클럭 속도가 높은 CPU는 일반적으로 성능이 좋음.
-  Hz 단위로 측정됨.
- CPU는 계속 클럭속도를 유지하기보다는 고성능을 요하는 순간에 순간적으로 클럭속도를 높이고, 그렇지 않을 때 클럭 속도를 낮추기도 한다.
- 오버클락킹(overclocking) : 최대 클럭 속도를 강제로 끌어올리기
 

2) 코어와 멀티 코어

(1) 코어
- 전통적인 관점에서의 CPU : 명령어를 실행하는 부품이며, 원칙적으로 하나만 존재
- 오늘날의 CPU

  • '명령어를 실행하는 부품'에서 '명령어를 실행하는 부품을 여러 개 포함하는 부분'으로 명칭의 개념이 확장됨.
  • 코어(core) : '명령어를 실행하는 부품'

(2) 멀티코어
- 멀티코어(multi-core) CPU 또는 멀티코어 프로세서 : 코어를 여러 개 포함하고 있는 CPU
- CPU의 종류 : CPU 안의 코어 개수에 따라 싱글코어(1), 듀얼코어(2), 트리플코어(3), ... 도데카코어(12) 등이 있음.
- CPU의 연산속도가 꼭 코어 개수에 비례하진 않음.
- 코어마다 처리할 명령어들을 얼마나 적절하게 분배하느냐에 따라  CPU의 연산속도가 크게 달라짐. 
 

3) 스레드와 멀티스레드

(1) 스레드
- 스레드(thread) : 실행 흐름의 단위 [사전적 의미]
- 스레드의 종류

  • 하드웨어적 스레드 : CPU에서 사용
  • 소프트웨어적 스레드 : 프로그램에서 사용

(2) 소프트웨어적 스레드
- 정의 : 하나의 프로그램에서 독립적으로 실행되는 단위
 
(3) 하드웨어적 스레드
- 정의 : 하나의 코어가 동시에 처리하는 명령어 단위
- 여러 스레드를 지원하는 CPU는 하나의 코어로도 여러 개의 명령어를 동시에 실행할 수 있음.
- 논리 프로세서(logical processor)라고도 함.
 
(4) 멀티스레드 프로세서
- 멀티스레드(multithread) 프로세서 또는 멀티스레드 CPU : 하나의 코어로 여러 명령어를 동시에 처리하는 CPU
ex) 8코어 16스레드 : 8개의 코어, 코어 하나당 두개의 하드웨어 스레드 처리
- 하나의 코어로 여러 명령어를 동시에 처리하도록 하기 위해서 명령어를 처리하는 데 꼭 필요한 레지스터를 여러 개 갖도록 함.
 
 

5.2 명령어 병렬 처리 기법

1) 명령어 파이프라인

(1) 명령어 파이프라인 (instruction pipeline)

  1. 명령어 인출 (Instruction Fetch)
  2. 명령어 해석 (Instrcution Decode)
  3. 명령어 실행 (Execute Instruction)
  4. 결과 저장 (Write Back)

- 같은 단계가 겹치지 않으면 CPU는 각 단계를 동시에 실행할 수 있음.
- 명령어 파이프라이닝 (instruction pipelining) : 명령어들을 명령어 파이프라인에 넣고 동시에 처리하는 기법
 
(2) 파이프라인 위험 (pipeline hazard)
- 특정 상황에서는 성능 향상에 실패하는 경우가 있음.

  • 데이터 위험 (data hazard)
    • 명령어 간 '데이터 의존성'에 의해 발생
    • 이전 명령어를 끝까지 실행해야만 비로소 실행할 수 있는 경우
    • 데이터 의존적인 두 명령어를 무작정 동시에 실행하려고 하면 파이프라인이 제대로 작동하지 않음.
  • 제어 위험 (control hazard)
    • 주로 분기 등으로 인한 '프로그램 카운터의 갑작스러운 변화'에 의해 발생
    • 프로그램 실행 흐름이 바뀌어 명령어가 실행되면서 프로그램 카운터 값에 갑작스러운 변화가 생기면 명령어 파이프라인에 미리 가지고 와서 처리 중인 명령어가 필요 없어짐.
    • 분기 예측 (branch pipeline) : 프로그램이 어디로 분기할지 미리 예측한 후 그 주소를 인출하는 기술
  • 구조적 위험 (structural hazard)
    • 명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 같은 CPU 부품을 사용하려 할 때 발생 
    • 자원 위험(resource hazard)이라고도 함.

 

2) 슈퍼스칼라 (superscalar)

- CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조
- 슈퍼스칼라 프로세서 혹은 슈퍼스칼라 CPU : 슈퍼스칼라 구조로 명령어 처리가 가능한 CPU

  • 매 클럭 주기마다 동시에 여러 명령어를 인출할 수도, 실행할 수도 있어야 함.
  • 이론적으로 파이프라인 개수에 비례하여 프로그램 처리 속도가 빨라짐.
  • 파이프라인 위험 등의 예상치 못한 문제로 실제로는 반드시 파이프라인 개수에 비례해 빨라지진 않음.

 

3) 비순차적 명령어 처리 (OoOE ; Out-of-order execution)

- 정의
: 명령어를 순차적으로만 처리하지 않고 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 명령어 파이프라인을 멈추는 것을 방지하는 기법 
- 필요성

  • 파이프라인 위험과 같은 예상치 못한 문제들로 인해 이따금씩 명령어는 곧바로 처리되지 못하기도 함
  • 모든 명령어들을 순차적으로만 처리한다면 예상치 못한 상황에서 명령어 파이프라인을 멈추게 됨. 

- 비순차적 명령어 처리가 가능한 CPU는 명령어들이 어떤 명령어와 데이터 의존성을 가지고 있는지, 순서를 바꿔 실행할 수 있는 명령어에는 어떤 것이 있는지 판단할 수 있어야 함.
 
 

5.3 CISC와 RISC

1) 명령어 집합 (instruction set)

- CPU가 이해할 수 있는 명령어들의 모음
- 명령어 집합 구조(ISA ; Instruction Set Architecture)라고도 함.
- CPU마다 ISA가 다를 수 있음.
- ISA가 다르다 → CPU가 이해할 수 있는 명령어가 다름 →  어셈블러어도 달라짐.
- ISA는 CPU의 언어임과 동시에 CPU를 비롯한 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속이라고 볼 수 있음. 
 

2) CISC (Complex Instruction Set Computer)

(1) 특징
- 다양하고 강력한 기능의 명령어 집합 이용
- 명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용함.
- 메모리에 접근하는 주소 지정 방식도 다양해서 독특한 주소 지정방식이 있음.
 
(2) 장점
- 상대적으로 적은 수의 명령어로도 프로그램을 실행할 수 있음. -> 메모리 절약 가능
 
(3) 한계
- 명령어의 크기와 실행되기까지의 시간이 일정하지 않음.
- 명령어 하나를 실행하는 데 여러 클럭 주기를 필요로 함.
- 파이프라인이 효율적으로 명령어를 처리할 수 없음.
 

3) RISC (Reduced Instruction Set Computer)

(1) CISC의 한계로 알 수 있는 점
- 빠른 처리를 위해 명령어 파이프라인을 잘 활용해야 한다. 원활한 파이프라이닝을 위해 '명령어 길이와 수행 시간이 짧고 규격화'되어 있어야 함.
- 복잡한 기능을 지원하는 명령어의 사용 빈도가 낮으므로 '자주 쓰이는 기본적인 명령어를 작고 빠르게 만드는 것'이 중요함.
 
(2) 특징
- 고정 길이 명령어를 활용한다. (짧고 규격화된 명령어, 되도록 1클럭 내에 실행되는 명령어 지향)
- 명령어 파이프라이닝에 최적화되어 있음.
- 메모리에 직접 접근하는 명령어를 load, store 두 개로 제한

  • CISC보다 주소 지정 방식이 적은 경우가 많음.
  • 이러한 점에서 RISC를 load-store 구조라고도 부름

- 메모리 접근을 단순화, 최소화하고 레지스터를 적극적으로 활용함.

  • CISC보다 레지스터를 이용하는 연산이 많음.
  • 일반적인 경우보다 범용 레지스터 개수가 많음.

🤔 느낀 점

이번 주 내용도  한 번씩은 간단히 들어본 내용이 꽤 있었습니다. 다만, 평소에 관련 내용에 대해 '왜?'라는 생각을 종종 했는데 그 의문을 해결할 수 있었던 한 주였습니다.👍