[CS] CPU의 연산

J·2022년 6월 17일
0
post-thumbnail

CPU란?

CPU (중앙처리장치)는 컴퓨터 전체 시스템을 통제하고 프로그램의 연산을 실행, 처리하는 가장 핵심적인 컴퓨터의 제어 장치로 인간의 두뇌와 같은 역할을 한다.

CPU는 산술논리 연산 장치(ALU, Arithmetic Logic Unit), 제어 장치(CU, Control Unit), 레지스터(Register)로 구성되어있다.

CPU는 PC의 여러 장치들의 연산과 제어를 관장하기 때문에 CPU의 성능이 곧 PC의 속도를 결정한다.

- ALU (Arithmetic Logic Unit, 산술 논리 장치): 덧셈, 뺄셈 같은 두 숫자의 산술 연산과 배타적 논리합(XOR), 논리곱(AND), 논리합(OR) 같은 논리연산을 계산하는 장치
- CU (Controller Unit, 제어장치): 명령어를 해독하여 처리할 수 있게 제어신호를 전송하여 수행하고 제어하는 장치
- Register: CPU내에서 처리할 명령, 연산에 사용할 값, 연산결과를 일시적으로 기억하는 장치(휘발성)

CPU의 연산

CPU는 프로그램 명령을 해석하는 제어 장치와 숫자를 연산하는 산술 논리 장치(ALU)를 통해 명령 받은 연산을 수행한다.

1. 덧셈

덧셈을 하기 위해 필요한 파라미터는 연산할 숫자 A와 B, 자리올림이 되는지 판단해줄 C 총 3개이다.

자리올림(carrying), 자리내림(borrowing)의 경우 전가산기를 통해 저장되고 더해진다.


4bit의 뎃셈을 수행하기 위해서는 위와 같이 4개의 전가산기(Full Adder)가 필요하고, 각 연산을 수행한 결과는 다음 자리수의 input으로 들어가게 된다.

a = 3;
b = 2;
a + b = 5

    1  -> carrying
  0 0 1 1 -> 3
+ 0 0 1 0 -> 2
----------
  0 1 0 1 -> 5

2. 뺄셈

직접적인 뺄셈의 수행할 수 없기 때문에 보수(Complement)를 이용해 덧셈으로 계산한다.

보수: 각 자리 숫자의 합이 자리올림이 되게 하는 최솟값
a + (b의 보수) == a - b

2의 보수 == 1의 보수 + 1
A + (~B + 1) == X
a = 3
b = 2
a - b = 1

2의 보수
0 0 1 0(b)  ->   1 1 0 1 (~b)  ->   0 0 1 1  (a)
               + 0 0 0 1 (+1)     + 1 1 1 0  (b의 보수)
			  ----------           ---------
                 1 1 1 0            0 0 0 1  -> 결과 1

3. 곱셈

곱셈은 가산기(adder)와 계수기(counter)를 통해 기본적인 원리로 구현한다. 피승수(곱해지는 수)를 승수(곱하는 수) 횟수만큼 더하는 것이다.

a = 3
b = 2

a + a (b 만큼 더함)
3 + 3 == 6

간단한 승수 및 피승수를 곱하는 경우에는 이 방법을 쉽게 사용할 수 있으나, 32bit 이상 큰 수를 곱할 경우 2의 32제곱(4,294,967,296)회까지 덧셈을 수행해야 할 수도 있다. 이러한 수의 계산은 비현실적이기에 Shifter를 사용한다.

 0 1 0 1 (3)
 
 1 0 1 0 (6) << 왼쪽으로 한 칸씩 이동, 오른쪽에는 0이 채워진다. (Padding)
 
 왼쪽으로 한칸 밀면 곱하기 2, 두 칸 밀면 곱하기 4가 된다.

4. 나눗셈

나눗셈은 몫이 제수(나누는 수) 미만이 될 때까지 피제수(나누어지는 수)에서 제수를 앞서 설명했던 뺄셈을 통해 구현한다.

a = 9
b = 3

9 - 3 == 6 >= 3 -> true
6 - 3 == 3 >= 3 -> true
3 - 3 == 0 >= 3 -> false

뺄셈 횟수(몫) == 3
최종 연산 결과(나머지) == 0

만약 0으로 나누게 되면 어떤 결과가 발생할까?
a = 5
b = 0

5 - 0 == 5 >= 0 -> true
5 - 0 == 5 >= 0 -> true

무한 루프 발생

이러한 이유 때문에 ArithmeticException: / by zero와 같은 예외가 발생하는 것이다.

나눗셈도 곱셈과 동일하게 큰 수를 연산할 경우 Shifter를 사용한다.

0 1 1 0 (6)

0 0 1 1 (3) >> 오른쪽으로 한 칸씩 이동, 왼쪽에는 0이 채워진다. (Padding)

0개의 댓글