폰 노이만 구조

1 개요

존 폰 노이만이 제시한 컴퓨터 구조. 프로그램 내장 방식이라고도 불린다. 이론적으로는 튜링 머신과 같은 일을 할 수 있다.[1] 그 이전의 컴퓨터들은 스위치를 설치하고 전선을 연결하여 데이터를 전송하고 신호를 처리하는 식으로 프로그래밍하였다.

폰 노이만 구조의 디지털 컴퓨터에서는 ‘저장된 프로그램’(stored-program)의 개념이 도입되었다. 이는 프로그램을 구성하는 명령어들을 임의 접근이 가능한 메모리상에 순차적으로 배열하고, 동시에 조건 분기[2]를 무제한적으로 허용[3]한다는 것을 뜻한다. 폰 노이만 구조에서는 같은 메모리 속에 실행코드와 데이터가 따로 구분되지 않고 함께 섞여 있다.

좀 복잡해졌을 뿐이지, 이 구조가 제창된 이후부터 현대까지 대부분의, 그리고 앞으로도 컴퓨터의 상당수는 이 구조를 따르게 될 것이다. 폰 노이만은 자신이 주창한 구조를 따르는 첫 컴퓨터 EDVAC을 만들었다.

2 장점과 단점

이 구조의 특장점을 꼽자면, 컴퓨터에 다른 작업을 시키려고 할 때 굳이 하드웨어(전선)를 재배치할 필요 없이 소프트웨어(프로그램)만 교체하면 되기 때문에 범용성이 크게 향상된다는 것이다. 전선을 일일이 교체할 경우 교체인원도 많이 필요하고 시간도 많이 잡아먹는 등 여러모로 불편함이 있지만[4], 폰 노이만 구조를 도입하면 프로그램을 교체하는 것으로 모든 일이 끝난다. 이 엄청난 편의성 때문에, 현재 거의 모든 컴퓨터들은 폰 노이만 구조를 따르고 있다.[5]

이 구조의 단점으로 폰 노이만 병목현상이 있다. 우선 메모리의 값을 읽고 쓰는 구조이기 때문에 기억장치에 병목현상이 생길 수 밖에 없다. 메모리 계층이나 DMA같은 것들이 모두 이러한 문제를 조금이나마 완화하기 위해 도입된 기술들이다. 또한 코드를 순차적으로 실행하기 때문에 정해진 입력에 따라 정해진 값만을 출력하는 멍청한 구조, 즉 '결정적 유한 오토마타'의 한계에 묶이기 쉽다. GIGO가 나온 이유도 그렇고, P-NP 문제가 여전히 난제인 것도 이 때문. 같은 이유로 난수 생성도 우리가 원하는 진짜 난수로는 불가능하다. 이건 SIMD 구조도 마찬가지라, CUDA 같은 병렬 처리 아키텍처도 예외는 아니다.

3 에커트 구조?

‘폰 노이만 구조’가 아니라 “에커트 구조”라고 불러야 한다는 사람들도 있다. 모클리와 에커트가 최초의 범용 전자식 컴퓨터 ENIAC을 만들고 나서 크나큰 단점, 즉 위에서 설명했듯 ‘스위치를 설치하고 전선을 연결하는’ 방식의 단점을 깨닫게 되어 프로그램 내장 방식에 관한 구상 메모를 남기고 EDVAC을 설계했다. 그런데 노이만이 에니악 제작에 뛰어들어서는 에드박 이야기를 듣고 <에드박에 관한 보고서 초안>을 썼다. 그런데 노이만에게 에니악을 소개시켜줬던 골드스타인 장교가 이 글을 배포해 버렸다. 문제는, 그 보고서에 폰 노이만 자신의 이름밖에 없었다는 것. 그 이후 모클리와 에커트는 EMCC라는 회사를 세우고 UNIVAC을 팔아 성공하지만, 돈이 바닥나자 회사와 에니악 특허 사용권을 레밍턴랜드에 팔고, 그 보고서에 있던 에니악의 설계 때문에 에니악의 특허도 무효가 되어 버렸다. 물론 폰 노이만은 ‘폰 노이만 구조’의 제창자로서 이름을 날렸다. 안습

4 해결책, 그러나 한계

폰 노이만 병목현상을 해결하기 위해 약간의 변형을 가하여, 메모리를 명령어가 저장되는 곳과 데이터를 저장하는 곳으로 구분한 하버드 아키텍처가 있다. 현대의 컴퓨터는 외부적으로는 폰 노이만 구조를 쓰고 있으나, CPU 내부적으로는 하버드 아키텍처를 적용[6]해서 속도를 향상시킨 것이 많다. 그러나 이것 또한 폰 노이만 구조를 기반으로 만들어진 것이기 때문에, 병목현상만 어느 정도 해결할 뿐 메모리 속의 프로그램을 순차적으로 실행하는 근본적인 구조 자체는 변하지 않는다. 난해한 프로그래밍 언어들 중 일부는 이러한 구조를 까기 위해 만들어지기도 하는데, 대표격으로 꼽히는 것이 ‘Java2K’이다.

다른 시도도 있다. ‘뉴로모르픽 컴퓨팅’이라고 하여, 인간과 같은 고등동물의 구조를 모방한 신경망 형태의 집적회로를 만들어 기존의 컴퓨터 구조가 지닌 한계를 극복하려는 것이다. 뉴런은 하나하나가 작은 컴퓨터와도 같은데, 이를 모방하여 연산과 기억 기능이 통합된 유닛을 수없이 많이 준비하여 그물망처럼 병렬적으로 연결한 다음 각 유닛을 이벤트 구동(event-driven) 방식으로 작동시키는 것이다. 다만 병렬처리나 네트워킹은 무지막지하게 난이도가 높은 방법이기 때문에[7], 이러한 방법은 2014년 현재 IBM 등에서 선도적으로 연구하는 단계에 그치고 있다. 물론 위에 언급했듯이, 이런 새로운 아키텍처가 폰 노이만 아키텍처의 종말을 뜻하는 건 아니며, GPU처럼 CPU의 특정 애플리케이션을 보조하는 용도로 사용될 예정이다.
  1. 이를 “튜링 완전하다”라고 한다.
  2. 조건에 따라 메모리의 특정 위치에 있는 명령어를 불러와 실행하는 것.
  3. 조건 분기가 무제한적으로 허용되는 기계는 튜링 완전하다. 여기서 무제한적이라는 말은 횟수 제한이 없다는 것이다.
  4. 에니악이 이러한 구조를 가지고 있다.
  5. 클라우드 컴퓨팅 같이 네트워크가 필수적인 구조는 예외. 네트워크가 하드웨어 속성 중 하나이기 때문에, 외부적으로는 폰 노이만 구조를 따르지 못한다. 하지만 개별 컴퓨터는 여전히 폰 노이만 구조를 따르고 있다.
  6. 예를 들면 인텔 코어 i 시리즈 CPU를 살펴보면, 각 코어의 L1 캐시 메모리는 명령어용 32Kb, 데이터용 32Kb로 나뉘어 있다.
  7. 당장, 이후 계산이 이전 계산에 종속적이라면 병렬 처리는 쓸 수 없다. 일반항을 쓰지 않고 정석대로 피보나치 수열을 구한다면 n-1번째를 구하지 않고는 n번째를 구할 수 없는데, 이러한 구조는 병렬 컴퓨터에서 효율이 극악이다.