
혼공단 10기 2주차 학습 기록
CPU 작동 원리
ALU

ALU는 레지스터로부터 피연산자를, 제어장치로부터 제어 신호를 받아들여 연산을 수행한다. 연산 수행 결과는 바로 메모리에 저장되지 않고 일시적으로 레지스터에 저장된다.
결괏값과 함께 플래그(flag)도 함께 내보내는데, 플래그는 플래그 레지스터에 저장되며 이 레지스터를 통해 연산 결과의 부호와 같은 추가 정보를 알 수 있다.
플래그(flag)
연산 결과에 대한 추가적인 상태 정보 ex) 부호 플래그(음수 또는 양수), 제로 플래그(결괏값 0 여부), 캐리 플래그(올림수나 빌림수 발생 여부), 오버플로우 플래그(오버플로우 발생 여부) etc.
제어장치

제어장치는 클럭, 수행할 명령어, 플래그, 제어 신호를 받아들이고 CPU 내부와 외부로 제어 신호를 보내기도 한다.
클럭(clock)
컴퓨터 부품이 작동할 때 사용되는 시간 단위 클럭 주기에 맞춰 명령어가 실행된다. (반드시 한 클럭마다 작동한다는 것 X)
레지스터(Register)
알아둬야 할 주요 레지스터는 8가지가 있는데, 프로그램 실행 과정을 알아보기 위해 4가지를 먼저 살펴보자.
-
프로그램 카운터(PC; Program Counter) 프로그램 카운터는 메모리로부터 읽어 들일 명령어의 주소를 저장한다.
-
명령어 레지스터(IR; Instruction Register) 명령어 레지스터는 메모리에서 읽어 들인 명령어를 저장한다.
-
메모리 주소 레지스터(MAR; Memory Address Register) 메모리 주소 레지스터는 메모리의 주소를 저장한다.
-
메모리 버퍼 레지스터(MBR; Memory Buffer Register) 메모리 버퍼 레지스터는 메모리와 주고받을 값을 저장한다.

메모리에 저장된 프로그램을 실행하는 과정
- 먼저 프로그램 카운터(PC)에 001이 저장된다. 여기서 001은 메모리에서 가져올 명령어가 속한 주소이다.
- 메모리 주소 레지스터(MAR)에 해당 주소(=001)를 보낸다.
- 주소 버스(address bus)를 통해 메모리 주솟값이, 제어 버스(control bus)를 통해 메모리 읽기 제어 신호가 메모리로 보내진다.
- 주소에 해당하는 명령어가 데이터 버스(data bus)를 통해 메모리 버퍼 레지스터(MBR)로 전달되고 프로그램 카운터는 1 증가하여 다음 명령어를 읽을 준비를 한다.
- 메모리 버퍼 레지스터에 저장된 값이 명령어 레지스터(IR)로 이동한다.
나머지 4종류의 레지스터는 아래와 같다.
-
범용 레지스터(General Purpose Register) 다양한 상황에서 사용할 수 있는 레지스터로, 데이터와 주소를 모두 저장할 수 있다.
-
플래그 레지스터(Flag Register) 연산 결과나 CPU 상태 부가 정보 등을 저장한다.
-
스택 포인터(Stack Pointer) 스택 최상단 위치를 저장한다.
-
베이스 레지스터(Base Register) 기준 주소의 역할을 한다.
명령어 사이클(Instruction Cycle)과 인터럽트(Interrupt)

프로그램 속 명령어들이 반복하며 실행되는 일정한 주기를 명령어 사이클이라 한다. 일반적으로 명령어를 가져오는 인출 사이클(Fetch cycle)과 명령어를 실행하는 실행 사이클(Execution cycle)을 반복한다. 인출 후 곧바로 실행할 수 없어 한 번 더 메모리에 접근해야 하는 경우에는 간접 사이클(Indirect cycle)을 거친다.
인출, 실행, 간접 이외에 명령어 사이클에서 고려해야 할 상황이 하나 더 있다. CPU가 수행 중인 작업을 방해하는 인터럽트(Interrupt)이다. 인터럽트는 크게 동기 인터럽트(Synchronous Interrupts)와 비동기 인터럽트(Asynchronous Interrupts)로 나눌 수 있는데, 전자는 CPU에 의해 발생하는 것을 말하고 후자는 입출력 장치에 의해 발생하는 것을 말한다.
CPU 성능 향상 기법
클럭(Clock)
속도가 빠른 CPU를 설계하기 위해서는 클럭 속도를 높이면 된다. 컴퓨터 내 부품들은 클럭이라는 일정한 주기에 맞춰 실행되는데 이 속도가 빠르다는 것은 부품이 빠르게 작동한다는 말과도 같기 때문이다. 그래서 일반적으로는 클럭 속도가 높은 CPU가 성능이 더 좋지만, 어느 정도 한계가 존재하기 때문에 오로지 클럭 속도에만 성능을 기댈 수는 없다.
코어(Core)와 스레드(Thread)

클럭 속도 외에 CPU 성능을 높이는 방법으로는 코어와 스레드가 있다. 먼저 코어(core)란, CPU 내에서 명령어를 실행하는 부품으로 앞서 설명했던 CPU의 정의와 동일하다고 보면 된다. 오늘날의 CPU는 명령어를 실행하는 부품 그 자체라기보다는 코어를 여러 개 포함하는 부품으로 확장된 것이다.
일반적으로 코어가 하나 있는 것 보다 여러 개 있을 때 CPU의 성능이 좋다. 여러 개의 코어를 포함하고 있는 CPU를 멀티코어(multi-core)라 부른다. 그러나 코어마다 처리할 연산이 적절히 분배되지 않는다거나 처리할 작업량보다 코어 수가 지나치게 많은 경우, 성능이 코어 수에 꼭 비례하게 증가하는 것은 아니므로 연산을 적절히 분배하는 것이 가장 중요하다. (like 팀플..)

스레드(thread)는 하드웨어적 스레드와 소프트웨어적 스레드로 구분할 수 있다. 하드웨어적 스레드는 코어 하나당 동시에 처리할 수 있는 명령어 단위를 말한다. 하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 멀티 스레드(multithread)라 부르며, 예로 8코어 16스레드인 경우 한 코어당 2스레드를 처리한다는 것을 알 수 있다.
소프트웨어적으로 정의하는 스레드는 하나의 프로그램 내에서 독립적으로 실행되는 단위를 말한다. 프로그램의 여러 기능이 동시에 수행하도록 하고 싶다면 기능마다 각각의 스레드로 만들면 된다. 때문에 1코어 1스레드라 할지라도 소프트웨어적으로는 스레드를 여러 개 수행할 수 있다.
기본 미션
p.125
2. 설명에 맞는 레지스터를 보기에서 찾아 빈칸을 채워 보세요.
[보기] 프로그램 카운터, 명령어 레지스터, 플래그 레지스터, 범용 레지스터
- ( 1 ): 연산 결과 혹은 CPU 상태에 대한 부가 정보를 저장하는 레지스터
- ( 2 ): 메모리에서 가져올 명령어의 주소를 저장하는 레지스터
- ( 3 ): 데이터와 주소를 모두 저장할 수 있는 레지스터
- ( 4 ): 해석할 명령어를 저장하는 레지스터
정답:
- 플래그 레지스터
- 프로그램 카운터
- 범용 레지스터
- 명령어 레지스터
p.155
4. 다음 그림은 멀티코어 CPU를 간략하게 도식화한 그림입니다. 빈칸에 알맞은 용어를 써 넣으세요.

정답: 코어(core)
추가 미션
Q. 코어와 스레드, 멀티 코어와 멀티 스레드의 개념을 정리하기
코어(Core)와 멀티 코어(Multi-Core)
- 코어는 CPU 내에서 명령어를 실행하는 부품이며 CPU 내에 여러 개 존재할 수 있음
- 여러 개의 코어를 포함하는 CPU를 멀티 코어라고 함
- 처리 속도: 단일 코어 < 멀티 코어
- CPU 연산 속도가 꼭 코어 수에 비례해 증가하는 것 X
- 처리 작업량보다 코어 수가 더 많으면 성능에는 큰 차이 X => 코어마다 처리할 명령어들을 적절하게 분배하는 것이 중요
스레드(Thread)와 멀티 스레드(Multi-Thread)
- 스레드는 하드웨어적 스레드와 소프트웨어적 스레드로 구분 가능
- 하드웨어적 스레드: ‘코어 하나당 동시에 처리할 수 있는 명령어 단위’
- 소프트웨어적 스레드: ‘하나의 프로그램 내에서 독립적으로 실행되는 단위’
- 하드웨어적 스레드에서 하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 멀티 스레드라고 함
- 소프트웨어적 스레드에서 동시에 여러 기능을 수행하도록 하고 싶으면 기능마다 스레드로 만들면 됨
References
[📚book] 혼자 공부하는 컴퓨터 구조 + 운영체제