1、什么是程序?
程序 = 数据 + 算法
2、计算机运行程序的目的是什么?
要么重视过程,要么重视结果,要么两者皆有。
3、什么是内存?程序运行为什么需要内存?DRAM与SRAM的区别?
内存相当于一个容器一样,要存储东西。计算机或MCU需要内存是要程序让存储于内存中并且让程序跑起来。
SRAM:静态内存,速度快于DRAM,价格昂贵,一般用在CPU的一级缓存,二级缓存,要求特别高的地方;
DRAM:价格相对于SRAM便宜一点,速度要比SRAM慢,DRAM又分为好多代。比如:SDRAM、DDR1 DDR2……LPDDR等等。现在电脑中的内存多用DDR。那么DDR是什么呢?DDR(Double Data Rate)双数据速率,是一个改进的RAM,一个时钟周期可以读写两次,那么速度就变快了。
4、数据(全局变量、局部变量)与代码(程序)存储的方式分为哪几种结构?怎么分的?
按照数据(全局变量、局部变量)与代码(程序)存储的方式的不同,分为冯诺依曼结构和哈佛结构。
冯诺依曼结构:数据(全局变量、局部变量)与代码(程序)存储在同一个空间,而且数据与代码共用一条传输总线。
哈佛结构:数据(全局变量、局部变量)与代码(程序)分开存储。两条传输线,一条数据线,一条命令线。(ps:这里就提到了预取指的命令与作用了。)
以上两者也没有绝对的那个优于那个。各有优势。我们一般的单片机中可能是哈佛结构:程序下载到FLASH中原地运行,用到的数据存储于RAM中。
5、如何管理内存?
分类:有操作系统与无操作系统
有操作系统:我们可以通过操作系统提供给我们的一些接口API来分配内存,这样分配的方式称为静态分配内存;在程序运行的过程中,需要随时分配,随时释放,这种分配方式叫动态分配内存。
无操作系统(裸机):程序需要直接操作内存,编程者需要自己计算内存的使用和安排,这属于静态分配内存。
6、内存的深入理解
硬件角度与逻辑角度
硬件角度:我们实实在在能看到的一个东西,像电脑中的内存条这个东西。
逻辑角度:内存可以随机访问(在内存的有效空间内)。内存实际上是有多个内存单元格子组成的,每一个格子都有一个固定的地址,叫做内存地址,这个格子与内存地址永久绑定。
7、32位的系统或者64位的系统中,这个32位与64位怎么理解?
32位的系统:32位数据线,但一般地址线也是32位。(64位也是如此)。
这个地址线32位就决定了内存地址只能有32位2进制。也就是2^32。也就是4G的内存空间。
三总线的概念:地址总线、数据总线、控制总线。
往内存中写一个数据的过程:控制总线上传输命令(写命令),地址总线上传输要写入数据的内存地址,数据总线上传输数据。
地址总线的数决定了内存的大小。
8、位和字节
1GB = 1024MB
1MB = 1024KB
1KB = 1024B
1B = 8bit
9、内存位宽
内存位宽(内存数据线的数量)是指在一定时间(时间是指一个时钟周期),内所能传送的数据的位数,位数越大,则所能传输的数据量就越大。
10、内存编址和寻址、内存对齐
内存中的每一个格子都有一个编号,这个编号就是内存地址。这个内存地址(一个数字)和这个格子一一对应且永久绑定,这就是内存编址方法。
11、关键:内存编址是以字节为单位的
问题:我们以多大的空间划分一个格子的大小呢?
以一个字节的大小为基本单元对整个内存进行划分。也就是一个格子就是一个字节。
32位的单片机的内存为什么是4G,怎么算的。
2^32 /(1024) = 4194304 KB
4194304KB / 1024 = 4096 MB
4096MB / 1024 = 4GB
12、内存和数据类型的关系
C语言中数据类型的本质就是一个内存格子的长度和解析方法。
char 占1个字节
int 占4个字节
float 占4个字节
double 占8个字节
以上也不是恒定的,也依据机器位宽。
13、内存对齐
内存对齐效率高于非内存对齐(通常硬件支持非对齐访问的)。
14、C语言对内存的封装
比如:int a;
表示编译器帮我们申请了一个int类型的内存格子(长度是4个字节,地址是确定的,但是只有编译器知道),并且把符号a和这个格子绑定。
15、用指针来间接访问内存
指针是什么?一般我们都说指针就是地址。说的严谨一点就是:指针就是一个变量,一个专门用于存放地址的变量。
int *p ; 表示:变量p里边存放的是一个地址,这个地址指向的空间用于存放一个int类型的整数。
16、用数组来管理内存
比如:
#include <stdio.h>
intmain()
{
int a[5] = {5,4,3,2,1};
}
可以得出如下结论:
(1)数组名就是数组首元素的地址
(2)a+1,编译器会明白是要a[1]的地址。
(3)地址加1,对应的是在地址的值上加一个数组元素类型。
17、内存管理之结构体
为什么需要结构体?结构体有和好处?
这里就要说说数组的三个特点了:
(1)数组只能存储同种类型的元素
(2)数组大小必须定义时给出,而且多数情况下,数组的空间大小一旦确定就不能再修改
(3)数组的看空间必须是连续的。
为了解决第一个缺点,那么就需要结构体登场了。
比如:
strut people
{
int age; //年龄
char name[20]; //名字
int height; //身高
}
18、内存管理之栈(stack)
什么是栈?
栈是一种数据结构,C语言中用来存储局部变量的。栈是被发明出来管理内存的,是一种维护内存的机制,这就是栈的本质。
栈管理内存的特点:小内存,自动化。
FILO(First in last out)先进后出 栈
FIFO(First in First out )先进先出 队列
C语言中的局部变量是用栈来实现的。局部变量的作用域是函数内部。栈还保存这函数调用所需的所有维护信息。
局部变量在函数运行结束后,栈空间会被释放。生命周期结束。
在C语言中,定义局部变量时如果没有初始化,则值是随机的,为什么?
定义局部变量时,其实就是在栈中通过移动栈指针,来给程序提供一个内存空间和这个局部变量名绑定。而栈是反复使用的,有可能这块内存空间是上次使用过的,上次的值还在其中,那么不初始化则就是这个垃圾值。所以说我们定义的局部变量一定要初始化。
19、内存管理之堆(heap)
堆也是一种动态内存管理方式。
堆内存管理方式特点:随时申请,随时释放,大小块随意。
在上操作系统时,大内存,以及反复使用及释放时,都是通过堆内存来实现的。
动态内存:指程序在运行中取得内存空间,而不是编译时就确定好固定大小的内存空间。
堆内存申请释放都需要手工进行。一定要注意内存泄漏。申请的内存用完之后一定要记得释放掉。
局部变量一般存储于栈中;全局变量一般存储于静态数据区中;动态申请内存存于堆中。
内存一般分为:栈、堆、静态存储区。