CPU가 작동하는 원리
https://youtu.be/BSDRpQr85qk?si=WGS5Jg3wtJ87AqW5
유튜브 '널널한 개발자 TV'님의 강의를 토대로 작성된 글입니다.
디지털 회로
CPU는 전자식 계산기라고 할 수 있으며 산수, 사칙 연산을 수행한다. 또한, CPU는 트랜지스터라는 반도체로 구성되어 있고 반도체는 전기가 흐르는 도체(1) 흐르지 않는 부도체(0)의 성격을 조건에 따라 선택할 수 있다.
즉, CPU는 전류의 흐름이 흐르거나, 흐르지 않거나의 따라 연산을 수행할 수 있는 것이다.
논리 게이트
CPU는 디지털 회로로 이루어져 있고 디지털 회로는 여러개의 논리 게이트를 가진다. 그 중 대표적으로 AND, OR, XOR, NOT이 있다.
- AND 게이트(논리의 곱) : 둘 다 참이 아니라면, 모두 거짓이다.
- OR 게이트(논리의 합) : 둘 중 하나라도 참이라면, 참이다.
- XOR 게이트(배타적) : 둘의 값이 서로 달라야 참이다.
- NOT 게이트 : 입력과 반대되는 결과값이 출력된다.
💡A, B는 스위치이다. -> A, B는 각 1bit
덧셈 하는 방법
반가산기
논리 게이트를 조합해 가산기를 만들고 덧셈 연산을 할 수 있다. 1bit 덧셈 연산을 하는 가산기를 반가산기라고 한다. 결과는 1bit 혹은 2bit의 값이 나오게 된다.
위 그림에서 S는 연산 결과를 말하고, C(Carry)는 연산 결과에 대한 자리올림을 말한다. 즉, A의 값이 1이고 B의 값이 1일 때 AND에 대한 결과값은 2가 된다. 하지만 2진수로 표현해야 하기 때문에 2가 아닌 10으로 자리 올림을 하라는 소리이며 C의 값은 1이 된다.
💡반가산기의 단점
1의 자리수를 넘어가면 자리 올림이 발생한다. 그러면 A와 B, 1bit 두개의 합이 아니라 자리올림까지 1bit 3개의 합이 발생한다.
전가산기
반가산기의 단점을 보안할 수 있는 가산기도 3개의 비트를 합할 수 있는 가산기이다. 전가산기는 보통 병렬로 이어 다수의 비트 연산을 수행할 수 있다. ( 4비트 연산을 할 경우 4개의 전가산기를 사용한다.)
뺄셈하는 법
보수
보수란 보충해주는 수를 의미하며, 1에 대한 10의 보수는 9, 4에 대한 15의 보수는 11의 개념이다. 1에 대한 2의 보수는 1이다.
뺄셈하는데 보수가 필요한 이유는 보수를 이용하면 뺄셈도 덧셈으로 연산을 할 수 있기 때문이다.
CPU는 2진수를 사용한다. 2진수의 보수는 1의 보수에 1을 더하면 구할 수 있으며 1의 보수는 1은 0으로, 0은 1로 변경하면 된다.
이처럼 컴퓨터는 보수를 이용하여 덧셈으로 뺄셈을 구현한다.
곱셈과 나눗셈
곱셈은 여러번 같은 수를 덧셈 한 것과 마찬가지이기 때문에 덧셈으로만 연산이 가능하다. 나눗셈도 마찬가지로 여러번 같은 수를 뺄셈한 것과 마찬가지이고 보수를 이용하면 뺄셈은 덧셈으로 연산 가능하기 때문에 덧셈으로만 연산이 가능하다.
단, 나눗셈의 경우 논리적 함정이 존재하니 주의해야 한다. 나눗셈은 값이 0이 되거나, 나누는 수보다 작으면 멈춘다. 그렇다면 하나의 수를 0으로 나누면 어떻게 될까?
멈춤 조건에 부합하지 않아 연산이 무한대로 반복하게 되며 CPU 과부하 문제까지 이어지니 주의해야 한다.
곱셈 하는 법
곱셈은 여러 번 덧셈을 하면 된다고 했지만 해당 방법은 비효율적이라 다른 매커니즘인 shift 연산을 이용한다.
- 5를 4비트로 표현하면 '0101'이 된다.
- 4비트의 '0101'를 왼쪽으로 shift하고 맨 오른쪽을 '0'으로 채운다.(padding)
- 5비트로 자리올림된 수를 버리면 '1010'이 되고 10의 진수로 표현하면 10이라는 값이 나온다.
- 왼쪽으로 한 칸 밀면 X2, 두 칸 밀면 X4
나눗셈 하는 법
나눗셈도 곱셈과 마찬가지로 shift 연산을 이용할 수 있다. 곱셈이 왼쪽으로 shift였다면 나눗셈은 오른쪽으로 shift 한다.
- 6을 4비트로 표현하면 '0110'이다.
- 4비트의 '0110'을 오른쪽으로 shift하고, 왼쪽에 '0'을 Padding한다.
- 오른쪽 수는 버린다.
- 4비트의 '0011'은 10의 진수로 표현하면 3이라는 값이 나온다.
- 오른쪽으로 한 칸 밀면 /2, 두 칸 밀면 /4
한가지 의문🤔
한칸 씩 밀면 2배수로 값이 생기는데 그럼 3으로 곱하거나 나눈건 어떻게 구하지?