总结自书籍:https://weread.qq.com/web/reader/94332ce0813ab7cc8g016ad1#outline?noScroll=1
计算机的组成:运算器、控制器、存储器、输入设备、输出设备
- 计算机内部都是由集成电路构成的,CPU和内存本质上都是集成电路,集成电路是由大量晶体管构成的电子部件
- 集成电路的所有引脚都有0V或5V两种状态,因此计算机使用二进制来处理信息
- CPU组成:寄存器、控制器、运算器、时钟(之间通过电信号相互连通)
- CPU由不同功能的寄存器构成:程序计数器、累加器、标志寄存器、指令寄存器、栈寄存器
- 寄存器的本质是集成电路,寄存器的位数即数据引脚的个数,即能存放数据的bite数
- 32位CPU指CPU的寄存器长度为32比特bite(1 bite = 1 位二进制数)
- 内存内部有很多能存储8bite(1字节)数据的容器,每个字节都分配了一个地址,通过地址可读写内存中的指令和数据;内存通过控制电路与CPU相连
- 假设要向下图这块内存芯片中写入1字节的数据,需要先给VCC接上 + 5V电源,给GND接上0V电源,然后通过A0~A9的地址信号指定数据的存储位置,将要写入的数据值输入数据信号D0~D7,最后将WR信号设置为1。这样,数据就写入了内存芯片。当需要读取数据时,我们需要通过地址信号A0~A9指定数据存储位置,将RD信号设置为1,这时,指定地址中存储的数据就会通过D0~D7的数据信号引脚输出
- 假设要向下图这块内存芯片中写入1字节的数据,需要先给VCC接上 + 5V电源,给GND接上0V电源,然后通过A0~A9的地址信号指定数据的存储位置,将要写入的数据值输入数据信号D0~D7,最后将WR信号设置为1。这样,数据就写入了内存芯片。当需要读取数据时,我们需要通过地址信号A0~A9指定数据存储位置,将RD信号设置为1,这时,指定地址中存储的数据就会通过D0~D7的数据信号引脚输出
CPU可以直接解释执行的只有机器语言,高级编程语言都需要编译成机器语言,然后通过链接生成可执行的EXE文件才能运行
- 编译:编译的过程由编译器完成,编译器是将高级语言翻译为机器语言的一种程序(在程序运行时对源代码进行逐行翻译的是解释器)
- 程序是指示计算机完成一件事的指令和数据的集合
- 机器语言由0、1组成,其本质是电信号
- 将机器语言的每种电信号功能用英文单词或其缩写(即助记符)表示即为汇编语言,汇编语言可以通过“汇编”转换为机器语言,机器语言可以通过“反汇编”转换为汇编语言
- 链接:编译生成的包含本机代码的目标文件是不完整的,因为程序调用的函数的实际内容并非都在源代码中(比如调用的外部函数),需要将所调用函数编译生成的目标文件链接在一起生成一个EXE文件,这个将多个目标文件拼接在一起的过程成为链接,完成这一操作的程序成为链接器
- 启动代码:需要链接在所有程序的开头
- 库文件:由多个目标文件打包而成,在链接时指定库文件,链接器就可以从中提取所需的目标文件,并将其与其他目标文件一起链接生成EXE文件
- DLL:动态链接库,在程序运行时才进行链接特殊库文件
- 静态链接库:包含目标文件本身,可以直接链接到EXE文件的库文件
- 运行:EXE文件作为一个独立的文件存储在硬盘中,当我们在资源管理器中双击EXE文件时,EXE文件中的内容会被加载到内存并运行
- EXE文件的内容分为重定位信息、变量取、函数区。在EXE文件中,变量和函数被分配的内存地址都是虚拟的,在程序运行时,这些虚拟的内存地址会转换成实际的内存地址,链接器会在EXE文件开头记录需要进行内存地址转换的各个位置,这些信息被称为重定位信息,即变量和函数的相对地址。在源代码中,变量和函数都是分散在各个位置的,但在链接后的EXE文件中,变量和函数会被集中起来分成两组连续排列。于是,每个变量的内存地址就可以表示为该变量相对于变量区起始位置的偏移量,每个函数的内存地址也可以表示为该函数相对于函数区起始位置的偏移量。每个区的基地址是在程序运行时确定的
- 内存中的程序由变量空间、函数空间、栈空间、堆空间4个区域组成。在加载程序的内存空间中,还会生成栈和堆,栈用来存放函数临时使用的局部变量和调用函数时传递的参数,堆在程序运行时存放任意数据
- 栈数据的存放和丢弃由编译器自动生成的代码来完成
- 内存中的对空间需要程序员通过程序显示分配和释放
- 内存泄漏:程序运行结束后,内存空间依旧处于占用状态
- 垃圾收集(garbage collection):指将堆空间中已经不再需要的数据进行清理,从而释放被占用的内存空间
磁盘
- 计算机中的存储器包括内存和磁盘。
- 扇区是磁盘在物理上可读写的最小单位,簇是磁盘在逻辑上的读写单位,簇是n个扇区,同一个簇中不能存放不同的文件,否则无法删除簇中的部分文件,所以文件都是占用簇的整数倍
- 存储在磁盘中的程序需要先加载到内存才能运行,不能在磁盘上直接运行。这是因为CPU在对程序内容进行解释和运行时,是通过其内部的程序计数器指定内存地址来读取程序的,如下图(CPU能够直接读取并运行磁盘上的程序,由于磁盘读取速度慢,所以程序的运行速度也会很慢)
程序的运行环境
- 运行环境=操作系统+硬件(处理器、内存等)
- 操作系统:多个程序的集合体,在操作系统中运行的应用程序通过操作系统提供的函数来间接访问硬件
- 系统调用:应用程序调用操作系统提供的函数
- 操作系统和高级编程语言对硬件进行了抽象化 —— 文件实际上就是操作系统将磁盘空间抽象化之后的形态
- Java编写的语音编译后生成的是字节码,字节码的运行环境称为Java虚拟机(Java Virtual Machine,Java VM),JVM会将Java字节码逐一转换为本机代码(即机器语言的程序)
- 云计算:通过互联网来使用硬件、操作系统、应用程序等计算机及资源,可分为以下几类
- SaaS:Software as a Service,软件即服务,提供应用程序
- PaaS:Platform as a Service,平台即服务,提供操作系统
- IaaS:Infrastructure as a Service,基础设施即服务,提供硬件
- 中间件:介于操作系统和应用程序中间的软件(比如数据库),操作系统和中间件统称为系统软件
- 识别外部设备的三件套:I/O端口号、IRQ、DMA通道
- 计算机主机上有用于链接外部设备的接口,这些接口内部装有转换主机和外部设备电信号的芯片,即I/O控制器,I/O控制器中有用于临时存放输入输出数据的存储器,即端口,通过端口号可以区分不同端口,端口号也成为I/O地址
- in指令和out指令通过端口号可以在指定端口和CPU之间输入和输出数据,这与通过内存地址来读写内存是一样的
- 中断处理:Interrupt Request(IRQ)中断请求是一种让当前正在运行的程序暂停,转而运行其他程序的机制,这被称为中断处理
- 中断控制器:用于将来自多个外部设备的中断请求依次交给CPU处理
- DMA:Direct Memory Access,直接内存访问。指外部设备不经过CPU中转,直接和内存进行数据传输,可以将大量数据快速传输到内存(通过CPU在外部设备和内存间传输数据的方式成为PIO Programmed I/O)
- 计算机主机上有用于链接外部设备的接口,这些接口内部装有转换主机和外部设备电信号的芯片,即I/O控制器,I/O控制器中有用于临时存放输入输出数据的存储器,即端口,通过端口号可以区分不同端口,端口号也成为I/O地址
- 显存:计算机中用于保存要显示的信息的存储器
对高级语言的具体实现
- 函数调用:调用指令先将调用函数的下一条指令的地址保存到栈内,然后将函数入口地址设置到程序计数器,函数体执行完后,会在最后执行返回指令,返回指令将保存在栈中的地址设置到程序计数器中
- 循环和条件判断:设置程序计数器的值
数组是所有数据结构的基础
- 数组是使用内存的基础,各种内存的使用方式都是基于数组发展出来的
- 栈、队列:先声明一个数据存放数据,然后编写函数读写元素
- 链表:对于数组中的每个元素,不仅要保存它的值,还要额外保存其下一个元素的下标
- 二叉树:数组中的每个元素保存其本身的值+其左右元素的下标