冯·诺伊曼结构的設計概念。
**冯·诺伊曼结构**（英語：），也称**范紐曼模型**（Von Neumann model）或**普林斯顿结构**（Princeton architecture），是一种将程序指令存储器和数据存储器合并在一起的電腦設計概念结构。本詞描述的是一種實作通用圖靈機的計算裝置，以及一種相對於平行計算的序列式架構參考模型（referential model）。

本架構隱約指導了將儲存裝置與中央處理器分開的概念，因此依本架構設計出的計算機又稱**存储程序计算机**。

理論
--

存储程序计算机在体系结构上主要特点有：

1. 以运算单元为中心
2. 采用存储程序原理
3. 存储器是按地址访问、线性编址的空间
4. 控制流由指令流产生
5. 指令由操作码和地址码组成
6. 数据以二进制编码

歷史
--

最早的計算機器僅內含固定用途的程式。現代的某些計算機依然維持這樣的設計方式，通常是為了簡化或教育目的。例如一個計算器僅有固定的數學計算程式，它不能拿來當作文書處理軟體，更不能拿來玩遊戲。若想要改變此機器的程式，你必須更改線路、更改結構甚至重新設計此機器。當然最早的計算機並沒有設計的那麼可程式化。當時所謂的「重寫程式」很可能指的是紙筆設計程式步驟，接著制訂工程細節，再施工將機器的電路配線或結構改變。

而儲存程式型電腦的概念改變了這一切。藉由創造一組指令集架構，並將所謂的運算轉化成一串程式指令的執行細節，讓此機器更有彈性。藉著將指令當成一種特別型態的靜態資料，一台儲存程式型電腦可輕易改變其程式，並在程式控制下改變其運算內容。
**冯·诺伊曼结构**與**儲存程式型電腦**是互相通用的名詞，其用法將於下述。而哈佛結構則是一種將程式資料與普通資料分開儲存的設計概念，但是它并未完全突破冯.诺伊曼架构。

儲存程式型概念也可讓程式執行時自我修改程式的運算內容。本概念的設計動機之一就是可讓程式自行增加內容或改變程式指令的記憶體位置，因為早期的設計都要使用者手動修改。但隨著索引暫存器與間接位置存取變成硬體架構的必備機制後，本功能就不如以往重要了。而程式自我修改這項特色也被現代程式設計所棄揚，因為它會造成理解與除錯的難度，且現代中央處理器的管線與快取機制會讓此功能效率降低。

從整體而言，將指令當成資料的概念使得組合語言、編譯器與其他自動編程工具得以實現；可以用這些「自動編程的程式」，以人類較易理解的方式編寫程式；從局部來看，強調I/O的機器，例如Bitblt，想要修改畫面上的圖樣，以往是認為若沒有客制化硬體就辦不到。但之後顯示這些功能可以藉由「執行中編譯」技術而有效達到。

此架構當然有所缺陷，除了下列將述的冯·诺伊曼瓶頸之外，修改程式很可能是非常具傷害性的，無論無意或設計錯誤。在一個簡單的儲存程式型電腦上，一個設計不良的程式可能會傷害自己、其他程式甚或是作業系統，導致當機。緩衝區溢位就是一個典型例子。而創造或更改其他程式的能力也導致了惡意軟體的出現。利用緩衝區溢位，一個惡意程式可以覆蓋呼叫堆疊（Call stack）並覆寫程式碼，並且修改其他程式檔案以造成連鎖破壞。記憶體保護機制及其他形式的存取控制可以保護意外或惡意的程式碼更動。

第一次提出及實作
--------

「冯·诺伊曼结构」這個詞出自美籍猶太數學家约翰·冯·诺伊曼（）的論文：《EDVAC報告書的第一份草案》（），
於1945年6月30日。冯·诺依曼由于在曼哈顿工程中需要大量的运算，从而使用了当时最先进的两台计算机Mark I和ENIAC，在使用Mark I和ENIAC的过程中，他意识到了存储程序的重要性，从而提出了存储程序逻辑架构。雖然冯·诺伊曼的概念非常新穎，但冯·诺伊曼結構這個詞，對冯·诺伊曼的合作伙伴、時人甚至先輩都不公平。

一份由德國工程師康拉德·楚泽（）提出的專利應用就已在1936年點出這類概念。而儲存程式型電腦的概念早在冯·诺伊曼知曉ENIAC的存在前就已在賓州大學的摩爾電機學院流傳了。此構想的確實創立者永遠是個謎。

赫曼·魯寇夫（Herman Lukoff（英语：））相信是艾克特創建此概念（見參考資料）。

毛奇利（Mauchly（英语：））與艾克特（Eckert（英语：））在1943年於他們建造ENIAC時寫下關於儲存程式的概念，另外，ENIAC計畫管理員布萊德（Grist Brainerd）在1943年12月為ENIAC做的進度回報，就已隱約提及儲存程式的概念（雖然也同時否決了在ENIAC實作的計畫），他說「為了擁有最簡單的實作計畫以及不複雜的事務，ENIAC建造時後將不需要任何自動整備」。

當設計ENIAC時，它很清楚說明從讀卡機或紙帶讀取指令是不夠快的，因為ENIAC設計用於高速執行運算。因此ENIAC直接以電路管線設計程式，並在需要新程式時重新配接線路。設計師也很清楚他們需要更好的系統架構，因此在ENIAC建造期間第一份EDVAC的報告就已撰寫完畢，並包含了儲存程式的概念，此概念敘述程式指令儲存在高速記憶體（水銀延遲記憶體）中，因此可以在執行時快速存取。

艾倫·圖靈在1946年2月19日講演了一份包含程式儲存型電腦（Pilot ACE）完整設計的論文。

冯·诺伊曼瓶頸
-------

將CPU與記憶體分開並非十全十美，反而會導致所謂的冯·诺伊曼瓶頸（Von Neumann bottleneck）：在CPU與記憶體之間的流量（資料傳輸率）與記憶體的容量相比起來相當小，在現代電腦中，流量與CPU的工作效率相比之下非常小，在某些情況下（當CPU需要在巨大的資料上執行一些簡單指令時），資料流量就成了整體效率非常嚴重的限制。CPU將會在資料輸入或輸出記憶體時閒置。由於CPU速度遠大於記憶體讀寫速率，因此瓶頸問題越來越嚴重。

而冯·诺伊曼瓶頸是約翰·巴科斯在1977年ACM圖靈獎得獎致詞時第一次出現，根據巴科斯所言：

> ……確實有一個變更儲存裝置的方法，比藉由馮·諾伊曼瓶頸流通大量資料更為先進。瓶頸這詞不僅是對於問題本身資料流量的敘述，更重要地，也是個使我們的思考方法侷限在『一次一字元』模式的智能瓶頸。它使我們怯於思考更廣泛的概念。因此編程成為一種計畫與詳述通過馮·諾伊曼瓶頸的字元資料流，且大部分的問題不在於資料的特徵，而是如何找出資料。
> 
> 

原文如下：

> Surely there must be a less primitive way of making big changes in the store than by pushing vast numbers of words back and forth through the von Neumann bottleneck. Not only is this tube a literal bottleneck for the data traffic of a problem, but, more importantly, it is an intellectual bottleneck that has kept us tied to word-at-a-time thinking instead of encouraging us to think in terms of the larger conceptual units of the task at hand. Thus programming is basically planning and detailing the enormous traffic of words through the von Neumann bottleneck, and much of that traffic concerns not significant data itself, but where to find it.
> 
> 

在CPU與記憶體間的快取記憶體抒解了冯·诺伊曼瓶頸的效能問題。另外，分支預測（branch prediction）演算法的建立也幫助緩和了此問題。巴科斯在1977年論述的「智能瓶頸」已改變甚多。且巴科斯對於此問題的解決方案並沒有造成明顯影響。現代的函數式編程以及物件導向編程已較少執行如早期Fortran一般會「將大量數值從記憶體搬入搬出的操作」，但平心而論，這些操作的確佔用電腦大部分的執行時間。

早期的儲存程式型電腦
----------

下列的日期資料很難給予一個適當的日期順序。一些是第一次執行測試程式的日期；一些是電腦第一次公開展示或完成建造的日期；還有一些是第一次散佈及安裝日期。

| 製造者 | 型號 | 測試日期 | 完成日期 | 展示日期 | 備註 |
| --- | --- | --- | --- | --- | --- |
| IBM | SSEC |  |  | 1948年1月27日 | 由於他的某些零件是機械式的，因此不算完全的電子電腦。 |
| 曼彻斯特大学 | SSEM | 1948年6月21日 |  |  | 第一個完全電子式且執行儲存程式概念的電腦。它在1948年6月21日以52分鐘執行了一個因式分解程式，之後執行了一個簡單除法演算，以及一個判定兩整數是否互質的程式。 |
| 宾夕法尼亚大学 | ENIAC | 1948年9月16日 |  |  | 藉由執行一個Adele Goldstine為馮·諾伊曼所寫的程式，展示它已被修改為儲存程式型電腦。 |
| Eckert-Mauchly Computer Corporation（英语：） | 1949年2、3、4月 | 1949年9月 |  |  |  |
| 曼彻斯特大学 | Mark I |  | 1949年4月建造中版本1949年10月正式版本 |  |  |
| Cambridge | EDSAC | 1949年5月6日 |  |  |  |
| 宾夕法尼亚大学 | EDVAC |  | 1949年 | 1951年 |  |  |
| 歐澳兩洲合作 | CSIR Mk I | 1949年11月 |  |  |  |  |
| NIST | SEAC |  |  | 1950年4月 |  |
| NPL | Pilot ACE | 1950年5月10日 |  | 1950年12月 |  |
| NIST | SWAC |  | 1950年7月 |  |  |
| MIT | Whirlwind |  | 1950年12月 | 1951年4月 |  |
| 雷明頓蘭德公司 | 第一代ERA Atlas |  | 1950年12月 |  | 之後的商業版本是ERA 1101/UNIVAC 1101 |

参考文献
----

### 引用

1. ↑ .  [2006-12-28]. （原始内容存档于2011-08-05）.
2. ↑  First Draft of a Report on the EDVAC （页面存档备份，存于） (PDF, 420 KB)
3. ↑  Backus, John W.. doi:10.1145/359576.359579.
4. ↑  Dijkstra, Edsger W..  [2008-07-11]. （原始内容存档于2020-02-26）.

### 书籍

* *The First Computers: History and Architectures*：由Raúl Rojas與Ulf Hashagen編輯，MIT Press，2000. ISBN 0-262-18197-5。

* *From Dits to Bits... : A Personal History of the Electronic Computer*，Herman Lukoff，1979. Robotics Press, ISBN 0-89661-002-0

* Martin Davis（2000），第八章，"Making the first Universal computers"，*Engines of Logic: Mathematicians and the origin of the Computer*，W. W. Norton & Company，Inc. New York. ISBN 0-393-32229-7 pbk。

* *Can Programming be Liberated from the von Neumann Style?*，John Backus，1977 ACM Turing Award Lecture. Communications of the ACM，August 1978，Volume 21，Number 8. 線上PDF

* C. Gordon Bell與Allen Newell（1971），*Computer Structures: Readings and Examples*，McGraw-Hill Book Company，New York. Massive（668頁）。

参见
--

* 哈佛架構
* 圖靈機
* 隨機存取機 (random access machine)



|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
处理器技术 |
| --- |
|  |
| 模型 | 

|  |  |
| --- | --- |
| 顺序模型 | 
* 图灵机
	+ 通用
	+ 波斯特-图灵机
	+ 量子
* 传动带机器（英语：）
* 堆疊結構機器
* 有限状态机
	+ 具数据通路（英语：）
	+ 分层（英语：）
	+ 队列（英语：）
* 寄存器机
	+ 计数器
	+ 指针（英语：）
	+ 隨機存取機
	+ 隨機存取儲存程式機

 |
|  |
| 函数式模型 | 
* 递归函数
* Λ演算
* 组合子逻辑
* 細胞自動機

 |

 |
|  |
| 架構 | 
* 微架構
* 冯·诺伊曼结构
* 哈佛架構
	+ 修正哈佛架構（英语：）
* 資料流架構（英语：）
* 传输触发（英语：）
* 元胞（英语：）
* 字节序
* 异构（英语：）
* Fabric（英语：）
* 多元處理
* 認知計算
* 神经形态（英语：）

|  |  |
| --- | --- |
| 内存访问 | 
* 非均匀访存模型(NUMA)
* 均匀访存模型(UMA)
* 载入/存储（英语：）
* 寄存器/存储器（英语：）

 |
|  |
| 缓存层级（英语：） | 
* 缓存层级（英语：）

 |
|  |
| 記憶體階層 | 
* 虚拟内存
* 第二级存储器

 |

 |
|  |
| 指令集架構 | 

|  |  |
| --- | --- |
| 类型 | 
* 复杂指令集(CISC)
* 精简指令集(RISC)
* 专用指令集处理器
* 显式数据图像并行（英语：）(EDGE)
	+ TRIPS（英语：）
* 超長指令集(VLIW)
* 顯式並行指令運算(EPIC)
* 最小指令集（英语：）(MISC)
* 單一指令集(OISC)
* 無指令集（英语：）(NISC)
	+ 零指令集(ZISC)
* 比較（英语：）

 |
|  |
| 指令集 | 
* x86
* ARM
* MIPS
* LoongArch
* PowerPC
* SPARC
* IA-64
* Unicore（英语：）
* MicroBlaze（英语：）
* RISC-V
* LMC（英语：）
* 其他（英语：）

 |

 |
|  |
| 执行 | 

|  |  |
| --- | --- |
|  | 
* 流水线停顿
* 操作数转发（英语：）
* 经典 RISC 流水线（英语：）

 |
|  |
| 危障 | 
* 数据依赖
* 數據危障
* 結構危障
* 控制危障
* 伪共享

 |
|  |
| 乱序执行 | 
* 托马苏洛算法
	+ 保留站
	+ 重排序缓冲区
* 寄存器重命名

 |
|  |
| 推测执行 | 
* 分支預測
	+ 存储相关性预测（英语：）

 |

 |
|  |
|  | 

|  |  |
| --- | --- |
| 并行层次 | 
* 位级并行
	+ 位序列（英语：）
	+ 字
* 指令级并行
* + 标量
	+ 純量
	+ 超純量
* 任務并行
	+ 线程
	+
* 数据并行
	+ 向量
* 記憶體
* 分布式

 |
|  |
| 執行緒 | 
* 多執行緒
* 同时多线程
	+ 超執行緒
* 超執行緒
* 超級線程（英语：）
* 预测多线程（英语：）
* 抢占式
* 协作式

 |
|  |
| 費林分類法 | 
* 單指令流單數據流(SISD)
* 單指令流多數據流(SIMD)
	+ 寄存器内（英语：）
* 单指令多线程（英语：）(SIMT)
* 多指令流單數據流(MISD)
* 多指令流多數據流(MIMD)
	+ 单程序多数据（英语：）

 |

 |
|  |
| 電腦性能 | 
* 晶體管數量
* 每周期指令(IPC)
	+ 每指令周期(CPI)
* 每秒指令(IPS)
* 每秒浮點運算次數(FLOPS)
* 每秒事务处理量 (TPS)
* 效能功耗比(PPW)

 |
|  |
| 類別 | 
* 中央处理器(CPU)
* 圖形處理器(GPU)
	+ 图形处理器通用计算(GPGPU)
* 向量处理器
* 桶状（英语：）
* 串流處理
* 輔助處理器
* 特殊應用積體電路(ASIC)
* 现场可编程逻辑门阵列(FPGA)
* 複雜可程式化邏輯裝置(CPLD)
* 多晶片模組(MCM)
* 封裝體系(SiP)

|  |  |
| --- | --- |
| 按应用 | 
* 微处理器
* 单片机(MCU)
* 移动处理器（英语：）
* 笔记本电脑处理器（英语：）
* 超低电压（英语：）
* 专用指令集处理器(ASIP)

 |
|  |
| 片上系统 | 
* 片上系统(SoC)
* 多处理器片上系统（英语：）(MPSoC)
* 可编程片上系统(PSoC)
* 片上网络（英语：）(NoC)

 |
|  |
| 硬件加速 | 
* 人工智能加速器
* 视觉处理单元(VPU)
* 物理處理器(PPU)
* 數位訊號處理器(DSP)
* 张量处理器(TPU)
* 安全加密協處理器
* 网络处理器
* 基頻處理器

 |

 |
|  |
| 字长 | 
* 
* 4位元
* 8位元
* 12位元
* 
* 16位元
* 24位元（英语：）
* 32位元
* 48位元（英语：）
* 64位元
* 128位元
* 
* 位元分割（英语：）
* 其他
	+

 |
|  |
| 核心数量 | 
* 单核（英语：）
* 多核
* 众核（英语：）
* 异构

 |
|  |
| 組件 | 
* 核心
* 缓存
	+ CPU缓存
	+ 置換機制
	+ 一致性
* 总线
* 
* 定時器訊號
* 先進先出演算法(FIFO)

|  |  |
| --- | --- |
| 功能单元 | 
* 算術邏輯單元(ALU)
* 地址生成单元(AGU)
* 浮點運算器(FPU)
* 內存管理單元(MMU)
	+ 载入-存储单元（英语：）
	+ 轉譯後備緩衝區(TLB)
* 内存控制器(IMC)

 |
|  |
| 邏輯閘 | 
* 组合逻辑电路
* 时序逻辑电路
* Glue（英语：）
* 邏輯閘
	+ 量子閘
	+ 逻辑门阵列（英语：）

 |
|  |
| 寄存器 | 
* 寄存器
* 状态寄存器（英语：）
* 栈寄存器（英语：）
* 寄存器堆
* 記憶體缓冲区
* 程式計數器

 |
|  |
| 总线 | 
* 位址匯流排
* 控制匯流排
* 后端总线

 |
|  |
| 控制单元 | 
* 指令单元（英语：）
* 緩衝器
* 写入缓冲区（英语：）
* 微程序ROM
* 计数器

 |
|  |
| 数据通路 | 
* 数据选择器
* 数据分配器
* 加法器
* 乘法器
	+ CPU倍频器
* 译码器
	+ 地址解码器（英语：）
	+ 加和寻址解码器（英语：）
* 桶式移位器

 |
|  |
| 電路 | 
* 集成电路
	+ 3D
	+ 混合訊號
	+ 電源管理
* 布尔（英语：）
* 数字
* 模拟
* 量子
* 开关

 |

 |
|  |
| 电源管理 | 
* 电源管理单元（英语：）(PMU)
* 高级电源管理
* 高级配置与电源接口(ACPI)
* 
* 动态电压调节
* 时钟门控
* 效能功耗比(PPW)
* 空闲竞争（英语：）

 |
|  |
| 相关内容 | 
* 通用CPU历史（英语：）
* 微处理器年代表（英语：）
* 处理器设计
* 数字电路
* 硬件安全模块
* 半导体制造
* Tick-Tock
* 推測執行漏洞集合

 |

 |