[목차] == 개요 == {{{+1 Von Neumann architecture}}} [[존 폰노이만]]이 제시한 [[컴퓨터]] 구조를 말한다. 프로그램 내장 방식이라고도 불리며, 이론적으로는 [[튜링 머신]]과 같은 일을 할 수 있다.[* 이를 “[[튜링 완전]]하다”라고 한다.] 폰노이만 구조가 등장하기 이전의 컴퓨터들은 스위치를 설치하고 전선을 연결하여 데이터를 전송하고 신호를 처리하는 식으로 [[프로그래밍]]을 하였다. 폰노이만 구조의 [[디지털]] 컴퓨터에서는 ‘저장된 프로그램’(stored-program)의 개념이 도입되었다. 이는 프로그램을 구성하는 명령어들을 [[RAM|임의 접근이 가능한 메모리]]상에 순차적으로 배열하고, 동시에 조건 분기[* 조건에 따라 메모리의 특정 위치에 있는 명령어를 불러와 실행하는 것.]를 무제한적으로 허용[* 조건 분기가 무제한적으로 허용되는 기계는 [[튜링 완전]]하다. 여기서 무제한적이라는 말은 횟수 제한이 없다는 것이다.]한다는 것을 뜻한다. 폰노이만 구조에서는 같은 메모리 속에 실행코드와 데이터가 따로 구분되지 않고 함께 섞여 있다. 폰노이만은 자신이 주창한 구조를 따르는 첫 컴퓨터 에드삭을 만들었다. 이후 좀 복잡해졌을 뿐이지, 현재 대부분의 컴퓨터가 이 구조를 따르고 있다. == 장점 == 컴퓨터에 다른 작업을 시키려고 할 때 굳이 [[하드웨어]](전선)를 재배치할 필요 없이 [[소프트웨어]](프로그램)만 교체하면 되기 때문에 범용성이 크게 향상된다는 것이다. 전선을 일일이 교체할 경우 교체인원도 많이 필요하고 시간도 많이 잡아먹는 등 여러모로 불편함이 있지만[* [[에니악]]이 이러한 구조를 가지고 있다.], 폰노이만 구조를 도입하면 프로그램을 교체하는 것으로 모든 일이 끝난다. 이 엄청난 편의성 때문에, 현재 거의 모든 컴퓨터들은 폰노이만 구조를 따르고 있다.[* [[클라우드 컴퓨팅]] 같이 네트워크가 필수적인 구조는 예외. 네트워크가 하드웨어 속성 중 하나이기 때문에, 외부적으로는 폰노이만 구조를 따르지 못한다. 하지만 개별 컴퓨터는 여전히 폰노이만 구조를 따르고 있다.] == 단점 == 폰노이만 [[병목현상]]이 있다. 우선 메모리의 값을 읽고 쓰는 구조이기 때문에 기억장치에 병목현상이 생길 수 밖에 없다. [[메모리 계층 구조]][* [[레지스터]] > [[캐시 메모리]] > [[RAM]] > [[하드 디스크 드라이브|HDD]]/[[SSD]](보조기억장치) 식의 계층구조]나 [[NUMA]], DMA같은 것들이 모두 이러한 문제를 조금이나마 완화하기 위해 도입된 기술들이다. 또한 코드를 순차적으로 실행하기 때문에 정해진 입력에 따라 정해진 값만을 출력하는 멍청한 구조, 즉 '결정적 유한 오토마타'의 한계에 묶이기 쉽다. [[GIGO]]가 나온 이유도 그렇고, [[P-NP 문제]]가 여전히 난제인 것도 이 때문. 같은 이유로 [[난수생성]]도 우리가 원하는 진짜 [[난수]]를 생성하려면 특수한 하드웨어 없이는 불가능하다. 이건 [[SIMD]] 구조도 마찬가지라, [[CUDA]] 같은 병렬 처리 아키텍처도 예외는 아니다. == 해결책과 한계 == 폰노이만 병목현상을 해결하기 위해 약간의 변형을 가하여, 메모리를 명령어가 저장되는 곳과 데이터를 저장하는 곳으로 구분한 하버드 아키텍처가 있다. 현대의 컴퓨터는 외부적으로는 폰노이만 구조를 쓰고 있으나, [[CPU]] 내부적으로는 하버드 아키텍처를 적용[* 예를 들면 [[인텔 코어 i 시리즈]] CPU를 살펴보면, 각 코어의 L1 캐시 메모리는 명령어용 32Kb, 데이터용 32Kb로 나뉘어 있다.]해서 속도를 향상시킨 것이 많다. 그러나 이것 또한 폰노이만 구조를 기반으로 만들어진 것이기 때문에, 병목현상만 어느 정도 해결할 뿐 메모리 속의 프로그램을 순차적으로 실행하는 근본적인 구조 자체는 변하지 않는다. [[난해한 프로그래밍 언어]]들 중 일부는 이러한 구조를 까기 위해 만들어지기도 하는데, 대표격으로 꼽히는 것이 ‘Java2K’이다. 다른 시도도 있다. ‘[[뉴로모픽 컴퓨팅]]’이라고 하여, [[인간]]과 같은 고등동물의 [[뇌]] 구조를 모방한 [[인공신경망]] 형태의 집적회로를 만들어 기존의 컴퓨터 구조가 지닌 한계를 극복하려는 것이다. [[뉴런]]은 하나하나가 작은 컴퓨터와도 같은데, 이를 모방하여 연산과 기억 기능이 통합된 유닛을 수없이 많이 준비하여 [[통신망#s-3|그물망처럼 병렬적으로 연결]]한 다음 각 유닛을 이벤트 구동(event-driven) 방식으로 작동시키는 것이다. 다만 병렬처리나 네트워킹은 '''무지막지하게 난이도가 높은 방법'''이기 때문에[* 당장, '''이후 계산이 이전 계산에 종속적이라면 병렬 처리는 쓸 수 없다.''' 일반항을 쓰지 않고 정석대로 피보나치 수열을 구한다면 n-1번째를 구하지 않고는 n번째를 구할 수 없는데, 이러한 구조는 병렬 컴퓨터에서 효율이 극악이다.], 이러한 방법은 2014년 [[IBM]] 등에서 [[http://www.bloter.net/archives/202263|선도적으로]] [[http://news.zum.com/articles/15334645|연구]]하는 단계에 그치고 있다. 물론 위에 언급했듯이, 이런 새로운 아키텍처가 폰노이만 아키텍처의 종말을 뜻하는 건 아니며, GPU처럼 CPU의 특정 애플리케이션을 보조해 전체적인 성능을 늘리는 식으로 쓰일 전망이다. == 여담 == ‘폰노이만 구조’가 아니라 “에커트 구조”라고 불러야 한다는 사람들도 있다. 모클리와 에커트가 최초의 '''범용 전자식''' 컴퓨터 [[ENIAC]]을 만드는 와중인 1944년에 이미 크나큰 단점, 즉 위에서 설명했듯 ‘스위치를 설치하고 전선을 연결하는’ 방식[* 현대의 [[FPGA]]와 개념은 거의 동일하지만, 1940년대에는 로직의 신세시스를 사람이 손수 해줘야 했다.]의 단점을 깨닫게 되어 프로그램 내장 방식에 관한 구상 메모를 남기고 EDVAC을 설계했다. 그런데 폰노이만이 에니악 제작에 뛰어들어서는 에드박 이야기를 듣고 <[[https://en.wikipedia.org/wiki/First_Draft_of_a_Report_on_the_EDVAC|에드박에 관한 보고서 초안]]>을 썼다. 그런데 폰 노이만에게 에니악을 소개시켜줬던 골드스타인 장교가 이 글을 배포해 버렸다. 문제는, '''그 보고서에 폰노이만 자신의 이름밖에 없었다는 것.''' 그 이후 모클리와 에커트는 EMCC라는 회사를 세우고 UNIVAC을 팔아 성공하지만, 돈이 바닥나자 회사와 에니악 특허 사용권을 레밍턴랜드에 팔고, 그 보고서에 있던 에니악의 설계 때문에 에니악의 특허도 무효가 되어 버렸다. 물론 폰노이만은 ‘폰노이만 구조’의 제창자로서 이름을 날렸다. ~~안습~~ [[분류:컴퓨터 공학]]