cache,mesi
mmu:虚拟地址到物理地址的映射,一般是cpu的一部分。
tlb:缓存热页的物理页号和访问权限,一般集成在mmu中。
现场切换(context switch):需要保存cpu寄存器的内容,pc(程序计数器),堆栈指针,条件码,虚拟地址空间的映射关系。
线程切换:虚拟地址映射关系不需要切换,其他的和现场切换一样。
sbrk和brk:分配或者回收bss段空间。
mmap:在bss和堆栈之间的空间分配。
cache line:地址+标志有效位+修改位+数据。
cache索引:使用hash table实现,匹配索引还需要比较行的地址。
写入策略:写直通(要写到主存)和写回。
指令和数据分开:
dmb dsb isb
dmb:数据存储屏障,屏障前的存储操作完成后才能提交后面的存储指令,一般用在dma中
dsb:数据同步屏障,屏障前的访问和存储操作都完成才开始执行后面的指令,大部分场景都用这个等级的屏障
isb:指令同步屏障,屏障前的指令已经冲刷流水线和预取后才会预取后面的指令,上下文切换用到,因为上下文切换后的指令需要切换后才知道,无法提前预取。
barrier:编译屏障,生成的指令避免乱序,单核cpu下这个屏障指令就够用了,汇编实现asm volatile(“” : : : “memory”);有个volatile前缀
mb/rmb/wmb:多核cpu,每个核存在自己的cache,这个就需要用到dsb级别的屏障指令
映射策略
1.直接映射(单路组相联):
哈希算法硬件实现,一般直接取模,速度快。相同索引地址被认为有相同颜色。一段程序如果有多个引用地址容易发生高速缓存颠簸。
2.双路组相联
减少缓存颠簸。索引命中有可能需要比较两次地址。需要加一个标志位MRU表示最近使用的行。
3.n路组相联
伪随机替换每组两行以上的lru替换。
4.全相联
每行就是一路,只有一组。不需要索引,但是需要搜素所有行比较地址。TLB中会使用。
虚拟高速缓存
1.使用虚拟地址来索引和标记数据。优点是不用转换成物理地址。问题是多进程虚拟地址可能相同,需要避免手段。
2.虚拟地址标记多进程问题避免1:操作系统需要避免别名现象,就需要在发生切换的时候冲刷高速缓存,降低性能。
3.虚拟地址标记多进程问题避免2:使用标记字段扩充进程键。
4.tlb也带有标志键来区分不同进程。
5.存在的缺点:不能共享高速缓存中的共享数据。
带有物理标记的虚拟高速缓存
优点是消除几乎所有情况下的歧义问题,冲刷少,并且不需要额外的进程键。缺点是每次都需要经过mmu地址转换。
物理高速缓存
如果使用总线监视机制,不需要冲洗高速缓存。缺点是每次访问都需要mmu转换。可以通过和虚拟缓存组成的多级缓存来缓解(L1使用虚拟缓存,L2使用物理缓存)。
smp,numa,超线程
smp有独立L1 cache和L2 cache,共享L3 cache和主存。
numa有独立L1 cache和L2 cache,共享L3 cache,主存分成多块,每个cpu一块,每个cpu优先读写自己那块,需要时也可以访问其他块。
超线程共享L1cache。
注意:L1cache分为指令cache和数据cache,L2以后就不分了
mesi
sram dram/sdram/ddr
sram:性能好,功耗高,价格高,容量小,拥有cache
dram/sdram/ddr:用于主存
PCI/PCIE
磁盘,ssd,san,nas,nfs,分布式存储ceph
NAS(Network Attached Storage)
SAN(Storage Area Network)
ceph
提供块存储,文件存储,对象存储