우선, 왜 뜬금없이 컴퓨터 기초부터 갑작스레 공부를 시작하는지에 대해 언급하고 넘어가보자. 우리가 목표로 지향하는 것은 소프트웨어 언어를 사용한 하드웨어 구조의 설계이다. 그런데 컴퓨터를 자세히, 세밀하게 근본부터 살펴보면, 결국 소프트웨어도 하드웨어의 성질에 따라 영향을 받을수밖에 없다. 예를 하나 들어보자.
만약 당신이 어떤 cpu를 가지고 프로그램을 작성한다고 생각해보자. cpu는 당신의 망치, 렌치같은 도구이다. 도구를 어떻게 사용하는지에 따라 작업 효율이 달라지는 것은 자명한 이치이다. cpu도 이와 같다. 망치를 짧게 잡고 때리면 어떻게 작용하는가? 힘의 힘점과 작용점의 거리가 짧아지면서 가하는 에너지에 비해 실제 나타나는 현상의 효과는 적어질 것이다. 이와 같이, cpu를 사용하는 데에 그 성질을 알지 못하고 마구잡이로, 되는대로 코드를 작성하다 보면 겉은 멀쩡하게 작동하는 프로그램일지라도 효율적으로 설계된 프로그램보다 더 많은 시간과 자원이 소모될 것이다.
하지만, 현재 프로그램들은 프로그램 자체에 내장된 기능을 통해 더 효율적인 계산을 하게 해 준다. 그러나 컴퓨터가 최적화 해주는 것이 있음을 알고 그냥 작성하는 것과, 스스로 최적화하면서 코드를 작성하는 것에 대한 차이는 존재할 것이다. 따라서 우리는 그 최적화 기능을 최대한 사용하지 않고 빠르게 효율을 올리는 코드 작성법을 배워야만 망치를 제대로 잡고 못을 때리는 능력을 사용할 수 있을 것이다.
폰 노이만은 대부분의 공학도라면 누구나 한번쯤 들어보았을 것이고, 그 중 컴퓨터공학을 전공하신 분이라면 거의 성인과 같이 묘사되는 위인이다. 수학자이자 물리학자인 그는, 엄청나게 많은 현대 과학에 영향을 미쳤지만, 그 중 특히 위대한 업적은 바로 컴퓨터의 기초 구조를 고안했다는 점이다.
그가 폰 노이만 구조를 제안한 1945년 이전, 컴퓨터를 이용한 계산은 프로그램을 직접 손으로 연결한 대규모 게이트들의 모임으로써, 저장소를 직접 넣어주는 외장 형식이었다. 또한 다른 프로그램을 사용하려면 그 연결 방식을 변경시켜야 하므로 사용이 어려웠다.
폰 노이만 구조는 저장된 프로그램의 개념이 도입되었다. 저장된 프로그램의 개념이 무엇이냐면, 명령어들이 프로그램을 구성하는데 이 때, 이 명령어들을 컴퓨터의 내부 메모리에 배치하고 이것을 사용하는 조건 분기를 모두 허용하는 것이다.
예를 들어, a, b, c의 명령어를 컴퓨터 메모리에 저장한다고 가정해보면, bca나 aaaac 등의 조합의 프로그램을 작성할 수 있다는 것이다.
이런 경우에 막대한 양의 연산 시 많은 작업(전선, 스위치 등의 변경 작업)이 필요 없어지고, 실행코드와 데이터를 메모리 유닛을 따로 두어 저장하고, 컨트롤, 연산 부분으로 그것을 불러와 실행시키게 되었다.
그러나 폰 노이만 구조의 치명적인 단점이 한 존재하는데, 메모리와 cpu를 분리해놓았기 때문에 연산할 때 메모리에 담긴 데이터를 불러올 때 시간이 소요된다는 단점이 있다. 이것을 폰 노이만 병목현상이라고 하는데, 현재 컴퓨터들의 구조가 폰 노이만 구조를 차용하고 있다는 점에 있어서 모든 기기들의 고질적인 문제라고 할 수 있다. 이것을 개선한 형태가 하버드 구조이다.
이전에 언급했듯이, 폰 노이만 구조는 프로그램과 데이터가 섞여있었는데, cpu는 프로그램과 데이터가 섞여있는 바람에 한개씩 순차적으로 인식하기 때문에 느리게 읽을 수 밖에 없다.
이 하버드 구조는 이 프로그램과 데이터 스토리지를 나누어서 따로 읽을 수 있어서 더 빠른 속도로 실행할 수 있지만, 더 많은 회로가 필요하기 때문에 면적이 속도와 가성비에 영향을 미치는 cpu에서 불리하게 작용한다.
그렇기 때문에 현대 컴퓨터 구조는 대부분 내부적으로는 하버드 구조, 외부적으로는 폰 노이만 구조를 사용한다.
일단 크게 컴퓨터를 2부분으로 나누어보면, 논리와 사칙연산을 담당하는 CPU 부분과, 데이터를 저장하는 담당하는 메모리 부분으로 나뉘는데, 이번 포스트는 CPU까지만 알아보도록 하자.
CPU를 설명하기 위해서는 먼저 반도체의 작동 기작에 대해서 알아야 한다. 반도체는 알다시피 실리콘, 가끔은 저마늄을 사용하기도 하지만 가성비가 훨씬 좋은 실리콘을 주로 사용하여 만들어진다. 이 때, 3족 원소를 불순물로 넣으면 p형 반도체가 만들어지고, 5족 원소를 넣으면 n형 반도체가 만들어지는데 이를 결합하면 npn, pnp형 트랜지스터 BJT가 만들어진다.
초기 컴퓨터는 진공관을 이용했다가, 나중에 이 트랜지스터를 이용하였는데, 점차 CPU의 성능을 늘리고자 하면서 칩은 작아지고 더 많은 소자가 집중되기 시작했다. 그러나 BJT는 전력 소모가 크고 크기가 현재 쓰이는 MOSFET보다 더 커서 작은 공간에 들어가지도 않았고 무엇보다도 전력 소모가 커서 열 발생이 더 많았기 때문에 사장되고, 대신 현재 CPU에 많이 쓰이는 FET이 쓰이게 된다.
BJT 트렌지스터는 베이스에 가해지는 전압을 조절해서 일종의 스위치 역할을 하하며, 우리는 이를 통해 무한 분기(트랜지스터에 비례하여 증가하는) 회로를 얻게 되어 이 원리로 컴퓨터를 사용한다. BJT 대신 MOSFET을 사용하는 현재서도, MOSFET을 가지고 우리는 같은 동작을 얻어낼 수는 있지만, 그 원리는 다르다!
BJT는 전하 운반자의 농도 차이를 이용하여 전하가 흐르게, 안 흐르게 통제하는 방식이었다면, MOSFET은 운반자의 길을 만들어주어서 전하를 흐르게 한다는 차이점이 있다. 위 그림을 보면, High Doped N형 반도체 2개가 서로 P형 반도체 기판에 의해 분단되어 있다. 이 때, source와 drain에서 전위차가 발생하더라도, p형에 흡수당하게 된다. 이 때, gate와 body, 즉 p기판의 하부에 전위차를 발생시키면 p형에 있는, body에 있는 운반자들이 gate로 이동하려 하지만 그 사이에 절연체인 SiO2가 가로막아 그곳에 일종의 전자 채널을 형성하고, 그 채널로 source의 전자들이 이동하게 된다.
결론은, 따라서 우리가 gate와 body부의 전위차를 조절함으로써 MOSFET을 마치 스위치처럼 사용할 수 있고, MOSFET을 조합하여 각종 게이트들을 만들어내어 조합회로처럼 사용할 수 있다는 것이다. 이것이 모이고 모여 수십억개가 되면 마침내 CPU로 작동하는 것이다.