CACHE & TLB (一)

本文回顾了UNIX内核中的内存管理,强调了线程切换时地址空间的保留如何减少开销。介绍了地址空间分配,包括用户空间和内核空间,并讨论了页映射、Fork和exec的工作机制。接着,文章转向了Cache的基本原理,包括局部性、替换策略、写入策略和不同类型的高速缓存组织方式,最后提到了高速缓存冲洗和区分不同高速缓存结构的依据。

.unix内核简单回顾(内存相关)

               1. 当使用传统的分时调度策略的时候,在用户级执行的进程总会被分到时间片内执行,从而让所有的进程公平的共享CPU,在内核态执行的进程却不会分入时间片内执行,只有当前的内核进程明确允许的情况下,才能切换到内核级执行另一个进程。

               2. 线程的开销比进程小主要体现在线程共享进程的地址空间。linux内核中没有线程的概念,使用的线程库,实现的功能是线程调度在内核进行,线程的管理在用户空间进行。从概念上看,每一个进程地址空间都分为用户地址空间和内核地址空间,linux中作进程切换的时候,如果是线程的切换,由于共用用户地址空间,所以用户空间的3G内存映射是不需要切换的,在内核中有对应的mm_struct对应,从而减少切换开销。

               3. 地址空间的分配,一般是3G用户空间,1G内核空间 , 用户空间由text/data/bss/stack这几个部分组成,分别是程序指令,初始化数据,未初始化数据和堆栈。另外一些类型的段,如共享库和共享存储,都包含在用户地址空间内。共享库包括附加的正文,数据和BSS段,它们用于常用的函数和服务。共享存储在后面说明。

               内核空间包括内核的正文和数据结构,当内核正在执行的时候,它可以访问整个地址空间,这样易于让内核在代表用户进程执行一次系统调用的时候可以在用户进程的地址空间中执行。一个内核进程实际上执行的都是内核的正文中的代码,有固定的映射,切换的时候重装task_struct等结构是必须的。

               可以从下图中有个更加清晰的概念:(这里是2G/2G的设计)

                 

               

               4. 地址空间映射

                    线程切换减少开销主要是因为共享用户地址空间,所以用户空间地址映射的物理地址对应关系可以保存下来,不需要切换,从而减少开销。

                    内核负责将一个进程的虚拟地址空间映射到物理地址空间上,由MMU执行。

                   

                   

                        

             每一个进程都有它自己的映射关系,这种映射关系与内存有关,而且作为进程的现场的一部分保存起来。在进程运行的时候,内核将进程映射关系的描述提供给MMU

           注意,不是所有的虚拟页面都需要映射,例如,上图中的虚拟页面158就没有被映射到任何物理页面上,它们可以表示进程的地址空间中没有使用的页面,也可以是当前没有驻留在内存中的页面,如果一个进程试图返回后一种类型的页面,发生缺页错误之后,内核会将相应的物理页面调入到内存中,并且把虚拟页面映射到新分配的物理页面上。

在计算机体系结构中,**Cache** 和 **TLB(Translation Lookaside Buffer)** 是两种关键的硬件机制,它们共同作用以减少处理器访问内存的延迟,从而提升系统性能。尽管它们的功能和作用不同,但二者之间存在紧密的协作关系。 ### TLB 的作用 TLB 是用于加速虚拟地址到物理地址转换的硬件缓存。现代操作系统使用虚拟内存机制,程序访问的地址是虚拟地址,必须通过页表转换为物理地址。页表通常存储在物理内存中,而访问页表需要多次内存访问,这会显著降低性能。TLB 缓存了最近使用的页表项(PTE),从而避免了频繁访问物理内存中的页表。 当处理器需要将虚拟地址转换为物理地址时,首先在 TLB 中查找。如果命中(TLB Hit),则可以迅速获取物理地址;如果未命中(TLB Miss),则需要访问物理内存中的页表,同时更新 TLB 以备后续使用。 ### Cache 的作用 Cache 是用于缓存主存中数据和指令的小容量、高速存储器。它的存在是为了弥补主存访问速度与 CPU 运算速度之间的差距。Cache 通常分为多级(L1、L2、甚至 L3),其中 L1 Cache 又分为指令 Cache 和数据 Cache。 当处理器访问内存时,首先检查 Cache 是否命中。如果命中,则直接从 Cache 中读取数据;如果未命中,则需要从下Cache 或主存中获取数据并加载到 Cache 中。 ### TLBCache 的关系 TLBCache 在地址转换和数据访问流程中协同工作: 1. **地址转换流程中的协作**:在访问 Cache 之前,必须先完成虚拟地址到物理地址的转换。TLB 的作用就是加速这转换过程。如果 TLB 命中,则可以立即获得物理地址,进而访问 Cache;如果 TLB 未命中,则需要访问页表以获取物理地址,再进行 Cache 访问。 2. **物理 Cache 的访问方式**:大多数现代处理器使用物理 Cache,即 Cache 是通过物理地址进行索引和标记的。这意味着在访问 Cache 之前,必须先通过 TLB 将虚拟地址转换为物理地址。只有在物理地址确定之后,才能进行 Cache 的查找和访问。 3. **性能优化的协同作用**:TLBCache 都依赖于局部性原理(时间局部性和空间局部性)。TLB 缓存最近使用的页表项以减少页表访问次数,而 Cache 缓存最近访问的数据和指令以减少主存访问次数。两者的设计都旨在减少访问延迟,提高系统吞吐量。 4. **多级结构的配合**:现代处理器通常采用多级 TLB 和多级 Cache 结构。例如,L1 Cache 通常与全相联 TLB 配合使用,而 L2 Cache 则可能与组相联 TLB 配合使用。这种分级设计可以在性能和成本之间取得平衡。 5. **缺失处理的联动**:当 TLB 发生缺失时,处理器需要访问页表来获取物理地址。如果页表所在的内存块不在 Cache 中,还会引发 Cache 缺失,从而进步增加访问延迟。这种联动效应在系统设计中需要特别考虑。 ### 示例流程 以下是个典型的地址转换和数据访问流程: 1. 处理器生成个虚拟地址。 2. 使用虚拟地址的页号在 TLB 中查找对应的物理页号。 3. 如果 TLB 命中,则将虚拟地址的偏移量与物理页号组合,形成完整的物理地址。 4. 使用该物理地址访问 Cache,查找所需的数据或指令。 5. 如果 Cache 命中,则直接返回数据;如果 Cache 未命中,则从主存中加载数据到 Cache,并更新 Cache。 6. 如果 TLB 未命中,则访问页表获取物理地址,并更新 TLB。 ### 总结 TLBCache 是现代处理器中不可或缺的两个组件,它们分别负责地址转换和数据缓存,共同作用以减少内存访问延迟。TLB 加速了虚拟地址到物理地址的转换过程,而 Cache 则加速了物理地址对应数据的访问过程。两者的协同工作显著提升了系统的整体性能。 --- ```python # 示例:模拟 TLBCache 协同工作的简单逻辑 def tlb_lookup(virtual_page_number): # 模拟 TLB 查找 tlb = { 0x1000: 0x2000, 0x2000: 0x3000, 0x3000: 0x4000 } return tlb.get(virtual_page_number, None) def cache_lookup(physical_address): # 模拟 Cache 查找 cache = { 0x2000: "Data A", 0x3000: "Data B", 0x4000: "Data C" } return cache.get(physical_address, None) def access_memory(virtual_address): virtual_page_number = virtual_address & 0xFFFF0000 # 假设页大小为 64KB offset = virtual_address & 0x0000FFFF physical_page_number = tlb_lookup(virtual_page_number) if physical_page_number is None: # TLB 未命中,访问页表 print("TLB Miss, accessing page table...") # 假设页表中找到的物理页号为 virtual_page_number + 0x1000 physical_page_number = virtual_page_number + 0x1000 # 更新 TLB tlb[virtual_page_number] = physical_page_number physical_address = physical_page_number | offset data = cache_lookup(physical_address) if data is None: # Cache 未命中,访问主存 print("Cache Miss, accessing main memory...") # 假设主存中找到的数据为 "Data from memory" data = "Data from memory" # 更新 Cache cache[physical_address] = data return data # 测试 result = access_memory(0x10000000) print("Data:", result) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值