当前位置: 首页 > news >正文

组成原理(一):计算机是如何组成的

(一)前言

“种一棵树最好的时间是十年前,其次是现在”。前段时间有个学弟和我讲,大学学的计算机组成原理、操作系统、计算机网络还有数据结构到底有什么用啊,看也看不懂,还不如写代码有意思。

我突然间想到,这四本课,我在大学时候也是浑浑噩噩地度过,目标就是通过考试。但是当我敲了几年代码之后,发现技术的更新太快了,而这些快速更新的内容,大多都是上层的应用。而底层的计算机组成原理、操作系统、计算机网络,几乎没有发生太大的变化。

学习一门上层技术,能让你多干一些事情,而深入学习计算机的底层知识,能让你对上层的技术的理解更加深刻。所以我前段时间又翻开了计算机组成原理这本书,并打算写一些文章,希望能帮到一些人。

(二)冯诺伊曼结构

谈到计算机的体系结构,一定要介绍一个人,那就是冯-诺伊曼。在学习计算机组成原理的时候,最开始学的就是冯诺伊曼结构,最主要的原因是在计算机还没出现的那个年代,冯-诺伊曼写了一篇报告:First Draft of a Report on the EDVAC。

这篇报告中谈到了冯诺伊曼对计算机的看法,并且这种看法一直到今天都是正确的。计算机应该分为五个部分:运算器、控制器、存储器、输入设备、输出设备组成。同时冯诺伊曼还提出了另外两个计算机的原则,采用二进制计算以及程序存储执行。冯诺伊曼构建了一个可编程、可存储的计算机硬件体系。

2.1 运算器

运算器用来完成各种逻辑运算和算术运算,由算术逻辑单元(ALU)、累加器、状态寄存器、通用寄存器等组成。能完成加减乘除等算术操作、与或非等逻辑操作、以及移位、补位等操作。

2.2 控制器

控制器是整个计算机的控制中心,指挥计算机各部分协调工作,包含指令寄存器和程序计数器。一般来讲在计算机中,运算器和控制器组成了中央处理器(CPU),CPU是一块超大规模集成电路,是计算机运算核心和控制核心,CPU的主要功能是解释计算机指令以及处理数据。

2.3 存储器

存储器是计算机中的记忆设备,用来存放程序和数据。按用途可以分为内部存储器和外部存储器。内存往往指的是主板上的存储设备,用来存放当前正在执行的程序和数据,关闭电源会导致数据丢失。外部存储通常是磁性介质或光盘等,能长期保存数据。现在用的通常都是硬盘。

2.4 输入和输出设备

向计算机输入和输出等设备,比如键盘鼠标等是输入设备,显示器、打印机就是输出设备。

2.5 冯诺依曼结构的展望

冯诺伊曼体系打开了计算机系统发展的先河,但是随着计算机发展的越来越快,冯诺伊曼体系的性能瓶颈也出现了,因此各种非冯诺伊曼的计算机也正不断出现。比较著名的就是彻底跳出电子范畴,用其他物质作为信息载体和执行部件,比如量子计算机。未来冯诺伊曼体系可能被颠覆,但是至少现在它还是几乎所有计算机的组成依据。

(三)哈佛结构

目前的计算机结构基本上都是冯诺依曼结构,但是还有一种结构也要了解一下,这种结构叫做哈佛结构。哈佛结构将指令存储和数据存储分开,分别存储在程序存储器和数据存储器中,每个存储器独立编址独立访问。换句话说,程序指令和数据指令可以是不一样的。早期的ARM芯片就采用了哈佛结构。


哈佛结构在发展过程中还经过一次改进,改进后的哈佛结构加上了独立的缓冲区cache,程序存储器和数据存储器中的数据分别会进入指令cache和数据cache。

(四)总结

计算机组成原理更像是对计算机一种整体上的认识,本文对计算机的组成进行了基本的介绍,接下来将会对计算机组成原理中更多的知识点进行解读。这个系列的目标是彻底搞懂一个程序执行时在计算机中的全过程。

相关文章:

  • JDK9相比于JDK8,究竟变强了多少
  • Hive之分区(Partitions)和桶(Buckets)
  • 列式存储?OLAP?ClickHouse究竟是何方神圣
  • 分享Open-E DSS V7 应用系列十篇!
  • 基于SpringBoot和BootStrap的全栈论坛网站(附上源码)
  • 我的Java全系列技术博客
  • 闲着无聊造个轮子,开源一个可快速接入的分布式SSO系统
  • https在电子邮件安全解决方案
  • Python生成10个0-100之间的随机数,将其每个数一行写入“随机数.txt”文件,然后从文件中读出十个数,排序后写入“排序.txt”文件。文件路径随意指定。
  • 手游出海必用的三大推广策略
  • Python 实现批量文件改名操作。比如某路径下有“01.txt”“02.txt”“03,txt”,将其统一改为“学生01.txt”“学生02.txt”“学生03.txt”的形式。
  • NodeJs 搭建简单的聊天室
  • SolrCloud 5.x 集群部署方法
  • Spring Boot 和Spring Data
  • centos7使用docker下安装mysql并配置
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • Android单元测试 - 几个重要问题
  • Computed property XXX was assigned to but it has no setter
  • Java反射-动态类加载和重新加载
  • Selenium实战教程系列(二)---元素定位
  • Shadow DOM 内部构造及如何构建独立组件
  • 技术:超级实用的电脑小技巧
  • 前端攻城师
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • # 数论-逆元
  • #在 README.md 中生成项目目录结构
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (pojstep1.3.1)1017(构造法模拟)
  • (论文阅读40-45)图像描述1
  • (新)网络工程师考点串讲与真题详解
  • (转)http协议
  • (状压dp)uva 10817 Headmaster's Headache
  • ***原理与防范
  • .apk 成为历史!
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .net core控制台应用程序初识
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • .sys文件乱码_python vscode输出乱码
  • // an array of int
  • /etc/fstab 只读无法修改的解决办法
  • @Bean有哪些属性
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法
  • [BZOJ 3282] Tree 【LCT】
  • [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [ERROR] ocp-server-ce-py_script_start_check-4.2.1 RuntimeError: ‘tenant_name‘
  • [HNOI2008]水平可见直线