信息的处理和表示
- 表示:把位组合在一起,再加上某种解释
- 存储:机器将存储器视为一个非常大的字节数组,成为虚拟存储器,所有可能地址的集合称为虚拟地址空间.
汇编
GCC -S -O1
会产生机器汇编码xxx.s
windows
的数据对齐是任何K字节基本对象的地址必须是K的倍数,linux
的惯例是8字节数据在4字节上面对齐- 对抗缓冲区溢出攻击
- 栈随机化,ASLR
- 栈破坏检测,随机产生canary,函数回调时候检查
处理器体系结构
- 取指-译码-执行-访存-写存-更新PC
- 处理器重来不需要为了完成一条指令的执行去读由该指令更新的状态
- 冒险包括寄存器(程序,程序计数,条件码,状态)和存储器
优化程序性能
x = 1000; y = 3000;
*q = y;
*p = x;
t = *q; /*1000 or 3000*/
- 乱序处理,投机执行
- linux提供GPROF进行程序剖析,计算每个函数用多少时间,gcc -pg调用
- Amdahl定律, 优化部分对于系统整体的提升等于(1-a)+a/k
存储器层次结构
- 高速缓存(1-30),主存(30-200),硬盘(千万)
- 计算机程序的局部性
- DRAM设计成2维数组的原因是减少地址引脚,但是需要分两步发送数据
- 固态硬盘是一种基于闪存的存储技术
- 组相连高速缓存:每组对应多行.
链接
- 符号解析,重定位.
- 强符号只允许有一个,如果一个模块内为初始化,会选择另一个模块内的强符号
- 共享库为.so文件,引用代码动态链接.
- ELF编译系统延迟绑定,将过程地址的绑定推迟到第一次调用过程,GOT表和PLT过程链接表
异常控制流
- 应用程序通过一个叫做陷阱或者系统调用的ECF形式,向操作系统请求服务
- 异常分为四类:终端,陷阱,故障和终止:
类别 | 描述 |
---|---|
中断 | 异步发生,处理IO设备信号的结果 |
陷阱 | 有意的异常,同步 |
故障 | 潜在可恢复的错误 |
终止 | 不可恢复的错误 |
3. 模式位区分用户模式和内核模式
4. /proc文件系统允许用户模式进程访问内核模式
5. 中断程序污染cache
6. 进程控制:Unix提供大量进程API
7. fork:1.返回两次2.并发执行3.相同但独立的地址空间
8. 子进程终止但未被父进程回收称之为僵死进程
9. 程序是一堆代码和数据,进程是程序的一个具体实例
10. 通过给父子进程随机一个加入一个delay来得到系统调度规律
11. -strace打印进程轨迹,ps列出当前系统进程,top打印关于当前进程资源使用信息,pmap进程存储器映射
虚拟存储器
- 将主存看成一个存储在磁盘上的地址空间高速缓存
- 为每个进程提供一致的虚拟空间
保护每个进程虚拟地址空间不受破坏
- CPU通过一个虚拟地址访问主存,MMU(存储管理器单元)进行翻译
- VM系统将虚拟存储器分割为虚拟页,物理存储器分配为物理页
- 页表条目(PTE)组成页表,由一个有效为和n位地址字段组成
- 磁盘和存储器之间传送页的活动称为swapping或者paging,工作集大小过大会产生thrashing
- 地址翻译:N,M,P
- TLB:翻译后备缓冲器,MMU中关于PTE的小缓存
- 多级页表:只有第一级需要存储在主存中
- 分配器:显式or gc
- 约束:处理任意请求序列,立即响应请求,只使用堆,对齐,不修改已分配
- 目标:最大化吞吐量,最大化存储器利用率
- 内部碎片:已分配块》载荷,外部碎片:多次增删产生
- 隐式空闲链表:时间换空间利用率
- 首次适配/下次适配/最佳适配
- 边界标记:利用脚部在常熟时间进行对前面块的合并
- 利用栈(LIFO)或者地址提高利用率
IO
- UNIX IO:打开文件,改变当前文件位置,读写文件
网络编程
- 客户端和服务器是进程,而不是机器
并发编程
- 三种并发程序方式:进程(通过IPC控制),I/O多路复用,线程
- 进度图:将N个并发进程执行模型化为一条n维笛卡尔空间中的轨迹
- 线程安全:(不)不保护共享变量,保持跨用多个调用状态(static),返回静态变量指针