티스토리 뷰

인간은 어떻게 컴퓨터라는 복잡한 기계를 만들 수 있었을까?

개요

산업혁명을 통해 인간은 인간의 힘을 대신하는 기계를 만들었습니다.  그 다음에 인류는 인간의 머리(계산, 논리)를 대신하는 기계인 컴퓨터를 만들게 됩니다. 컴퓨터는 우리가 만든 가장 복잡한 도구이며 기계입니다. 또한 컴퓨터는 이제 우리 생활과 도저히 땔 수 없는 존재입니다. 컴퓨터가 어떻게 만들어졌는지 궁금하지 않나요? 

어떻게 사람은 인간의 머리를, 논리를 대신하는 기계를 만들 수 있었을까요? 그 핵심 개념을 살펴봅시다.


수학적 개념의 탄생

조지 불(George Boole)

컴퓨터를 탄생시킨 수학적 개념은 조지 불생각의 법칙(The Laws of Thought)이라는 논문에서 시작됩니다.

조지 불 (출처 : 위키피디아)

이 논문에서 조지 불은 참인지 거짓인지 판별할 수 있는 문장인 명제(Proposition : Declarative sentence that is either true or false)개념을 제시하고
인간의 모든 생각은 명제와 명제를 AND, OR, NOT으로 결합하여 표현할 수 있다.”는 충격적인 제안을 합니다.

이 제안은 엄밀함을 추구하는 수학계에서 비판받지만 인간의 논리적인 생각에 한해서 이 주장이 사실이라는 것이 증명되었습니다.

조지 불은 위 주장을 바탕으로 논리를 체계적으로 다루기 위해 명제의 참과 거짓은 각각 이진값인 1과 0에 대응시키고 부울 대수(Boolean Algebra)라는 개념을 만들어냅니다.

부울 대수(Boolean Algebra)

부울 대수에서는 0과 1의 집합에서 AND, OR, NOT 연산을 정의하고 정리를 체계화합니다. 이 부울 대수는 복잡한 자동장치 설계를 위한 수학적 기반을 제공합니다. 어떻게 부울 대수가 복잡한 자동장치 설계에 도움을 줄까요?

댐과 논에 공급되는 물을 제어하여 수위를 조절하는 자동 시스템을 생각해봅시다.

이 시스템은 아래 두가지 기능을 수행합니다.

  • 댐수위 높은데 비가오면 수문연다.
  • 논에 물이 적으면 수문을 연다.

자동 수위 조절 시스템

이제 각 센서 상태와 수문의 상태를 명제로 나타낼 것입니다.

x : 댐의 수위가 높다.
y : 비가 온다.
z : 논에 물이 충분하다.
F : 댐의 수문을 연다. (output)

각 센서의 상태에 대한 수문의 상태(output)을 진리표로 나타내봅시다.

x y z F
1 1 1 1
1 1 0 1
1 0 1 0
1 0 0 1
0 1 1 0
0 1 0 1
0 0 1 0
0 0 0 1

이 진리표는 부울식으로 다음과 같이 나타낼 수 있습니다. 따라서 아래와 같은 회로로 표현할 수 있습니다.

자동 수위 조절 기능을 하는 회로

위에서 간략히 보인 자동장치의 설계 예시에서 진리표를 부울 대수를 통해 부울 함수로 간략히 나타낼 수 있었고 AND, OR, NOT을 사용해서 회로로 표현할 수 있었습니다. 즉 왜 부울대수가 복잡한 자동장치 설계에 수학적 기반을 제공하는지 살펴볼 수 있었습니다.

이와 같이 자동장치를 설계(automata design)하는 것이 부울대수 문제를 푸는 것같은 문제라는 깨달음은 정보 이론의 아버지로 불리는 클러드 섀넌이 MIT에서 석사과정의 논문으로 처음 발표했습니다.

클러드 섀넌(출처 : 위키피디아)

이후 주먹구구식이였던 자동장치 설계가 체계화 되어 디지털 논리 설계가 탄생했습니다.


디지털 논리 설계

디지털 논리 설계(Digital Logic Design)란 AND, OR, NOT으로 유용한 자동장치를 만드는 체계적인 방법입니다.

체계적인 방법이란 다음 과정을 따르는 것을 말합니다.

  1. 인풋과 아웃풋을 정한다.
  2. 진리표를 만든다.
  3. 진리표를 부울 함수로 간략히 나타낸다.
  4. 회로로 표현한다.

이 과정은 위에서 본 댐과 논의 자동 수위조절 시스템 설계에서 확인할 수 있습니다.

CPU 만들기

이제 디지털 논리 설계를 통해 컴퓨터에서 가장 중요한 부품인 CPU를 만드는 과정을 진행해봅시다.

CPU 내부는 CU(Control Unit), ALU(Arithmetic logic unit), 레지스터로 구성되어있습니다. 이 중 ALU는 CPU에서 논리 연산(합, 곱, 빼기, 나누기 등)을 담당하는 장치로 가장 중요한 역할을 합니다.

요즘 사용되는 64비트 운영체제는 CPU 내부 레지스터의 크기가 64비트인 것을 말하는데 ALU에서도 한번에 64비트의 논리 연산을 처리합니다.

1001010101101010010101011101101000101001000101010001010010010100(64비트 예시)

2비트 ALU

64비트 논리 연산을 만들기 전에 먼저 2비트 덧셈 부분만 디지털 논리 설계의 체계적인 설계 방법을 따라 만들어봅시다.

  1. input, output 정하기

Input입니다.
output 입니다.

  1. 진리표 만들기

진리표의 행은 개의 행으로 구성될 것입니다.

0 0 0 0 0 0
0 0 0 1 0 1
0 0 1 0 1 0
0 0 1 1 1 1
0 1 0 0 0 1
0 1 0 1 1 0
0 1 1 0 1 1
0 1 1 1 0 0
1 0 0 0 1 0
1 0 0 1 1 1
1 0 1 0 0 0
1 0 1 1 0 1
1 1 0 0 1 1
1 1 0 1 0 0
1 1 1 0 0 1
1 1 1 1 1 0
  1. 진리표를 부울 함수로 간략히 나타낸다.


위 4변수 진리표로 부터 부울함수를 손으로 구하려면 4차원 카르노맵을 그리면 됩니다.

카르노맵은 실제 산업현장에서 사용하지 않습니다. 진리표를 단순화된 부울 식으로 나타내기위해 VLSI CAD와 같은 소프트웨어를 이용합니다.

64비트 ALU

이제 실제 사용되는 64비트 ALU를 생각해봅시다. 64비트 ALU중 덧셈 부분만을 설계해봅시다.

  1. input, output 정하기

Input입니다.
output 입니다.

  1. 진리표 만들기

진리표의 행은 개의 행으로 구성됩니다.
어마어마어마하게 긴 진리표가 그려질텐데 그릴 수 없어서 생략하겠습니다.

  1. 진리표를 부울 함수로 간략히 나타낸다.

위 진리표는 행이 개나 되기 때문에 현재 가장 좋은 슈퍼컴퓨터와 현재 알려진 가장 효율적인 알고리즘으로 1000년동안 돌려도 간략화된 부울 함수로 나타낼 수 없습니다. 그럼 인텔은 어떻게 64비트 CPU를 만들었을까요?

바로 추상화라는 개념을 이용했기 때문입니다. 추상화가 뭐이길레 이런 불가능을 가능으로 만들까요?


추상화

추상화(Abstraction)는 공학의 근본 개념(Fundamental Engineering Concept)이라고 여겨질 만큼 공학에서 중요한 역할을 합니다.

공학에서 추상화란 공학의 도구와 물건의 Implementation(설계/구조/동작)을 신경쓰지 않고 Interface(사용법)만으로 사용할 수 있도록 하는 것입니다.

즉 추상화하게되면 작은 모듈의 Implementation을 신경쓰지 않고 그 모듈을 이용해서 더 복잡한 모듈만드는 것에 집중할 수 있습니다. 따라서 계속해서 기계장치의 복잡도를 높힐 수 있고 인간은 추상화를 통해 컴퓨터라는 어마어마하게 복잡한 장치를 만들 수 있었던 것입니다.

이렇게 작은 모듈을 추상화하여 더 크고 복잡한 모듈을 만드는 것을 Primitive-Composition-Abstraction라고 합니다. 

추상화로 인해 어셈블리 코드에 대해 고민하지 않고 C처럼 같이 사람이 이해하기 보다 쉬운언어로 프로그램을 작성하는 것이 가능합니다.  또 추상화는 논리 게이트를 고려하지 않고 어셈블리 코드를 작성할 수 있게 하며 트랜지스터에 대해 심각하게 고민하지 않고 게이트를 이용해서 처리기를 만들 수 있게 합니다.

64비트 ALU 만들기

이제 추상화의 개념을 적용해서 64비트 ALU의 덧셈 부분을 만드는 과정을 진행해보겠습니다.
위에서 한것 처럼 64비트 덧셈장치라는 어마어마하게 복잡한 장치를 한번에 만들려 하지말고 작은 모듈을 먼저 만들고 그 모듈의 interface(사용법)만 이용해서 복잡한 장치를 만들어 봅시다.

Full Adder

아래와 같은 모듈을 Full Adder라고 합니다. 아래 자릿수에서 올라온 올림수인 CarryIn과 위 자릿수로 올려주는 올림수인 CarryOut으로 구성됩니다. 이 자릿수간의 올림을 처리할 수 있기 때문에 이 모듈을 연결해서 64비트 Adder를 만드는 것이 가능합니다.

모듈로 나타낸 Full Adder

이제 디지털 논리 설계의 체계적인 방법을 따라 Full Adder의 회로를 그려봅시다.

  1. 인풋과 아웃풋을 정한다.

Input : a, b, CarryIn
output : CarryOut, Sum

  1. 진리표를 만든다.

Full Adder의 진리표

  1. 진리표를 부울 함수로 간략히 나타낸다.


a xor b xor c

  1. 회로로 표현한다.

Full Adder


64비트 Adder

이제 Full Adder를 모듈로 연결해서 64비트 Adder를 만들 수 있습니다.
이 과정에서 Full Adder의 Implementation(설계/구조/동작)은 생각할 필요가 전혀 없습니다. 입력과 출력의 interface(사용법)만을 파악하고 연결하면 아까 너무나 복잡해서 불가능할 것 같았던 64비트 Adder를 정말 간단하게 구현할 수 있습니다. 이것이 바로 추상화입니다.

Full Adder를 64개 연결한 그림은 지면 상 나타내기 어려워 8비트 Adder 그림을 첨부합니다.

8비트 Adder



정리

지금까지 인간이 어떻게 컴퓨터라는 복잡한 기계를 만들 수 있었는지 그 핵심개념을 살펴봤습니다. 복잡한 컴퓨터가 어떻게 만들어졌는지 자세히는 알아보지 않았지만 그 흐름가장 중요한 아이디어 세가지를 살펴봤습니다. 도움이 됬기를 바랍니다.


댓글
최근에 달린 댓글
Total
Today
Yesterday