csapp-7-链接
Chapter 7 链接静态链接
符号解析
重定位
编译器和汇编器生成.text和.data
链接器通过把每个符号定义和一个内存位置关联,对这些节进行重定位;修改引用,让符号指向这个内存位置
可重定位目标文件
.rel.*:不同节的重定位信息
.line:原始C程序和.text节中机器指令的映射,”-g”得到
.bss:未初始化的静态变量,以及初始化为0的全局或静态变量
COMMON:未初始化的全局变量
解析多重定义符号
不允许有多个同名的强符号(定义并初始化)
强弱同在,选强符号
只有弱符号,随便选一个弱符号
重定位
重定位节和符号定义
将相同类型的节合并为同一类型的新的聚合节
每条指令和全局变量有唯一的运行时内存地址
重定位节的符号引用
修改代码节和数据节中的对符号的引用,指向正确的运行时地址
重定位算法// relocation entrytypedef struct { long offset; // 重定位的偏移 long type:32, // 重定位类型 symbol:32; // 符号表索引 long add ...
csapp-8-异常控制流
Chapter 8 异常控制流
8-Coordination
Coordination1 进程切换过程
一个进程出于某种原因想要进入休眠状态,比如说出让 CPU 或者等待数据,它会先获取自己的锁;
之后进程将自己的状态从 RUNNING 设置为 RUNNABLE;
之后进程调用 switch 函数,其实是调用 sched 函数在 sched 函数中再调用的 switch 函数;
switch 函数将当前的线程切换到调度器线程;
调度器线程之前也调用了 switch 函数,现在恢复执行会从自己的 switch 函数返回;
返回之后,调度器线程会释放刚刚出让了 CPU 的进程的锁
// 需要切换的进程acquire(&p->lock);p->state = RUNNABLE;swtch();// 调度器进程swtch();release(&p->lock);
在进程切换的最开始,进程先获取自己的锁,并且直到调用 swtch 函数时也不释放锁。而另一个线程,也就是调度器线程会在进程的线程完全停止使用自己的栈之后,再释放进程的锁。
如果在 swtch()前释放锁,可能有另一个 CPU 核心运行同样的进程;会造成程 ...
5_Database_Storage
5 Buffer Pool
在磁盘中将文件切成一个个页
在内存中开辟一个缓存池;加快对页的访问
5.1 Buffer PoolOrganization
是一个有着固定页数的数组;每个数组元素叫 frame (帧)
通过 page table 去索引内存池中的页
page table 可以 pin 某个页,也可以锁住某个索引
Mete-Data
页表跟踪现在在内存中的页
Dirty flag
Pin/Reference Counter
locks vs latches
locks
保护事务中的内容
在事务期间持有锁
需要回滚
latches
保护临界区数据结构
在操作期间持有锁
不必回滚改变
page dictionary vs. page table
page dic
在磁盘中,标记每个页在那个文件中
page table
在内存中,标记页在 Buffer Pool 的什么位置
5.2 Allocation Policies
全局:同一安排空间
局部:为某个线程分配帧不考虑并发的其他线程
5.3 Buffer Pool Optimiza ...
util lab
Lab1 Util1 sleep2Results== Test sleep, no arguments == $ make qemu-gdbsleep, no arguments: OK (5.1s) == Test sleep, returns == $ make qemu-gdbsleep, returns: OK (0.8s) == Test sleep, makes syscall == $ make qemu-gdbsleep, makes syscall: OK (1.0s) == Test pingpong == $ make qemu-gdbpingpong: OK (1.0s) == Test primes == $ make qemu-gdbprimes: OK (1.1s) == Test find, in current directory == $ make qemu-gdbfind, in current directory: OK (1.0s) == Test find, recursive == $ make qemu-gdbfind, recursiv ...
4_Database_Storage II
4 Database Storage II
数据库负责将非易失性存储中的数据和内存进行交互
4.1 problem with slotted page design
Fragmentation (碎片)
Useless Disk I/O
Random Disk I/O (update 20 tuples on 20 pages)
4.2 Log-structed storage更多使用 KV 数据库上,只有一个键一个值
不存数据,存放数据的操作(insert, delete, update)
直接在后面加上新操作,不检查前面的所有操作是否正确
读取一个记录,从后向前进行扫描记录;找到需要的数据
考虑对相同 id 的 log record 进行索引
因为 Log 数据会非常大,需要周期性对页内进行压缩
Log-Structured Compaction
Level Compaction
将不同的块中记录连接起来,将压缩后的结果存入下一层
从 level0 开始向下读,一直到最后一层
Universal Compaction
尽 ...
7-进程切换
进程切换
P1 进入内核,切换到调度器进程,调度器进程切换到 P2
核心函数为 swtch()函数;该函数保存并加载部分寄存器的值(RISC-V 中存在调用者保存并恢复的寄存器(caller-saved registers),不需要保存全部寄存器)
切换过程
yield 调用了 sched 函数
sched 函数进行合理性检查,最后调用 swtch 函数交换当前进程的上下文和 CPU 调度线程的上下文,返回地址为切换后上下文的 ra 寄存器存的值;实际上是 scheduler 函数
voidsched(void){ int intena; struct proc *p = myproc(); if(!holding(&p->lock)) panic("sched p->lock"); if(mycpu()->noff != 1) panic("sched locks"); if(p->state == RUNNING) panic("sched running ...
csapp-6-存储器层次结构
Chapter 6 存储器层次结构RAM(随机访问存储器)
SRAM:快但贵;作为高速缓存
DRAM:作为主存
分时复用地址线;减少引脚数量,增加访问时间
首先将一整行复制到一个内部行缓冲区;接着再从行缓冲区中复制出一个单元
非易失性存储器
主要是 ROM,但是 ROM 中有的类型实际上既可以读也可以写
固态硬盘
Solid State Disk (SSD),是基于闪存的存储技术
闪存芯片替代传统旋转磁盘中的机械驱动器
闪存翻译层是一个硬件/固件设备,将对逻辑块的请求翻译成对底层物理设备的访问
SSD以页为读写单位
将擦除平均分布到所有的块上
随机写很慢的原因
擦除块需要相对较长的时间
如果需要修改数据,需要把所有带有用数据的页复制到一个新的块上后;重新进行读写
存储器存储结构
cache
在CPU寄存器和主存中插入了一个小的SRAM高速缓存存储器,称为L1 cache;4 clock
在L1 cache和 main memory中插入L2 cache,10 clock
在L2 cache和L3 cache中插入L3 cache,50 clock
...
csapp-5-优化程序性能
Chapter 5 优化程序性能编译器的能力和局限性
内存别名使用:两个指针可能指向同一个内存位置
可能出现这种问题,编译器必须进行检查和处理,这限制了可能的优化
restrict 关键字,可以告知编译器两个指针不能指向同一块内存,编译器可以进行进一步的优化
内联函数替换(inline substitution)
将函数调用替换成函数体;减轻调用的深度
消除循环中的低效率
比如将复杂的函数加入循环;此时考虑设置局部变量
消除循环中的过程调用;考虑返回值来优化
void combine3(vec_ptr v, data_t* dest) { long i; long length = vec_length(v); // 消除过程调用 data_t* data = get_vec_start(v); *dest = IDENT; for(int i = 0; i < length; ++i) { *dest = *dest OP data[i]; }}
上述过程汇编是会发现,每次累积变量的数值都要读入内存再写回内存 ...
1-OS的隔离性
OS 的隔离性
需要不同的应用程序之间有强隔离性
需要 OS 与应用程序间也有强隔离性
OS 隔离保证 multiplexing 和内存隔离
multiplexing(CPU 在多进程同分时复用):不论应用程序在执行什么操作,multiplexing 都会迫使应用程序时不时的释放 CPU,这样其他的应用程序才能运行。
不同应用程序之间的内存是隔离的,应用程序之间不会相互覆盖
硬件支持强隔离
uer/kernel mode
在处理器里面有一个 flag。在处理器的一个 bit,当它为 1 的时候是 user mode,当它为 0 时是 kernel mode。当处理器在解析指令时,如果指令是特殊权限指令,并且该 bit 被设置为 1
virtual memory
处理器包含了 page table,而 page table 将虚拟内存地址与物理内存地址做了对应
每一个进程只能访问出现在自己 page table 中的物理内存
内核:Trusted Computing Base (TCB)
宏内核:所有操作系统服务都在 kernel mode
微内核:将大部分的操作 ...