Computer Science

[Computer Science] Arithmetic Logic Unit(ALU)는 어떻게 작동할까

Sergemeow 2022. 11. 29. 22:51

컴퓨터의 작동을 이해하기 위해서는 많은 추상화 개념들을 이해해야한다. 

이전 포스팅 중 하나에서 Or, Xor, and 게이트들을 추상화한 그림으로 표현하였는데, 여기서 더 나아가 이번 포스팅에서는 컴퓨터가 연산을 하기 위한 ALU의 작동 원리에 대해 알아본다.

 

ALU란 Arithmetic & Logic Unit, 즉 산술, 논리장치를 의미한다. 먼저 산술 기능에 대해 보자.

 


모든 산술의 기본인 덧셈을 풀어보자.

단일비트의 2진수 두개를 더해본다고하자. 

0+0=0, 1+0=1, 0+1=1 이다. 이전에 알아본 Xor게이트의 결과값과 같다는걸 볼 수 있다. 

올림이 있을 때 약간 복잡해진다. 1+1=10이 되는데, 보다시피 1의자리는 0이기에 역시 Xor게이트의 결과값과 같으나 2의 자리에 올림수가 있어 10을 결과값으로 가진다. 

달리 말하자면 단일 비트의 Input A와 Input B가 있을 때, Output은 합(1의자리)와 올림수(2의자리)로 두가지 값을 가지는 것이다. 1의 자리는 Xor 게이트를 통해 결과 값을 도출할 수 있고, 2의 자리는 And 게이트를 통해 결과 값을 도출할 수 있다. 두개의 Input이 모두 참(1)이어야 And 게이트의 output이 참(1)이 되기 때문이다. 

이를 도식화하면 위와 같다. 

 

이 구조는 반가산기(half-adder)라고 불린다.

 

반가산기가 있으면 전가산기(full-adder)도 있겠네? 

맞다. 

간단한 예시로 11+11을 보자. 1의 자리는 1+1로 0의 값을 가지고 2의 자리에 1을 올려준다. 2의 자리는 그럼 1+1+1로 3비트를 더해야한다. 

그렇기에 전가산기는 위와 같은 구조를 가진다. 

이로 인해 Input들에 따라 출력되는 값은 위와 같다.

 

반가산기와 전가산기를 사용하면 1비트 뿐 아니라 더 큰 수의 연산도 가능해진다. 

아래는 도식화된 두개의 8비트 숫자 덧셈이다.

이진수로 표현된 170과 51을 더하는 것이다. 먼저 두 수의 1의 자리수를 반가산기에 넣는다. 여기서 나온 합(sum)은 결과값의 1의 자리가 되고, 만약 올림수(carry)가 있다면 두 수의 2의 자리수들을 더할 때 올림수까지 같이 더해준다. 2의 자리수를 더하여 올림수가 있으면 4의 자리수들을 더할 때 해당 올림수도 같이 더해준다. 이와 같이 128의 자리까지 쭉 진행하면 된다. 

알다시피 8비트로 표현할 수 있는 최대의 수는 256가지 - 0부터 255까지 - 이기 때문에 만약 덧셈의 결과가 255보다 크다면 이는 제한된 비트로 표현할 수 없게 되고, 오버플로우를 발생시킨다. 오버플로우가 발생하면 예측불가능한 작동을 하거나 에러를 일으키게된다. 

8비트 게임인 팩맨의 스테이지 255를 깨고나면 오버플로우 발생으로 화면이 깨지는 원인이다.

깨진 화면을 보는건 팩맨 고수들의 통과의례였다.

다른 연산으로, ALU는 뺄셈, Increment(1을 더함), Decrement(1을 뺌) 등 여러 연산이 가능하다.

간단한 임베디드 등에 사용되는 저렴한 ALU에서는 곱셈과 나눗셈은 별도로 연산되지 않는데, 곱셈은 곱하는 수만큼 해당 수를 더하는 방식으로, 나눗셈은 나누는 수만큼 해당 수를 빼는 방식으로 연산되기 때문이다. 이 방식은 다소 느리기 때문에 스마트폰이나 PC의 ALU는 별도의 곱셈과 나눗셈 전용 회로를 가진다.


ALU의 논리유닛은 쉽게말해 Xor, or, and 같은 논리 작용을 한다. 

ALU가 할 수 있는 수많은 논리연산 중 하나만 예로 보자. 

입력 숫자가 0일 때 1을 출력, 즉 입력된 숫자가 0인지 확인하는 논리연산을 만들어보자.

먼저 숫자의 모든 자리수들을 Or게이트로 연결한다. 이리하여 숫자의 어느 한자리라도 1이 있다면 결과값은 0이 되지 않을 것이다. 그리고 결과값을 not 게이트로 연결한다. 이렇게하면 모든 자리수가 0일 때 not 게이트로 0이 입력되고 최종적으로 1이 출력되게 되는 것이다.

 


ALU에는 두개의 Input외에도 Operation Code도 입력된다. 8비트 ALU를 예로들면, Operation Code는 4비트로 표현되는데, 1000은 덧셈.. 과 같은 식이다. ALU는 특정 상태나 상황에 따라서 특정 비트로 신호를 출력하기도 하는데 이를 Flag라고 부른다. 예를 들어, 두개의 Input에서 하나의 수로 하나의 수를 뺐을 때 결과값을 앞서 말한 입력수가 0인지 확인하는 회로에 넣어서 0인지 확인할 수 있다. 해당값이 0이라면 두개의 Input이 같은 수라는 의미가 될 것이고, 이는 유용하게 사용된다. 이외에도 해당값이 0보다 작으면 음수가 되고(즉, Input의 두가지 수 중 어떤게 더 큰지 알 수 있다), 해당값이 너무 크면 Overflow가 되는데, 이 0, 음수, 오버플로우 플래그들은 빈번하게 사용된다. 

 

ALU 개념은 다소 어렵게 느껴졌는데, 그래서 공부하는데에도 시간이 좀 소요되었었다.

다음은 ALU가 모여 어떻게 쓰여지는지 서술해볼까한다.