CPU
问题
程序是什么
一个通过逻辑运算得到结果的一个工具 指示计算机每一步动作的一组指令
程序是由什么组成的
变量以及逻辑运算 指令和数据
什么是机器语言
字面上就是机器看得懂的代码 CPU可以直接识别并使用的语言
正在运行的程序存储在哪
运算器 内存
什么是内存地址
不知道 内存中用来表示命令和数据存储位置的数值
计算机的构成元件中,负责程序解释和运行的是哪个
cpu
cpu的组成:寄存器、控制器、运算器、时钟
组成 | 作用 |
---|---|
寄存器 | 暂存指令、数据等处理对象,类似内存 |
控制器 | 负责把内存中的指令、数据等读入到寄存器,并根据执行的结果来控制整个计算机 |
运算器 | 负责运算寄存器中的数据 |
时钟 | 负责发出CPU开始计时的时钟信号,也有计算机的时钟位于CPU的外部 |
Tips: 如Pentium 2GHZ表示时钟信号的频率为2GHz(1GHz=10亿次/秒),即时钟频率越高CPU的运行速度越快
程序是把寄存器当成对象来描述的 汇编语言是采用助记符(mov、add)来编写程序,汇编语言和机器语言基本上是一一对应的
二进制的0.1用10进制表示是多少 0.5
用小数点后有3位的二级制树能表示十进制的0.625么
将小数分为符号、尾数、基数、指数4部分进行表现的形式称为什么
二进制数的基数是多少 2
通过把0作为数值范围的中间值,从而在不使用符号位的情况下来表示负数的表示方法称为什么
计算机是怎么处理小数运算的 如用C 将0.1累加100次得到的结果是10.000002,而不是10 原因:有一些十进制的小数无法用二进制数正确表示,如0.1,这和10进制数无法表示1/3是一样的
双精度浮点数类型 用64位 表示全体小数 double 单精度浮点数类型 用32位 表示全体小数 float
如果避免计算机计算出错
- 回避策略,即无视错误,误差在可接受范围的话就无视
- 将小数扩大若干倍数换成整数,然后处理后再缩小若干倍数
- BCD(Binary Coded Decimal)
内存
十个地址信号引脚的内存IC可以指定的地址范围是多少 即2的10次方 十进制的话是0-1023 二进制的话是0000000000-1111111111
高级语言中数据类型表示的是什么 占据内存区域的大小和存储在改内存区域的数据类型,如c语言中的short表示占2字节的内存区域,并且存储的是整数
在32位内存地址的环境中,指针变量的长度是多少位 32位,指针指的是用于存储内存地址的变量
与物理内存有着相同构造的数组的数据类型长度是多少 1字节,物理内存是以字节为单位进行数据存储的
用LIFO方式进行数据读写的数据结构称为什么 栈。(Last In Fist Out),栈是一种后入先出的数据结构
根据数据的大小链表分叉成两个方向的数据结构称为什么 二叉查找数(Binary search treeJ),二叉查找树指的是从节点分成两个叉的树状数据结构
内存 | 描述 |
---|---|
ROM | Read Only Memory,即只能用来读取的内存 |
RAM | Read Access Memory,即可被读取和写入的内存 |
内存中有电源、地址信号、数据信号、控制信号等用于输入输出的大量引脚,通过为其指定地址,来进行数据的读写
相同的值是不同数据类型时占用的内存也不一样,如123,当时char时占1字节,是short时占2字节,是long时占4字节
指针也是一种变量,它表示的不是数据的值,而是存储着数据的内存的地址,通过使用指针就可以对任意指定地址的数据进行读写
数组是高效使用内存的基础 数组是指多个同样数据类型的数据在内存中连续排列的形式。作为数组元素的各个数据会通过连续的编号被区分开来,这个编号称为索引。
栈、队列以及环形缓冲区
栈和队列都可以不通过指定地址和索引来对数组的元素进行读写。区别在于数据出入顺序不同。栈是LIFO,队列是FIFO。
如果在程序中要实现栈和队列,就需要以适当的元素数来定义一个用来存储数据的数组,以及对该数组进行读写的函数对。
队列一般是以环形缓冲区(ring buffer)的方式来实现的
链表&二叉查找树
链表和二叉查找树都是不用考虑索引顺序就可以对数组元素进行读写的方式。
- 链表可以更高效的对数组元素进行追加和删除处理
- 二叉树可以更加高效的对数组数据进行检索
在数组的元素中除了数据的值外,通过为其附带上上下一个元素的索引即可实现链表。所以数组在删除元素时,只要将上一个元素的下索引指向下一个元素的索引即可;
二叉查找树是指在链表的基础上往数组中追加元素时,考虑到数据的大小关系,将其分成左右两个方向的表现形式。
磁盘
存储程序方式指的是什么
通过使用内存来提高磁盘访问速度的机制称为什么 缓存
把磁盘一部分作为假想内存来使用,交换分区
windows中在程序运行时,存储着可以动态加载调用的函数和数据的文件称为什么 DLL文件(Dynamic Link Library) 在EXE程序文件中,静态加载函数的方式称为什么 静态链接 在windows计算机中,一般磁盘的1个扇区时多少字节 521Byte
虚拟内存的方法有分页式和分段式。
扇区是对磁盘进行物理读写的最小单位。
压缩
文件存储的基本单位式什么 字节
LZH是通过LHA等工具压缩后的扩展名
在Windows中使用的SHITFT JIS字符编码中,1个半角英数是用几个字节的数据来表示的 半角英文数字用1个字节表示,汉字等全角字符是用2个字节表示
BMP(BITMAP)格式的图像文件,是压缩过的么 没压缩过,BMP要比JEPG格式等压缩过的图像文件大不少
可逆压缩和非可逆压缩的不同点是什么 压缩后能复原就是可逆压缩
RLE算法。如AAABB这个数据压缩过的文件压缩后就是A3B2。就是把文件内容用“数据*重复次数”的形式来表示的压缩方法
- 不适合文本文件的压缩,因为同样字符多次重复出现的情况不多见
- 适用与数据经常连续出现的图像、文件等
哈夫曼算法 LHA使用的就是哈夫曼算法。 哈夫曼算法关键在于“多次出现的数据用小于8位的字节数来表示,不常用的数据则可以用超过8位的字节数来表示。
程序的运行环境
从源文件到可执行文件
程序在每次运行时,程序内的变量及函数被分配到内存的地址都是不同的,这是如何表示的? 虚拟内存地址。在程序运行时,虚拟的内存地址会转换成实际的内存地址,链接器会在EXE文件的开头追加转换内存地址所需的必要信息,这个信息称为再配置信息
EXE文件的内容分为再配置信息、变量组和函数组。在程序加载到内存后除了上面4个还会额外生成两个组,即堆和栈。
- 栈用来存储函数内部临时使用的变量(局部变量),以及函数调用时所用的参数的内存区域
- 堆是用来存储程序运行时的任意数据即对象的内存区域
EXE文件中并不存在栈即堆的组。栈和堆需要的内存空间是在程序加载到内存后开始运行时得到分配的。因此,内存中的程序是由变量的内存空间、用于函数的内存空间、用于栈的内存空间以及用于堆的内存空间这4部分组成的。
- 栈中堆数据的存储和删除是由编译器自动生成的,不需要程序员参与
- 堆的内存空间时根据程序员写的程序,来明确进行申请分配或释放
无论时C还是C++,如果没有在程序中明确释放堆的内存空间,那么即使在处理完毕后这些内存空间也会一直残留,这个现象被称为内存泄漏(memory leak)
垃圾回收机制(garbage collection)指的是堆处理完毕后不需要的堆内存空间的数据和对象进行清理
操作系统和应用的关系
应用通过系统调用(system call)间接控制计算机硬件
汇编
汇编语言是通过助记符来描述程序的。通过跳转指令可以实现循环和条件分支。
在高级语言源码中,即使数据和指令在编写的时候是分散的,编译后也会在段段定义中集合汇总起来。
用汇编语言编写的代码与本地代码是一一对应的,即可以进行编译和反编译,可以任意转换。不过用高级语言生成本地代码,再反汇编至汇编语言,要进一步反汇编至高级语言源码是不太可能的,因为不是一一对应的关系。
在汇编语言中,一行代表对cpu的一个指令。汇编语言一个指令的语法是操作码+操作数。如MOV A,B
本地代码加载到内存才能运行,内存中存储着构成本地代码的指令和数据,程序运行时,cpu会将内存中的指令和数据读取到内部的寄存器中进行处理
函数的参数是通过栈来传递,返回值是通过寄存器来返回的。
- 在函数外部定义的称为全局变量
- 在函数内部定义的变量称为局部变量,局部变量是临时保存在寄存器和栈中的
硬件的控制方法
用来识别外围设备的编号称为I/O地址或I/O端口号
DMA(Dicect Memory Access)是指不经过CPU中介处理,外围设备直接与主内存进行数据传输,像磁盘这种用于处理大量数据的外围设备一般都有DMA功能
I/O控制器中有用于临时保存输入输出数据的内存,这个内存就是端口。 端口(Port)字面意思就是港口的意思(端口就像是在计算机和外围设备之间进行数据装卸的港口)。 一个I/O控制器可以控制一个或多个外围设备。各端口之间通过端口号来进行区分。端口号也称为I/O地址。 IN指令和OUT指令在端口号指定的端口和CPU之间进行数据的输入输出。
IRQ(Interrupt Request)是指用来执行硬件中断请求的编号。IRQ是用来暂停当前正在运行的程序,并跳转到其他程序运行的必要机制,该机制称为中断处理。 实施中断请求的是连接外围设备的I/O控制器,负责实施中断请求的是CPU。
CPU接收到来自中断控制器的中断请求后,会把当前运行的程序中断,然后切换到中断处理程序。中断处理程序的第一步就是把CPU所有的寄存器数值保存到内存的栈中,当中断处理程序完成后,再把栈中的数据还原到CPU寄存器中。
C
在C中函数的处理内容是用{}括起来的,这部分内容称为模块(block)