티스토리 뷰

CPU의 기능

CPU'프로그램 수행'이라는 컴퓨터의 중추적 기능을 수행한다. 이를 위해 CPU는 메모리에 저장되어 있는 프로그램 코드인 명령어들을 실행하고 이러한 명령어들을 수행하기 위하여 여러 세부적인 동작들을 순서대로 나열하여 진행한다.

명칭 설명
명령어 인출(Instruction fetch) 메모리로부터 명령어 읽기
명령어 해독(Instruction decode) 수행할 동작을 결정하기 위해 명령어 해독
데이터 인출(Data fetch) 명령어  실행을 위해 데이터가 필요한 경우, 메모리 혹은 I/O 장치에서 데이터를 읽기
데이터 처리(Data process) 데이터에 각 연산을 수행
데이터 저장(Data store) 결과 저장

1, 2번 동작은 모든 명령어의 공통 수행 과정이다. 하지만 3~5번은 동작들은 필요에 따라 수행되지 않을 수 있다.

 

 


CPU의 기본 구조

CPU는 크게 3가지 구성 요소로 이루어져 있다.

산술논리연산장치 (Arithmetic and Logical Unit: ALU)

ALU는 각 산술 연산 및 논리 연산을 수행하는 회로로 이루어진 하드웨어 모듈이다. 여기서 산술 연산덧셈, 뺄셈, 곱셈, 나눗셈을 말하며, 논리 연산AND, OR, NOT 연산 등이 있다.

레지스터 세트 (Register set)

레지스터는 CPU 내부에 위치한 기억장치로, 액세스 속도가 컴퓨터 기억장치 중 가장 빠르다. 그러나 복잡한 내부 회로로 비교적 큰 공간이 필요하여 대용량의 레지스터를 CPU 내부에 포함시키기 어렵다. 하여 지정된 용도로만 사용되며 특수한 목적과 일반 목적 레지스터로 나뉘어 사용된다.

제어 유니트 (Control unit)

제어 유니트는 프로그램 명령어(코드)를 해석하고, 이를 실행하기 위해 제어 신호(Control signal)들을 순차적으로 발생시키는 하드웨어 모듈이다. 즉, 명령어 실행에 필요한 정보의 전송 통로(방향)를 지정하고, CPU 내부 요소들과 시스템 구성 요소들의 동작 시간을 결정한다.

CPU가 제공하는 명령어가 많을수록 제어 신호의 종류와 발생 시간의 차이가 늘어난다. 이는 제어 유니트 회로를 더욱 복잡하게 만들기에 마이크로프로그래밍과 같은 제어 유니트 동작 소프트웨어를 사용한다.

 

단, 마이크로프로그래밍을 사용하면 명령어 시행 시간이 길어지기에 최근에는 하드웨어만으로 명령어 실행이 가능하도록 명령어 수를 최소화하여 명령어 형식을 단순화하는 RISC(Reduced Instruction Set Computer) 설계 개념이 많이 사용된다.

데이터와 제어 신호들CPU 내부 버스(CPU internal bus)로 전달되며, 이 버스는 ALU와 레지스터들 간 데이터 이동 선, 주소 선, 제어 유니트로부터 발생한 제어 신호 선으로 구성된다. 이러한 내부 버스 선들외부 시스템 버스와 직접 연결되지 않는다. 반드시 버퍼 레지스터 혹은 인터페이스 회로를 통해서만 시스템 버스와 접속된다.



명령어 실행

CPU는 기억장치에 저장되어 있는 명령어들을 인출하여 실행한다. 명령어는 "연산 코드(Operation code) + 오퍼랜드(operand)"로 구성된다.

 

📢 잠깐만! 명령어란 뭐죠?

명령어란 CPU가 프로세스의 작업을 수행하기 위해 어떤 일을 해야 하는지 알려주는 것이다. 하여 게임과 같은 복잡한 작업에는 복잡한 명령어가 생성될 수 있다. 즉, 각 프로세스마다 사용되는 명령어가 다르다.

 

명칭 설명
연산 코드 (Operation code) 어떤 연산을 수행할 것인지 표기하는 임의의 숫자
오퍼랜드 (Operand) 실제 명령어를 수행할 메모리 주소 위치

https://velog.io/@hyunji015/컴퓨터-구조-명령어의-구조

 

※ 오퍼랜드의 개수에 따라 사용처가 달라지기도 하는데 이는 나중에 다뤄볼까 한다.

 

여기서 연산 코드가 정수로 배정되면 각 프로세스마다 어떤 연산을 언제 할 것인지 번호를 매겨 연산 명령어를 호출한다. 예를 들면 다음과 같다.

 

명령어 번호 설명
LOAD 1 연산 코드에 1번이 지정되면 오퍼랜드 주소 값의 데이터를 로드한다.
ADD 2 연산 코드에 2번이 지정되면 오퍼랜드 주소 값의 데이터에 덧셈연산 한다.
JUMP 3 연산 코드에 3번이 지정되면 오퍼랜드 주소 값에 지정된 다른 명령어로 이동한다.

 

 


 

 

CPU가 한 개의 명령어를 실행하는 데 필요한 명령어 사이클(Instruction cycle)은 메모리로부터 명령어를 읽는 명령어 인출(instruction fetch) 단계와 명령어 실행(instruction execution) 단계로 나뉜다.

 

명령어 사이클 = 명령어 인출 + 명령어 실행


각 단계는 부사이클(subcycle)로 구분되어 인출 사이클(fetch cycle)과 실행 사이클(execution cycle)로 구분된다. 명령어 사이클은 CPU가 프로그램 실행 순간부터 전원 종료, 회복 불가 오류 발생, 중단될 때까지 반복 수행한다.

이러한 명령어를 실행하기 위해서는 기본적으로 CPU 내부 레지스터 구조를 알아야 한다.


레지스터 구조

https://www.knowcomputing.com/types-and-functions-cpu-registers/

 

 

1. 프로그램 카운터 (Program counter: PC)

프로그램 카운터는 CPU가 다음에 인출할 명령어의 주소를 가지는 레지스터이다.

PC는 일반적으로 CPU 코어 개수만큼 생성된다. 즉, 각 코어가 독립적으로 자신만의 PC를 가진다.

프로세스의 수가 많아진다면 스케줄링을 통해 실행 중인 프로세스를 전환하며 다른 프로세스의 PC를 다시 업데이트하고 다음 명령어를 실행한다. 그렇기에 여러 프로세스가 완벽히 동일한 작업을 수행하여도 CPU는 각 프로세스마다 독립적인 PC가 생성한다.

 

명령어가 인출되면 자동으로 1씩 증가하며 다음 명령어 주소를 가리키게 한다. 여기서 1은 한 명령어가 가지는 주소 단위의 크기이다.

 

좀 더 간편하게 설명하면, 명령어 배열이 있고 반복문으로 가장 앞에서부터 명령어가 수행할 때마다 1씩 증가하며 다음 명령어를 수행하는 것과 같다. 물론 명령어의 크기가 2가 필요하다면 2씩 증가하기도 한다.

 

2. 명령어 레지스터 (Instruction register: IR)

가장 최근 인출된 명령어가 저장되는 레지스터이다. 명령어를 캐싱하는 것과 같은 역할이다.

 

3. 누산기 (Accumulator: AC)

데이터를 일시적으로 저장하는 레지스터이다. 해당 레지스터의 비트 수는 CPU의 단어 길이와 같다.

 

누산기에는 데이터 연산 과정에서 발생하는 임시 값들이 저장되게 된다. 예를 들면 $1+2+3$에서 $1+2$의 결과 값을 누산기에 저장하고 임시 저장된 값과 다음 값을 더하는 것과 같은 연산을 진행한다.

 

4. 메모리 주소 레지스터 (Memory address register: MAR)

PC에 저장된 명령어 주소가 시스템 주소 버스로 출력되기 전 일시적 저장되는 주소 레지스터이다.

 

CPU가 메모리에서 데이터를 읽기/쓰기를 진행할 메모리 주소 정보를 담는다. 해당 레지스터의 출력 선들이 주소 버스와 직접 통신한다.

 

5. 메모리 버퍼 레지스터 (Memory buffer register: MBR)

메모리에 저장될 데이터 혹은 메모리에서 읽은 데이터가 임시 저장되는 버퍼 레지스터이다. 해당 레지스터의 입출력 선들은 데이터 버스와 직접 통신한다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함