-
异常控制流(Exceptional Contrl Flow, ECF)
-
概念:
- ECF: 现代系统通过使控制流发生突变,用来响应处理器状态中的某些变化。
-
异常的类别:
-
中断
- 异步发生,来自外部IO设备。、
-
系统调用
- 用户程序调用内核接口。
-
故障
- 缺页异常。
-
终止
-
-
进程
-
抽象 = 独立CPU + 独立内存。
-
用户态、内核态。 切换到内核态一般就是中断、系统调用咯。
-
上下文切换
-
主要切换: CPU相关 + 内存相关 + 进程相关。
- CPU相关 = 寄存器
- 内存相关 = 页表
- 进程相关 = 进程表
-
系统调用、中断都可能引发上下文切换
-
-
-
信号
- 通知进程发生了某种类型的事件
- 多个相同类型的信号,接收进程收到相同类型会丢弃。
-
-
虚报内存
-
对内存的一种抽象。 为每个进程提供一致的地址空间。 这个图看看书,很经典。
-
页表:
- 记录了当前进程内,虚拟地址->物理地址的映射。
- 减少内存占用, 压缩页面的思想,使用多级页表。
-
页命中=访问物理地址,如果数据存在于内存中,即为页命中。如果数据不在内存中,则为缺页。
-
分配页面
- malloc操作=在硬盘上创建相应空间 + 更新页面, 真实访问时再触发缺页异常,加载到内存。
-
内存映射
- 将内存和磁盘对象关联起来。 普通文件(mmap) 或者 匿名文件(shmget).
- 多个进程可以共享同一片内存。
- 多个进程如果数据要做到独立,可以将区域标记为私有对象, 有修改时再使用"写时复制"的技术。
-
fork
- 创建出子进程。
- 复制CPU相关信息(寄存器) + 内存信息(页表) + 进程信息(进程表)
- 使用内存映射共享同一片数据, 并且将区域标记为私有对象。
-
动态内存分配
-
分离适配。GLIBC使用这种内存分配方式
- 维护空闲链表数组, 每个链表的字节固定。
- 分配的时候, 找到合适的链表, 分配。 如果找不到,找到更大的链表来拆分。
- 释放时,可以考虑合并。
- 内存不足时, brk从系统申请, 加装到链表里。
-
伙伴系统。 是分离适配的一种特例。 每个链表的长度都是2的n次方。
-
待完善
- 这个内存分配是一大难点。 需要实践学习。
- Glibc malloc针对小块内存分配会有内存碎片问题, tcmalloc则不会。 这里需要细细学习。
-
-