课本知识重难点梳理
第1章 计算机系统漫游
1.信息
-
位+上下文
系统中所有信息都是由一串位表示的,区分不同数据对象唯一方法是读到这些数据对象时的上下文。
2.程序被翻译成不同格式
-
编译系统
预处理器、编译器、汇编器、链接器
3.存储设备层次结构
- 核心思想:缓存
- 操作系统核心抽象:文件、虚存、进程、虚拟机
第2章 信息的表示和处理
1.信息存储
- 进制转换:拿二进制作中间量
- 网络编程基础:字节顺序
大端法:高对低,低对高
小端法:高对高,低对低
- 运算
逻辑运算:结果0或1(如果对第一个参数求值就能确定表达式的结果,那么就不会对第二个参数求值)
位运算:结果位向量
有无符号计算、截断、扩展都要结合具体的练习来体会公式的使用。
- 掩码:对特定位可以置一,可以清零
- IEEE浮点标准
V=(-1)^s X 2^E X M 来表示一个数
符号:s决定这个数是正还是负。
阶码:E对浮点数加权,权重是2的E次幂。
尾数:M是一个二进制小数,范围为1~2-ε或者0~1-ε。
- 舍入
向偶舍入:将数字向上或向下舍入,结果的最低有效数字为偶数。
能用于二进制小数。(默认)
向零舍入:把整数向下舍入,负数向上舍入。
向下舍入:正数和负数都向下舍入。
向上舍入:正数和负数都向上舍入。
第3章 程序的机器级表示
1.机器级代码
- ISA指令集体系结构
gcc -s hello.c(产生汇编代码)
gcc -c hello.c(编译并汇编该代码)
objdump -d hello.o(反汇编)
针对指令的使用结合具体的练习进行学习效率会更高。
2.过程
-
栈帧结构
栈帧——为每一个过程分配的内存空间,它包含两个特殊的参数,栈指针和帧指针。
栈是向低地址增长的。帧指针:%ebp,指向栈底。
栈指针:%esp,指向栈顶,栈指针可以移动,来分配或释放空间。
%esp减小——分配空间
%esp增大——释放空间
第4章 处理器体系结构
1.Y86指令集体系结构
具体使用结合练习
- 异常
halt指令、非法指令、访问非法地址
2.HCL硬件控制语言
- 数字系统
组合逻辑、存储器元素、时针信号
- 表达式
AND:&&
OR:||
NOT:!
3.Y86的顺序实现
取指、译码、执行、访存、写回、更新PC
第6章 存储器层次结构
1.随机访问存储器RAM
分类:SRAM和DRAM
特点:掉电失忆
- SRAM比较DRAM
SRAM:供电不变,不刷新,抗干扰,存取快,贵
2.只读存储器ROM
- 分类:根据能被重新编写次数和对其编程所用机制分
PROM:编程一次
EPROM:能被擦除和重编1000次
EEPROM:基于EPROM,达10^5次
flash:一类非易失性存储器
- 特点:非易失性
3.磁盘
- 磁盘的容量 = 每扇区大小每磁道扇区数磁道数 *2 * 盘片数量
- 访问时间
T(max rotation)=1/RPM * 60secs/1min ——最大旋转延迟时间
T(avg rotation)=1/2 * T(max rotation) ——平均延迟时间
T(avg transfer)=1/RPM * 1/(平均扇区数/磁道) * 60secs/1min ——平均传送时间
T(access)=T(avg seek)+T(avg rotation)+T(avg transfer) ——整个估计的访问时间
总结:访问一个磁盘扇区中512字节主要花在寻道时间和旋转延迟
4.总线
- 存储总线
1.并行传递方式。
2.指令和数据向CPU传递时的通道。
3.分三组:数据总线(用于传递数据);
地址总线(用于传递主存储器的地址);
控制总线(用于各种内部控制指令的传递)。
- 系统总线
1.传送的信息包括数据信息、地址信息、控制信息。
2.数据总线(用于传送数据信息);
地址总线(用来传送地址的地址总线的位数决定了CPU可直接寻址的内存空间大小);
控制总线(用来传送控制信号和时序信号)。
- I/O总线
指缆线和连接器系统,用来传输I/O路径技术指定的数据和控制信号。
- 读写事务
5.局部性
1.重复引用同一个变量从的程序有良好的时间局部性;
2.对于步长为k的引用模式的程序,步长越小,空间局部性越好。具有步长为1的引用模式的程序有很好的空间局部性;
3.对于取指令来说,循环有很好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
6.存储器层次结构
-
中心思想:每层存储设备都是下一层的缓存。
-
缓存命中
若需要访问k+1层里的数据块d,如果d已经缓存在第k层,则称缓存命中。
-
缓存不命中
1.若d不在第k层,则是缓存不命中。第k层缓存会从第k+1层缓存中取出包含d的那个块。如果第k层缓存已满,就可能会覆盖现存的一个块。
2.替换策略:1.随机替换策略-随机牺牲一个块。2.最少被使用替换策略LRU-牺牲最后被访问的时间距离现在最远的块。
3.种类
1.强制性不命中(冷不命中)
一个空的缓存称为冷缓存,对任何数据对象的访问都不会命中。通常是短暂事件,不会在反复访问存储器使得缓存暖身之后的稳定状态中出现。
2.冲突不命中
限制性的放置策略——将第k+1层的某个块限制放置在第k层块的一个小的子集中。
3.容量不命中
当工作集的大小超过缓存的大小时,缓存会经历容量不命中,就是说缓存太小了,不能处理这个工作集。
7.高速缓存存储器
- 块、行、组
块:一个固定大小的信息包。
行:存储块以及其他信息的容器。
组:一个或多个行的集合。
-
通用的高速缓存存储器
-
直接映射高速缓存
三步:组选择、行匹配、字选择(如果缓存不命中还需行替换)
第7章
结合以下Linux基础总结
Linux基础
1.VIM
- 普通模式、插入模式和命令行模式切换:
普通→插入: i 或 a
插入→普通: Esc
普通→命令行: :
命令行→普通:Esc
- 帮助系统
普通模式下按F1打开vim自己预设的帮助文档
命令行模式下输入:h shiftwidth 打开名为shiftwidth的帮助文件
2.GCC
预处理:gcc –E hello.c –o hello.i;gcc –E调用cpp
编 译:gcc –S hello.i –o hello.s;gcc –S调用ccl
汇 编:gcc –c hello.s –o hello.o;gcc -c 调用as
链 接:gcc hello.o –o hello ;gcc -o 调用ld
3.GDB
使用GCC编译时要加“-g”参数,然后才能够用gdb调试
- 启动gdb的方法
gdb <program> program也就是执行文件,一般在当前目录下。
gdb <program> core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后,core dump后产生的文件。
gdb <program> <PID> 如果程序是一个服务程序,那么可以指定这个服务程序运行时的进程ID。
- 设置断点
break func 设置断点,在函数func()入口处
info break 查看断点信息。
r 运行程序
n 单条语句执行
c 继续运行程序
p I 打印变量i的值
bt 查看函数堆栈。
finish 退出函数。
q 退出gdb
4.makefile
实现自动化编译
- 格式
target(目标文件)... : prerequisites(要生成那个target所需要的文件或是目标)...
command(任意的Shell命令,就是make需要执行的命令)
- Makefile中的宏
递归展开方式 VAR=var
简单方式 VAR:=var
使用变量 $(VAR)
5.静态库与动态库
- Windows:静态库:.lib;动态库:.dll(windows)
- Linux:静态库:.a;动态库:.so(linux)(重点学习Linux下的)
a.静态库
- 为了创建该库,使用AR工具:
ar rcs libvector.a addvec.o multvec.o
- 为了创建可执行文件,需要编译链接输入文件*.o 和libvector.a:
gcc -O2 -c .c
gcc -static -o p2 .o ./libvector.a
- 加载可执行目标文件
./p
b.动态库
- 创建动态库
gcc -shared -fPIC -o libvector.so addvec.c multvec.c
- 将动态库链接到程序中
gcc -o p2 *.c ./libvector.so
每周检测重复出现(重点)
- man -k
man -k k1 | grep k2 | grep k3
1 Linux中的一般命令
2 系统调用
3 库函数,涵盖了C语言的标准函数库
- cheat
To list the content of /path/to/foo.tgz archive using tar ( tar -jtvf /path/to/foo.tgz )
- find
查找当前目录下所有目录的find命令是(find . -type d)
- grep
查找宏 STDIN_FILENO 的值的命令是(grep -nr XXX /usr/include)
- 形成空调用栈帧
push %ebp movl %esp %ebp
作业例题
总结体会
1.收获与不足:经过两个月的学习,让我对计算机有了进一步的了解,包括汇编的知识,存储器的知识,机器进行计算等方面。收获最大的是如何学习。第一,通过小组答疑论坛大家交流出现的问题,能够发现自己在看书时没有注意的细节,能够学习他人的学习态度。第二,通过自己看书,起初是漫无重点的看,渐渐地学会根据老师给出的重点,有侧重点的学,自己的学习态度也逐渐由开始完成任务变成学知识。第三,通过每周检测和博客评比,增加了认真学习的动力。第四,学的知识只是一条条概念,很多时候不理解,但是结合书上的练习就变得容易了。第五,自学应该是一个个人能力问题,而不仅仅是这门课程的学习方式。不足之处,正如老师说的“欠债”,由于C语言知识的薄弱,让我实践编写代码存在很大的问题,但是前两个月基本没有编程序的项目,我想在日后的学习中应该是一个很大的阻力,现在要努力补充、学习。
2.课程建议:我认为,首先,课堂检测基础知识是比较好的措施,能够检测课前学习的成果如何,同时,可以发现学习中出现的漏洞;其次,老师能够带领我们课堂演示一些指令的用法,能够让我除了实验楼无声的演示之外,有助于理解使用方式;最后,“量”的问题,开学前两周“量”真的很多,知识们在脑海里匆匆而过,大多数只留了个印象,确实变成了完成任务,调整之后,尤其是结合习题学习,让我真的掌握了(汇编这块特别突出,以前学习汇编时欠债,确实读不懂汇编语言,但是现在读懂了),所以我认为知识的学习是慢慢积累的,而不是一口吃个大胖子,最终结果只会消化不良,与此同时,自己主动学习要比被动的逼迫去学习来的有动力。