Category - Crash cource in computer science

0、课程导入

当玩游戏、写文档时如果断电,进度会丢失,这是为什么?

  • 原因是这是电脑使用的是RAM(随机存取存储器),俗称内存,内存只能在通电情况下存储数据。
  • 本节课程将讲述内存的工作原理。

1、概念梳理

锁存器:锁存器是利用AND、OR、NOT逻辑门,实现存储1位数字的器件。
寄存器:1组并排的锁存器
矩阵:以矩阵的方式来存放锁存器的组合件,n*n门锁矩阵可存放n^2个锁存器,但同一时间只能写入/读取1个数字。(早期为16*16矩阵)

2、锁存器

作用:存储1位数字。
图示:
title

2.5、门锁

锁存器需要同时输入2个数字,不太方便。
为了使用更方便,只用1根电线控制数据输入,发展了门锁这个器件。另外,用另一个电线来控制整个结构的开关。(和复位作用不同)

3、寄存器

作用:并排使用门锁,存储多位数字
图示:
title

4、门锁矩阵

作用:
n*n的矩阵有n^2个位址,则可以存储n^2个数。但1个矩阵只可记录1位数字,n个矩阵组合在一起,才可记录n位数。如1个8位数,会按位数分成8个数,分别存储在8个矩阵的同一个位址中。
8个矩阵,则可以记录256个8位数字。

通俗理解:
16*16的门锁矩阵,可理解为1个公寓,1个公寓256个房间。
8个门锁矩阵并排放,则有了8个公寓。
规定每一个公寓同一个编号的房间,都有一样的标记(地址),共同组成8位数字。
那么8个公寓就能存(8*256 /8)个数字。

原因:
16*16的门锁矩阵,虽然有256个位置,但每次只能存/取其中1个位置的数字。因此,要表示8位数字,就需要同时调用8个门锁矩阵。
图示:
title
title
使用方法:在多路复用器中输入位址,x行x列(2进制),即可点亮x行x列的锁存器。

举例:

行列数 矩阵1 矩阵2 矩阵3 矩阵4 矩阵5 矩阵6 矩阵7 矩阵8
1行5列 1 0 1 1 0 0 1 0
2行3列 0 1 0 0 1 1 0 1

5、内存

粗略定义:将一堆独立的存储模块和电路看做

1、概念梳理

  • CPU(Central Processing Unit):中央处理单元,负责执行程序。通常由寄存器/控制单元/ALU/时钟组成。与RAM配合,执行计算机程序。CPU和RAM之间用“地址线”、“数据线”和“允许读/写线”进行通信。
    • 指令:指示计算机要做什么,多条指令共同组成程序。如数学指令,内存指令。
  • 时钟:负责管理CPU运行的节奏,以精确地间隔,触发电信号,控制单元用这个信号,推动CPU的内部操作。
    • 时钟速度:CPU执行“取指令-->解码-->执行”中每一步的速度叫做“时钟速度”,单位赫兹Hz,表示频率。
    • 超频/降频
      • 超频,修改时钟速度,加快CPU的速度,超频过多会让CPU过热或产生乱码。
      • 降频,降低时钟速度,达到省电的结果,对笔记本/手机很重要。
  • 微体系框架:以高层次视角看计算机,如当我们用一条线链接2个组件时,这条线只是所有必须线路的抽象。

2、CPU工作原理

1)必要组件:

  • 指令表:给CPU支持的所有指令分配ID
  • 控制单元:像指挥部,有序的控制指令的读取、运行与写入。
    • 指令地址寄存器:类似于银行取号。该器件只按顺序通报地址,让RAM按顺序将指令交给指令寄存器
    • 指令寄存器:存储具体的指令代码。

2)过程

  • 取指令:指令地址寄存器发地址给RAM-->RAM发该地址内的数据给指令寄存器-->指令寄存器接受数据
  • 解码:指令寄存器根据数据发送指令给控制单元-->控制单元解码(逻辑门确认操作码)
  • 执行阶段:控制单元执行指令(-->涉及计算时-->调用所需寄存器-->传输入&操作码给ALU执行)-->调用RAM特定地址的数据-->RAM将结果传入寄存器-->指令地址寄存器+1

3)图示:

title

1、概念梳理

  • 指令:指示计算机要做什么的代码(机器码),多条指令共同组成程序。如数学指令,内存指令。
    • 注:指令和数据都是存在同一个内存里的。
  • 指令集:记录指令名称、用法、操作码以及所需RAM地址位数的表格。
    title
    程序

2、指令的执行

  • 原则:
    • RAM每一个地址中,都存放0或1个数据。
    • 特定的数字组合,就表示一个指令,否则表示一个值。
  • LOAD指令:
    • 计算机会按地址的顺序,读取RAM中所记录的指令/数据。
    • 计算机接收到指令后,如LOAD_A,则通过数据线将数据传至寄存器A。
      title
  • ADD指令:
    • ADD B A指令告诉ALU,把寄存器B和寄存器中的数字加起来,存到寄存器A中。
  • JUMP指令:
    • 遇到JUMP指令,程序会跳转至对应的RAM地址读取数据。
    • JUMP指令可以有条件跳转(如JUMP-negative),也可以无条件跳转。

3、计算机指令长度

由于长期计算机每个字只有8位,指令只占4位,意味着只能有16个指令,这远远不够。

现代计算机有两种方式解决指令不够长的问题:

最直接的是用更多位来表示指令,如32位或64位。
采用“可变指令长度”,令不同的指令的长度不同,尽量节约位数。

假设1个字为16位,如果某指令不需要操作内存,则可以省去寻址的位数。
该情况下,部分指令后面需要跟数据,如JUMP,称为立即值。

0、概念梳理

  • 缓存:在CPU中的小块RAM,用于存储批量指令。
    • 缓存命中:想要的数据已经在缓存里
    • 缓存未命中:想要的数据不在缓存里
    • 赃位:缓存里每块空间,有个特殊标记,叫赃位,用于检测缓存内的数据是否与RAM一致。
  • 多核处理器:一个CPU芯片中,有多个独立处理单元。

1、现代CPU如何提升性能:

早期通过加快晶体管速度,来提升CPU速度。但很快该方法到达了极限。
后来给CPU设计了专门除法电路+其他电路来做复杂操作:如游戏、视频解码。

2、缓存

为了不让CPU空等数据,在CPU内部设置了一小块内存,称为缓存,让RAM可以一次传输一批数据到CPU中。(不加缓存,CPU没位置放大量数据)
缓存也可以当临时空间,存一些中间值,适合长/复杂的运算。
赃位:储存在缓存中与RAM不一致的数据。
空等原因:从RAM到CPU的数据传输有延迟(要通过总线,RAM还要时间找地址、取数据、配置、输出数据)。

3、缓存同步:

缓存同步一般发生在CPU缓存已满,但CPU仍需往缓存中输入数据。此时,被标记的赃位数据会优先传输回RAM,腾出位置以免被覆盖,导致计算结果有误。

4、指令流水线:

作用:让取址→解码→执行三个步骤同时进行。并行执行指令,提升CPU性能。
原本需要3个时钟周期执行1个指令,现在只需要1个时钟周期。
设计难点:数据具有依赖性 跳转程序

数据依赖性解决方法:
乱序运行、预测分支(高端CPU)
title

5、一次性处理多条指令

title

6、同时运行多个指令流(多核CPU)

多核处理器:一个CPU芯片中,有多个独立处理单元。但因为它们整合紧密,可以共享一些资源。

7、超级计算机(多个CPU)

在一台计算机中,用无数个CPU,做怪兽级的复杂运算,如模拟宇宙形成。

1、早期,程序如何进入计算机

程序必须人为地输入计算机。早期,电脑无内存概念,人们通过打孔纸片等物理手段,输入数据(数字),进入计算机。

2、早期计算机的编程

  • 打孔纸卡/纸带:在纸卡上打孔,用读卡器读取连同电路,进行编程。原因,穿孔纸卡便宜,可靠也易懂。62500张纸卡=5MB数据
  • 插线板:通过插拔线路的方式,改变器件之间的连接方式,进行编程。
  • 面板开关(1980s前):通过拨动面板上的开关,进行编程。输入二进制操作码,按存储按钮,推进至下一个内存位,直至操作完内存,按执行键执行操作。(内存式电脑)

3、现代计算机基础结构——冯诺依曼计算机

冯诺依曼计算机的标志是,一个处理器(有算术逻辑单元)+数据寄存器+指令寄存器+指令地址寄存器+内存

0、概念梳理

伪代码:用自然语言(中文、英语等)对程序的高层次描述,称为"伪代码"。
助记符:是便于人们记忆、并能描述指令功能和指令操作数的符号,助记符是表明指令功能的英语单词或其缩写。

1、早期二进制写代码

先前都是硬件层面的编程,硬件编程非常麻烦,所以程序员想要一种更通用的编程方法,就是软件。
早期,人们先在纸上写伪代码,用"操作码表"把伪代码转成二进制机器码,翻译完成后,程序可以喂入计算机并运行。

2、汇编器&助记符

背景:1940~1950s,程序员开发出一种新语言,更可读、更高层次(汇编码)。每个操作码分配一个简单名字,叫"助记符"。但计算机不能读懂"助记符",因此人们写了二进制程序"汇编器"来帮忙。
作用:汇编器读取用"汇编语言"写的程序,然后转成"机器码"。

3、最早高级编程语言"A-0"

汇编只是修饰了一下机器码,一般来说,一条汇编指令对应一条机器指令,所以汇编码和底层硬件的连接很紧密,汇编器仍强迫程序员思考底层逻辑。
1950s,为释放超算潜力,葛丽思·霍普博士,设计了一个高级编程语言,叫"Arithmetic Language Version 0",一行高级编程语言,可以转成几十条二进制指令。但由于当时人们认为计算机只能做计算,而不能做程序,A-0未被广泛使用。
过程:高级编程语言→编译器→汇编码/机器码

4、开始广泛应用的高级编程语言FORTRAN

1957年由IBM1957年发布,平均来说,FORTRAN写的程序,比等同的手写汇编代码短20倍,FORTRAN编译器会把代码转成机器码。但它只能运行于一种电脑中。

5、通用编程语言——COBOL

1959年,研发可以在不同机器上通用编程语言。
最后研发出来一门高级编程语言:"普通面向商业语言",简称COBOL
每个计算机架构需要一个COBOL编译器,不管是什么电脑都可以运行相同的代码,得到相同结果。

6、现代编程语言:1950s-2000

1960s起,编程语言设计进入黄金时代。
1960:LGOL,LISP和BASIC等语言
70年代有Pascal,C和Smalltalk
80年代有:C++,Object-C和Perl
90年

1、变量、赋值语句

如a=5,其中a为可赋值的量,叫做变量。把数字5放a里面,这叫"赋值语句",即把一个值赋给另一个变量

2、if判断

可以想成是"如果x为真,那么执行y",反之则不执行"y",if语句就像岔路口,走哪条路取决于条件的真假。

3、while循环

当满足条件时进入循环,进入循环后,当条件不满足时,跳出循环。

4、for循环

for循环不判断执行条件,判断次数,会循环特定次数,不判断条件。for的特点是,每次结束,i会+1。

5、函数

当一个代码很常用的时候,我们会把它包装成一个函数(也叫方法或者子程序),其他地方想用这个代码,只需要写函数名即可。

    Page 3 of 3