快速理解编程结构_编程基础:高级编程需要了解的计算机组织结构与内存基础...

47d4df9a5904ee9ef5ff59ddfe12e074.png

编程基础

程序就是我们人类编写的一连串的指令集合来告诉计算机如何去做某件事,要想编写出好的程序,必须对我们要发号施令对象有所了解才行。

知己知彼嘛,所以在学习编程之前,了解计算机到底是个什么,它内部大体是个什么模样,它是如何去执行我们给它的程序的非常有必要。

当然,如果你只想做个机械翻译式的码农,完全不需要了解这些,只学会编程语言的语法,就可以干了,有些人也会干的不错。

但是对于编程对象的不了解,终究还会是一个进一步前进的阻碍,所以我还是想带大家来了解一下编程跟硬件之间的关系,以助于我们更好的去理解各类编程语言的设计基础和操作原理。不说废话了,我们先出计算机体系结构这个基础概念说起吧。

计算机组织结构:

组装过电脑的同学可能都知道,我们可以买一堆的零部件然后自己来组装一天台式电脑,其实对于计算机来说在更内部的层级上也是一个分开设计的产物。

因为从内到外计算机从来都不是一个单一的元器件,而是一组元器件相连接构成的计算机系统。系统就意味着有多个独立的部分一联合成的一个整体。

对于计算机系统发展来说,一直以来一个很重要的方向就是先假定它的各个部件都以做好,任务是研究它的组织结构,设计一些连接方式和组成架构,然后验证计算机部件是否按预期运行,这就是计算机体系结构要做的事。

因此计算机体系结构研究只关注的是我们用户所看到的计算机的结构和行为。

它包括用于我们如何从内存空间中找到信息,以及这些信息的格式,我们操作这些内容需要的指令集合和相关的技术方案。

要想有一个好的计算机,我们需要像搭积木一样去不断的设计,然后实践测试,这个过程主要涉及到处理器和存储器等各种功能模块的规范,

找到一个最佳的方案来将它们组合成计算机系统

说了这么多背景,其实就像想说明一点,计算机可以有很多架构类型,只要你能设计的出来。

不过目前来说,计算机架构设计中主流的只有两种基本类型:冯·诺伊曼结构哈佛结构

因为现在绝大部分主流计算机都采用了冯·诺依曼体系结构设计,所以我们想学编程必须对它有一定的了解。

因为它描述了计算机硬件、程序和数据应该遵循的一般框架或结构。

冯诺依曼结构体系:

简单来说,冯·诺依曼设想计算机系统的结构是由下列组件组成:

  • 算术逻辑单元(ALU):执行计算机的计算和逻辑功能的算术逻辑单元。
  • 随机存取存储器(RAM):内存,更具体地说,计算机的主存储器,或快速存储器,也 称为随机存取存储器(RAM)。
  • 控制器单元(CU):这是一个组件,它负责指示计算机的其他组件执行某些操作,比如指示从内存中提取数据或指令交给ALU来处理。
  • 人机接口(I/O): 我们常说的输入和输出设备,比如键盘用于输入和显示器用于输出。

我们的台式机就是一个典型的冯诺依曼体系结构的计算机。

3179d680e2cdbbd2d3a20f9169822204.png

图片来源于网络

哈佛结构体系:

而对于哈佛体系结构来说,它与冯诺依曼体系结构不同的地方是它使用了独立的存储和信号通路来处理指令和数据。

因为它最早在哈佛大学的Mark I和中继锁存器数据中被采用,所以叫做哈佛体系结构。

在采用哈佛架构的计算机中,CPU可以同时从内存中读取指令和数据,这使得使内存带宽有加倍的效果。

基于微控制器单片机的计算机系统和基于数字信号处理器(DSP)的计算机系统都是采用了哈佛体系结构的例子。

其实,我们现在用的主流计算机组织结构是冯诺依曼结构,其中跟我们编程关系最密切的就是内存,所以我们先说一下内存单元部分。

计算机内存单元:

因为内存就是一块块可以存储的空间,我们逻辑上将其划分为一块块同样的砖块一样的单元,本身是一整块,我们划分了单元,所以排序是不变的,

如此我们可以设定起始位置,沿着某个方向移动的单位,偏移量,以及当前位置,最大位置,都用下标标记,连续的区域我们可以把它看成一个数学里数组,不连续的可以用每个区域保存数据同时保存一个位置信息变成链块,多个散列的链块通过左右位置信息就有了逻辑上的顺序,构成链表等等。

这些其实都是在一个固定的内存空间中进行的一种空间的逻辑操作。

接下来我们先说一下计算机内存单元体系,那什么是内存单元呢? 简单理解它就是计算机里一个负责存储东西的地方,这个地方一个体系,它有空间放东西,还有负责将东西搬入搬出的通路,合在一起才是内存体系。

因为它是个固定尺寸的空间,但是有需要被很多应用程序共享使用,所以必须好好的管理调配才可以。

为了直观理解,我们可以把它想象成可以连通的储物柜,我们一次可以操作一个,也可以操作连载一块的多个,我们可以在多个储物柜之间想东西搬来搬去,我们预订它们,也可以清空它们。

如果我们要知道储物柜能装多少东西,首先得有计量单位。

8bed5b118fcc050a4981022767cc87a5.png

储物柜与内存空间

内存的计量单位

我们知道在计算机内存里它只能保存二进制信息,也就是0和1,成比特位组,这些一组组的比特位就是内存单位:

可以将它理解成多个比特位封装成的实体。一个比特位的小箱子,每次从内存空间中搬入和搬出的单位,它可大可小,只取决于我们要定义的数据最小单位。

一个内存字就是一组0和1组合,它可能代表一个数字,一个操作指令代码,一个或多个字母数字字符或者任何其他的二进制编码信息。

由于我们的二进制表示的数据都是2的倍数位,所以我们一般取8比特位作为一组,我们称之为一个字节(byte)。

大多数计算机内存使用的字的比特数是8的倍数,也就是多少字节。

因此,比如一个16位的字就包含两个字节,一个32位的字将由4个字节组成。

我们通常说的计算机的内存容量通常表示为可存储的总字节数。

目前,计算机的内存可能的范围在2^10个字节,需要10位的地址表示,到2^32字节,需要32位地址表示。

由于数字过大,所以我们通常用K,M和G三个字符分别代表三个量级的内存空间。

1K=2^10字节,1M=2^20字节,1G=2^30字节。

以上就是我们需要初步了解的计算机编程中最重要的一个操作目标:内存空间,它的简单理解。

后面我们会抽时间继续说CPU和输出输出部分的理解。

可能有些人还是不理解我这么说,那么计算机组织体系结构跟我们编程的关联在哪里呢?

ea02a18cab0e03cd6efc018e14c6e69a.png

体系结构与编程的关系

这里我先简单的大概说一下,以后我们编程会在哪些方面需要用到这些理解。

其实与我们编程相关的主要部分是冯诺依曼体系结构里的CPU,内存和I/O。

它们是所有操作系统都要实现的主要管理对象,也是我们任何编程语言都要处理交互的重中之重。

可以把冯诺依曼体系架构中的这三个主要构件看成三个单元体系,分别是中央处理单元(CPU),主内存存储单元(MM)和I/O处理器单元。

这三个主要部件之间通过总线系统两两相互连接,如此就构成了它们之间的三组输入输出关系。

CPU与主内存之间的输入输出,CPU与I/O处理器之间的输入输出,还有就是主内存与I/O处理器之间的输入输出。

其实我们所编写的任何程序都不外乎是对它们之间这种输入输出数据流的处理。

这可以体现在内存区域的移动复制,数据通道的建立销毁,数据流的读写,包括中断事件处理,线程调度等等。

我们对于CPU内部结构的了解,有助于让我们知道我们的CPU每次从所谓的一级缓存,二级缓存,三级缓存等高级缓存读取数据,要比从主内存中读取速度要快很多,也让我们知道每次线程切换时数据和执行的记录和内存空间的拷贝复制,以及从寄存器刷出到主内存,这些操作有个更加形象的理解。

当我们需要大块数据读入和读出时,我们如何使用主内存和I/O处理器之间的直连总线来不经过CPU进行数据的读取和写出等等。

从阻塞式IO到非阻塞式IO以及同步和异步输入输出等这些编程规范设计,它到底是建立在怎样一个内存空间转换调度上的。

这些以后有时间我会细说,因为这些都是编写高并发应用处理程序的核心,也是你编写高性能应用程序的要义所在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值