Lecture 35: VM Performance, I/O

Virtual Memory Performance

比较缓存(Cache)和虚拟内存(VM)

缓存(Cache)和虚拟内存(VM)都是现代计算机系统中用于加速数据访问的关键技术,但它们在工作方式和设计目标上有显著差异。

Cache 版本

  • 块或行:在缓存中,数据被组织为块或行。这些块通常由多个字节组成,是CPU从主存中读取或写入数据的基本单位。

  • 未命中:当CPU请求的数据不在缓存中时,会发生未命中(Cache Miss),这意味着系统必须从较慢的内存层次(如主存)中检索数据,增加访问延迟。

  • 块大小:缓存块的大小通常为32至64字节。这种大小的选择是为了在空间和速度之间取得平衡,减少访问延迟的同时保持较高的命中率。

  • 放置策略:缓存使用多种策略来决定数据块在缓存中的位置。常见的放置策略包括:
    • 直接映射(Direct Mapped):每个内存块只能映射到缓存中的一个特定位置。
    • N路组相联(N-way Set Associative):每个内存块可以映射到缓存中的多个位置,但有限制。
    • 完全相联(Fully Associative):内存块可以映射到缓存中的任何位置,提供最大的灵活性,但实现复杂。
  • 替换策略:当缓存满时,需要选择一个块替换。常用的替换策略包括:
    • 最近最少使用(LRU):替换最久未使用的块。
    • 随机替换(Random):随机选择一个块进行替换。
  • 写入策略:缓存的写入策略决定了何时将修改后的数据写回主存:
    • 直写(Write Through):每次写操作都会同步更新主存,保证主存数据的一致性。
    • 回写(Write Back):写操作只更新缓存,当缓存块被替换时才写回主存,提高了效率。

虚拟内存版本

  • :虚拟内存将数据划分为页,每个页通常为4KiB到8KiB,是操作系统管理内存的基本单位。

  • 页面错误(Page Fault):当程序访问的页面不在物理内存中时,会发生页面错误(Page Fault),操作系统必须将所需页面从磁盘加载到内存,这个过程极大地增加了访问时间。

  • 页大小:虚拟内存中的页面通常比缓存块大得多,常见的页面大小为4KiB到8KiB,这样的设计有助于减少页面错误的发生频率。

  • 完全相联(Fully Associative):虚拟内存中的页表通常是完全相联的,这意味着每个虚拟页都可以映射到物理内存中的任何位置,提供最大的灵活性。

  • 替换策略:常见的页替换策略包括:
    • 最近最少使用(LRU):替换最久未使用的页面。
    • 先进先出(FIFO):替换最早加载到内存的页面。
    • 随机替换(Random):随机选择一个页面进行替换。
  • 写入策略:虚拟内存通常采用回写(Write Back)策略,当一个页面被修改且需要被替换时,才将其写回到磁盘。

虚拟内存性能(VM Performance)

虚拟内存位于主存以下的内存层次中,它的性能对于整体系统的运行至关重要。不同于缓存,虚拟内存引入了磁盘访问这一极慢的层次,导致了更为复杂的性能问题。

  • TLB的作用:TLB(Translation Lookaside Buffer)是用于加速地址转换的小型高速缓存,在虚拟内存系统中非常重要。它在内存访问之前进行工作,显著影响内存访问速度,尤其是在需要从磁盘加载数据的场景中。

  • 内存层次的变化:在引入虚拟内存后,主存(DRAM)不再是最低层级,而成为了类似缓存的角色,而磁盘则作为最低层的存储。

  • 性能衡量:在计算平均内存访问时间(AMAT)时,虚拟内存引入的磁盘访问延迟成为了一个关键因素,使得优化主存的命中率变得至关重要。

典型性能统计(Typical Performance Stats)

image-20240814114552701

缓存 (Caching)

  • 缓存项 (Cache Entry):指缓存中存储的数据块,通常为32-64字节。

  • 缓存未命中率 (Cache Miss Rate):缓存未命中率通常在1%到20%之间。未命中时需要访问较慢的主存,导致显著的性能损失。

  • 缓存命中 (Cache Hit):缓存命中意味着数据已经在缓存中,可以在1个时钟周期内快速访问。

  • 缓存未命中 (Cache Miss):未命中时,数据必须从主存加载,通常需要约100个时钟周期。

需求分页 (Demand Paging)

  • 页面帧 (Page Frame):在虚拟内存系统中,页面是分配给物理内存的单位。

  • 页面未命中率 (Page Miss Rate):页面未命中率通常非常低,小于0.001%,但未命中时需要从磁盘加载页面,代价非常高。

  • 页面命中 (Page Hit):页面命中意味着数据已经在主存中,可以在约100个时钟周期内访问。

  • 页面未命中 (Page Miss):页面未命中意味着必须从磁盘加载数据,通常需要约500万(5M)个时钟周期,这会极大地降低系统性能。

为了保证高效的系统性能,缓存和虚拟内存的命中率至关重要,尤其是在虚拟内存中,磁盘访问的高延迟使得高命中率成为系统设计的关键目标。

分页对AMAT的影响

分页机制对平均内存访问时间(AMAT)的影响是显著的,尤其是在未命中情况下涉及磁盘访问时,延迟会急剧增加。

内存参数设定

  • L1 缓存:命中时间为1个时钟周期,命中率为95%。
  • L2 缓存:命中时间为10个时钟周期,命中率为L1未命中的60%。
  • DRAM:命中时间为200个时钟周期(约100纳秒)。
  • 磁盘:命中时间为20,000,000个时钟周期(约10毫秒)。

无分页情况下的AMAT计算

在不涉及分页的情况下,AMAT的计算公式为:

\[ \text{AMAT}_{\text{no}} = 1 + 5\% \times 10 + 5\% \times 40\% \times 200 = 5.5 \text{ 时钟周期} \]

这个结果表示,在无分页机制下,内存访问的平均时间为5.5个时钟周期。

有分页情况下的AMAT计算

在有分页机制的情况下,必须考虑磁盘访问所带来的高延迟。假设磁盘的命中时间为20,000,000个时钟周期,则AMAT公式扩展为:

\[ AMAT_{dp} = 5.5 + (5\% \times 40\% \times (200 + (1 - HR_{mem}) \times 20,000,000)) \]

这里,\( HR_{\text{mem}} \) 是主存(DRAM)的命中率。

不同主存命中率对AMAT的影响

  1. 当 \( HR_{\text{mem}} = 99\% \) 时: \[ \text{AMAT} = 5.5 + 0.02 \times 0.01 \times 20,000,000 = 4005.5 \text{ 时钟周期} \]
    • 这种情况下,AMAT从5.5时钟周期增加到4005.5时钟周期,性能大幅下降,约慢了728倍。系统每次页面访问中有1%的几率触发磁盘访问,严重影响程序的执行时间。
  2. 当 \( HR_{\text{mem}} = 99.9\% \) 时: \[ \text{AMAT} = 5.5 + 0.02 \times 0.001 \times 20,000,000 = 405.5 \text{ 时钟周期} \]
    • 尽管性能有所改善,但AMAT依然显著增加。磁盘访问的低概率已减少,但足以对系统性能造成影响。
  3. 当 \( HR_{\text{mem}} = 99.9999\% \) 时: \[ \text{AMAT} = 5.5 + 0.02 \times 0.000001 \times 20,000,000 = 5.9 \text{ 时钟周期} \]
    • 这是一个理想的情况,显示主存的极高命中率将AMAT保持在接近无分页情况下的水平(5.9时钟周期),对性能的影响微乎其微。

上述计算展示了在分页机制下,主存命中率对AMAT的极大影响。为了确保系统的高效运行,必须尽可能提高主存的命中率,特别是当未命中导致高代价的磁盘访问时,主存的命中率需要接近100%,才能将性能损失降到最低。

I/O Devices

添加I/O设备

在计算机系统中,I/O设备通过输入/输出接口与外部世界进行交互。操作系统和硬件必须有效管理这些设备,确保数据能在系统内部和外部之间流畅传输。

image-20240814124727653

硬件与程序的关系

  • 低级硬件访问:通过RISC-V汇编语言(如addi x1, x0, 3),程序可以直接与硬件交互,这通常用于底层设备控制。
  • 高级编程接口:C语言提供了更高级别的接口,允许程序员通过函数调用(如int findMin(int arr[], int n))来操作数据,这些函数最终会通过系统调用与硬件交互。

I/O设备的连接

  • I/O接口:I/O设备通过各种接口(如PCI、USB、SATA)连接到系统总线,从而与内存和CPU进行通信。操作系统通过命令寄存器和数据寄存器管理设备的操作。
  • 设备交互:程序通过I/O接口与设备交互,例如从键盘读取输入数据、将图像发送到显示器、或通过网络接口发送数据包。

如何与设备交互

image-20240814124757100

  • I/O接口需求:每种类型的I/O设备都需要一个适当的接口,使其能够有效连接到系统并响应程序请求。
  • 设备控制:操作系统通过专用命令控制设备操作,并将其抽象为程序可以调用的接口。
  • 用户交互:用户程序通过操作系统提供的I/O接口与设备进行交互,实现数据输入输出、设备控制等功能。

总结来说,I/O设备的集成和管理是现代计算机系统的一部分,系统必须有效协调硬件与软件之间的交互,以实现稳定高效的运行。

指令集架构与I/O(Instruction Set Architecture for I/O)

在计算机系统中,处理器需要与各种输入/输出(I/O)设备进行交互,以实现数据的读取和写入操作。处理器如何进行I/O操作以及这些操作的接口选项是理解系统设计的关键。

处理器如何进行I/O操作?

处理器通过特定的操作完成与I/O设备的交互:

  • 输入:从I/O设备读取一系列字节的数据。
  • 输出:向I/O设备写入一系列字节的数据。

I/O操作的接口选项

  1. 专用的输入/输出指令与硬件
    • 处理器使用专门设计的I/O指令来处理数据的读写操作。这些指令直接与I/O设备的控制硬件交互。
    • 这种方法通常需要额外的硬件支持和特定的指令集设计,增加了系统的复杂性。
  2. 内存映射I/O(Memory Mapped I/O)
    • 这是更常见的一种方法,特别是在现代计算机体系结构(如RISC-V)中。
    • 内存映射I/O将部分物理地址空间专门用于与I/O设备的交互。这些地址并不对应实际的物理内存,而是映射到I/O设备的寄存器。
    • 处理器通过常规的加载(lw)和存储(sw)指令与I/O设备通信,而不需要特殊的I/O指令。这种方式简化了处理器的设计,并利用了现有的内存访问机制。

内存映射I/O(Memory Mapped I/O)

内存映射I/O是指将I/O设备的寄存器映射到处理器的物理地址空间中。这样,处理器可以通过访问这些特殊的内存地址来与I/O设备通信。

image-20240814125519746

  • 地址空间划分
    • 在内存映射I/O中,一部分地址空间专门用于I/O设备的控制和数据寄存器,而不是用于常规的数据存储。例如,0x000000000x7FFFFFFF的地址空间可以映射为I/O设备,而程序和数据的内存则位于0x80000000及以上的地址空间。
    • 这种方式使得访问I/O设备变得与访问内存数据几乎没有区别,统一了处理器对内存和I/O的操作。

处理器与I/O速度不匹配(Processor-I/O Speed Mismatch)

处理器的速度远远高于大多数I/O设备,这种速度不匹配对系统设计提出了挑战。

处理器的I/O吞吐量

  • 例如,一个1 GHz的微处理器在使用加载/存储指令时,能够达到4 GiB/s的吞吐量。相比之下,I/O设备的吞吐量通常要低得多。

典型I/O设备的数据速率

  • 键盘:约10 B/s,非常低的数据速率,适用于人类交互的速度。
  • 蓝牙3.0:约3 MiB/s,适用于无线数据传输,但远低于处理器的吞吐量。
  • USB 2.0/3.1:范围在0.06-1.25 GiB/s之间,取决于具体的标准和设备。
  • WiFi:根据标准的不同,速度在7-250 MiB/s之间波动。
  • 千兆以太网:约125 MiB/s,通常用于网络数据传输。
  • SATA3硬盘:约480 MiB/s,适用于存储设备的接口。
  • 高端DDR4 DRAM:约32 GiB/s,用于内存的高速数据传输。
  • HBM2 DRAM:约64 GiB/s,适用于高性能计算和图形处理的内存。

速度不匹配的影响

  • 设计挑战:由于I/O设备的数据速率远低于处理器的吞吐量,设计系统时需要特别考虑如何有效管理这种不匹配。常见的方法包括使用缓存、缓冲区和中断机制,以确保处理器和I/O设备之间能够顺利进行数据传输,而不会导致处理器长时间等待。

总结来说,内存映射I/O通过简化I/O操作,统一了处理器的内存和I/O访问模式,而处理器与I/O设备之间的速度不匹配则需要通过系统设计上的优化来解决。理解这些概念有助于设计高效、平衡的计算机系统。

I/O Polling

轮询:处理器检查状态然后执行操作

在计算机系统中,处理器通过轮询机制与I/O设备进行交互。轮询是一种主动检查设备状态的方式,处理器不断读取设备的控制寄存器,直到设备准备好进行数据传输。

设备寄存器的两个主要功能:

  1. 控制寄存器(Control Register):用于指示I/O设备是否已经准备好进行读/写操作。可以将其类比为一个信号指示器,控制数据的流动。
  2. 数据寄存器(Data Register):存放实际的输入/输出数据。

处理器的轮询操作过程:

  • 处理器循环读取控制寄存器,检查其中的“准备就绪”位是否从0变为1。
  • 一旦“准备就绪”位被设置为1,表明设备已准备好,处理器便可以从数据寄存器中读取数据(输入)或写入数据(输出)。
  • 数据传输完成后,设备会将“准备就绪”位重置为0。
  • 这个过程称为轮询(Polling)

I/O 轮询示例

以下是一个使用RISC-V汇编语言的示例,展示了如何通过轮询机制与键盘和显示器进行交互:

image-20240814130501400

输入操作:从键盘读取数据

  1. lui t0, 0x7ffff: 加载键盘控制寄存器的高位地址到寄存器t0中。
  2. lw t1, 0(t0): 从控制寄存器读取值到t1中。
  3. andi t1, t1, 0x1: 检查“准备就绪”位是否为1。
  4. beq t1, zero, Waitloop: 如果“准备就绪”位为0,继续等待。
  5. lw a0, 4(t0): 当设备准备好后,从数据寄存器读取数据到a0

输出操作:将数据写入显示器

  1. lui t0, 0x7ffff: 加载显示器控制寄存器的高位地址到寄存器t0中。
  2. lw t1, 8(t0): 从控制寄存器读取值到t1中。
  3. andi t1, t1, 0x1: 检查“准备就绪”位是否为1。
  4. beq t1, zero, Waitloop: 如果“准备就绪”位为0,继续等待。
  5. sw a1, 12(t0): 当设备准备好后,将数据从a1写入数据寄存器。

在这个示例中,处理器通过不断检查控制寄存器中的“准备就绪”位来决定何时进行数据传输。虽然轮询方式实现简单,但会占用大量的CPU时间,尤其当设备准备时间较长时。这也是为什么轮询在实际应用中通常被更高效的中断机制所替代的原因。

轮询的成本

轮询机制虽然简单,但会占用处理器的计算资源。以下是对轮询操作成本的分析,以及它在处理器总时间中所占的百分比。

假设条件:

  • 处理器时钟频率为1 GHz。
  • 每次轮询操作需要400个时钟周期。

计算问题:

  • 处理器用于轮询的时间占总时间的百分比是多少?

轮询鼠标占用的处理器时间百分比

在此,我们假设系统每秒轮询鼠标30次,以确保捕捉所有鼠标动作。

计算步骤:

  1. 每秒钟的轮询时钟周期数
    • 每秒轮询次数 = 30 [次/秒]
    • 每次轮询需要的时钟周期数 = 400 [时钟周期/次]
    • 总时钟周期数 = 30 [次/秒] × 400 [时钟周期/次] = 12K [时钟周期/秒]
  2. 处理器用于轮询的时间百分比
    • 百分比 = 12K [时钟周期/秒] / 1G [时钟周期/秒] = 0.0012%

结论:

轮询鼠标对处理器时间的占用非常小,仅为0.0012%,几乎可以忽略不计。但在处理更多I/O设备或高频操作时,轮询的成本会明显增加,因此通常会使用中断或DMA(直接内存访问)等机制来减轻处理器的负担。

轮询硬盘占用的处理器时间百分比

在这部分内容中,我们分析了硬盘轮询对处理器时间的消耗,以便更好地理解轮询在高数据速率设备中的影响。

假设条件:

  • 硬盘传输速率:16 MB/s
  • 每次轮询读取的数据量:16字节
  • 需要的轮询次数:1M 次/秒(即每秒需要轮询100万次)
    • 16 [MB/s] / 16 [B/poll] = 1M [polls/s]

计算步骤:

  1. 每秒钟的轮询时钟数
    • 轮询次数:1M 次/秒
    • 每次轮询需要的时钟周期数:400 时钟周期/次
    • 总时钟周期数:1M 次/秒 × 400 时钟周期/次 = 400M 时钟周期/秒
  2. 处理器用于轮询的时间百分比
    • 百分比:400M 时钟周期/秒 / 1G 时钟周期/秒 = 40%

结论:

轮询硬盘会占用处理器40%的时间,这是不可接受的。轮询不仅消耗了大量处理器资源,而且因为每次轮询读取的数据量很小,这种方式的效率极低。因此,轮询在高数据速率的设备中表现尤为低效,实际应用中往往采用更高效的中断驱动机制来替代轮询。

I/O Interrupts

轮询的替代方案:中断

在理解了轮询的缺点之后,我们引入了中断机制作为替代方案,以提高I/O操作的效率。

轮询的缺点:

  • 资源浪费:轮询机制会不断占用处理器资源,即使设备还没有准备好。这种等待方式就像站在门口等客人到来,既低效又浪费时间。

中断的引入:

  • 中断机制:中断机制通过在I/O设备准备好时主动通知处理器,从而避免了无谓的等待。当设备准备好数据或需要处理时,中断会打断当前程序的执行,并将控制权转移到操作系统中的中断处理程序。

中断的影响:

  • 无I/O活动时:当没有I/O活动时,中断不会发生,因此处理器资源不会被浪费。
  • 频繁I/O活动时:在有大量I/O活动的情况下,频繁的中断可能导致缓存和虚拟内存的抖动,同时需要保存和恢复处理器状态,带来一定的性能开销。

轮询、中断和DMA

根据数据速率的不同,处理器需要选择合适的I/O处理策略。以下是针对不同数据速率的设备,推荐的I/O处理方式:

低数据速率设备(例如鼠标、键盘):

  • 使用中断:对于这些低速率设备,中断机制是最为高效的选择。尽管可以通过定时器中断来轮询设备状态,但中断的开销通常较低,适合处理不频繁的数据传输。

高数据速率设备(例如网络、硬盘):

  • 初始中断检测:在数据传输的初始阶段,可以使用中断来检测数据到达的情况。这种方式能迅速响应设备请求。
  • 切换到DMA(直接内存访问):一旦数据传输开始,建议切换到DMA模式。DMA允许设备直接与内存进行数据传输,减少CPU的介入,显著提高传输效率和系统性能。

总结来说,轮询适合处理器简单而稀疏的I/O任务,而对于高频繁、高数据量的I/O任务,结合中断和DMA的使用是更为合理和高效的选择。这种策略不仅能减轻CPU负担,还能确保系统在处理各种I/O操作时的响应速度和效率。

程序化I/O(Programmed I/O)

程序化I/O的工作原理

程序化I/O(Programmed I/O)是一种传统的I/O数据传输方法,在这种方法中,CPU直接参与并控制数据的传输过程。这种方式常见于早期计算机系统,尤其是ATA硬盘驱动器的标准I/O操作。

  • 数据传输过程
    • CPU负责执行加载(Load)和存储(Store)指令,将数据从I/O设备(如硬盘)传输到主存储器(DRAM)。
    • 在这个过程中,CPU不仅负责数据传输,还同时进行数据处理。例如,将从设备获取的数据加载到内存中,并利用这些数据执行计算任务。

程序化I/O的局限性

尽管程序化I/O在某些场景下可以工作得很好,但它存在以下局限性:

  • CPU资源浪费
    • CPU必须参与所有数据传输操作,这意味着处理器资源被浪费在低效的传输任务上,而本可以用于执行更为复杂和有价值的计算任务。
  • 速度不匹配
    • 设备的传输速度通常远低于CPU的处理速度,这种不匹配导致CPU在等待设备完成数据传输时处于空闲状态,降低了系统整体效率。
  • 高能耗
    • 程序化I/O使用通用处理器来执行这些简单的传输任务,而事实上,简单的硬件电路就足以完成这些工作。因此,这种方式不仅低效,还导致了不必要的高能耗。

现实中的影响

在现代计算机系统中,程序化I/O的局限性变得更加明显。例如,在谷歌的服务器中,有高达5%的CPU周期被浪费在memcpy()memmove()等内存操作上。这说明了程序化I/O在大规模计算中的实际性能开销。CPU大量参与内存操作,影响了系统的整体性能,特别是在处理大数据量时。

Direct Memory Access (DMA)

直接内存访问(DMA)

DMA 的作用

为了克服程序化I/O的局限性,直接内存访问(DMA)技术被引入。DMA允许I/O设备直接与主存储器进行数据交换,而无需CPU的直接干预,从而显著提高了数据传输效率。

  • 核心优势
    • DMA通过让设备直接与内存交互,减少了CPU的负担,使得CPU可以专注于其他更重要的计算任务。
    • 特别是在处理大块数据时,DMA的效率优势更加明显,能够极大地提高系统的整体性能。

DMA引擎及其工作机制

为了支持DMA操作,系统中引入了一个称为DMA引擎的专用硬件组件。这个引擎负责管理和控制DMA操作,确保数据能够正确无误地传输到指定的内存位置。

  • DMA 引擎的关键寄存器
    1. 存储器地址寄存器:指定数据在主存储器中的放置地址。
    2. 字节数寄存器:定义要传输的数据的总字节数。
    3. I/O设备编号和传输方向寄存器:指明哪个I/O设备参与传输,以及数据的传输方向(读或写)。
    4. 传输单元寄存器:设置每次突发传输的数据单位和数量。

DMA操作流程

image-20240814134329909

DMA操作通过以下步骤完成:

  1. CPU配置DMA控制器
    • CPU首先通过设置DMA控制器的寄存器来配置传输参数(包括内存地址、字节数、I/O设备编号和传输方向等)。
  2. DMA请求数据传输
    • DMA控制器根据配置的参数向相关I/O设备(例如磁盘控制器)发出数据传输请求。
  3. 数据直接传输
    • 数据从I/O设备直接传输到主存储器,而不经过CPU。这一过程极大地提高了传输效率。
  4. 传输完成确认
    • 数据传输完成后,I/O设备会向DMA控制器发送确认信号,表明传输已经成功完成。
  5. 中断通知CPU
    • 最后,DMA控制器通过中断机制通知CPU,表示数据传输已经完成,CPU可以继续执行其他任务。

通过引入DMA技术,系统能够显著减少CPU在数据传输中的参与,使得处理器资源得以更有效地利用。DMA技术特别适合大规模数据传输任务,如磁盘到内存的数据加载、网络数据包的处理等场景。在这些场景中,DMA不仅提高了数据传输的速度,还减少了系统的能耗,从而优化了整体性能。

DMA:处理传入数据的流程

在处理从外部设备传入的数据时,DMA(直接内存访问)可以极大地减少CPU的负担,以下是这一流程的详细解释:

  1. 设备发送中断信号
    • 当外部设备准备好传输数据时,它会向CPU发送一个中断信号。这一信号通知CPU设备已经准备好,可以开始数据传输。
  2. CPU响应中断并启动数据传输
    • CPU接收到中断信号后,会指示DMA引擎或设备将数据传输到指定的内存地址。此时,CPU只负责启动这一过程,而不参与实际的数据传输,解放了CPU的资源。
  3. DMA引擎或设备处理数据传输
    • 一旦DMA启动,设备或DMA引擎负责处理数据的实际传输。此时,CPU可以继续处理其他任务,不需要管理传输的细节。
  4. 传输完成后发送中断信号
    • 当数据传输完成后,设备或DMA引擎会再次向CPU发送中断信号,通知传输已经结束。CPU收到信号后,可以进行后续的处理,如数据校验或处理。

DMA:处理传出数据的流程

处理从内存向外部设备传输数据时,DMA同样能够高效地管理数据移动,以下是详细步骤:

  1. CPU确认设备准备就绪
    • 当需要将数据从内存传输到外部设备时,CPU首先确认该设备已经准备好接收数据。这一步通常通过查询设备状态寄存器完成。
  2. CPU启动传输
    • 在设备准备就绪后,CPU指示DMA引擎或设备开始传输。它将内存中要传输的数据地址传递给DMA引擎,然后DMA引擎控制传输过程。
  3. DMA引擎或设备处理数据传输
    • 传输过程由DMA引擎或设备负责,而CPU在此期间可以继续处理其他任务,无需等待传输完成。
  4. 传输完成后发送中断信号
    • 数据传输完成后,设备或DMA引擎会再次向CPU发送中断信号,告知传输已完成。CPU收到通知后,可以继续后续的操作,例如处理已传输的数据或启动新任务。

DMA 引擎插入内存层次结构的位置

在讨论DMA引擎插入内存层次结构的位置时,涉及到数据一致性管理和性能优化的问题。不同的插入点会对系统的整体效率和复杂性产生不同的影响。

1. 插入在 L1 缓存和 CPU 之间

  • 优点
    • 数据一致性自动管理:DMA引擎直接将数据写入L1缓存,确保数据在缓存和CPU之间的一致性问题可以自动解决,减少开发和调试的复杂性。
    • 低延迟:这种配置可以减少数据传输延迟,因为数据直接进入最靠近CPU的缓存层。
  • 缺点
    • 工作集干扰:传入的数据可能会替换掉L1缓存中已有的数据,破坏CPU的工作集(working set),导致频繁的缓存未命中(cache miss),从而降低系统性能。

2. 插入在最后一级缓存和主内存之间

  • 优点
    • 避免干扰CPU缓存:数据直接进入主内存,而不经过L1或L2缓存,这样可以防止DMA操作干扰CPU的缓存工作集,保持缓存的高效使用。
    • 高效的数据传输:适用于大规模数据传输,因为它避免了缓存频繁更新的开销。
  • 缺点
    • 需要显式管理数据一致性:由于数据直接写入主内存,系统必须额外处理缓存一致性问题(例如,通过缓存失效或刷新操作),这增加了编程复杂度和系统开销。

结论

选择将DMA引擎插入在哪一级缓存之间,取决于系统的设计目标和具体应用场景。如果系统需要低延迟且能自动处理数据一致性问题,选择将DMA引擎插入L1缓存和CPU之间可能更合适。然而,对于大规模数据传输或要求尽量减少对CPU缓存干扰的情况,将DMA引擎插入最后一级缓存和主内存之间可能是更好的选择。


Networking

网络:与外界对话

最初:在计算机之间共享I/O设备

  • 最初,网络的一个主要目的是在多台计算机之间共享输入/输出设备,例如打印机。这种共享可以提高资源的利用率,减少成本。

其次:计算机之间的通信

  • 随着技术的发展,网络开始用于在计算机之间进行数据通信,例如文件传输协议(FTP),它允许用户在不同的计算机之间传输文件。

接着:人与人之间的通信

  • 随着互联网的发展,网络开始支持人与人之间的通信,最常见的形式就是电子邮件(E-mail)。电子邮件使得全球各地的人们可以方便地进行交流。

最后:网络之间的通信

  • 进一步发展,网络不仅仅用于计算机之间或人与人之间的通信,还用于整个网络之间的通信。例如,文件共享服务(如P2P网络)、万维网(WWW)等技术的出现,使得信息的共享和访问更加广泛和便捷。

互联网(1962年)

历史背景:

  • 1963年,JCR Licklider在美国国防部的ARPA(高级研究计划局)工作时,撰写了一篇备忘录,描述了将斯坦福、伯克利、UCLA等多个研究大学的计算机连接起来的愿景。
  • 1969年,ARPA在UCLA、SRI(斯坦福研究所)、犹他大学和UCSB(加州大学圣巴巴拉分校)部署了4个“节点”,这标志着互联网雏形的诞生。
  • 1973年,罗伯特·卡恩和文特·瑟夫发明了传输控制协议(TCP),这成为了现代互联网协议套件的一部分。

互联网的增长速度:

  • 自互联网诞生以来,用户和使用量的增长速度呈指数级增长,显示了其广泛的影响和普及。

万维网(1989年)

系统介绍:

  • 万维网(World Wide Web, WWW)是一个基于互联网的超文本系统,它允许用户通过超链接在全球范围内访问互联的文档。

历史背景:

  • 1945年,Vannevar Bush提出了一个称为“Memex”的超文本系统的概念,这是万维网的早期思想雏形。
  • 1989年,蒂姆·伯纳斯-李(Tim Berners-Lee)提出并实现了第一个超文本传输协议(HTTP)客户端和服务器之间的成功通信,这标志着万维网的诞生。
  • 大约在2000年,“互联网泡沫”时期,大量的创业者涌入互联网领域,但在2001年泡沫破裂。

现状:

  • 今天,万维网使得我们能够随时随地访问和共享信息,它已经成为我们日常生活中不可或缺的一部分。

软件协议:发送和接收数据的流程

在网络通信中,操作系统负责管理数据的发送和接收过程。以下是软件协议下的发送和接收数据的详细步骤和关键点:

软件发送数据的步骤(SW发送步骤):

  1. 数据复制到操作系统缓冲区
    • 应用程序首先将待发送的数据复制到操作系统的缓冲区。这一操作确保数据在发送过程中不会受到其他程序的干扰。
  2. 计算校验和并启动计时器
    • 操作系统计算数据的校验和,以确保数据在传输过程中未被篡改或损坏。校验和是一种验证数据完整性的重要手段。
    • 同时,操作系统启动一个计时器,以防止网络传输失败后无限期等待。计时器超时会触发重传机制。
  3. 数据发送到网络接口硬件
    • 经过校验和验证后,数据被发送到网络接口卡(NIC)。操作系统指示网络接口硬件开始传输数据到目标地址。这一过程可能通过直接内存访问(DMA)完成,以提高传输效率。

软件接收数据的步骤(SW接收步骤):

  1. 数据从网络接口硬件复制到操作系统缓冲区
    • 当数据包到达时,网络接口硬件将数据复制到操作系统的缓冲区中,等待进一步处理。
  2. 校验和验证并处理确认
    • 操作系统再次计算接收到的数据的校验和,并将其与发送方提供的校验和进行比较。如果校验和匹配,数据包被确认是完整和正确的。
    • 如果校验和正确,操作系统发送ACK确认给发送方;否则,丢弃错误的消息,并等待发送方重传数据。
  3. 数据复制到用户地址空间
    • 校验和验证通过后,数据从操作系统缓冲区复制到应用程序的用户地址空间。操作系统随后通知应用程序数据已准备就绪,可以继续处理。

深入理解:

  • 校验和的作用:校验和不仅用于验证数据的完整性,还帮助识别传输中的错误。当校验和不匹配时,数据包会被丢弃,避免了损坏数据的传播。
  • 计时器与重传机制:计时器在网络通信中至关重要,它帮助操作系统检测潜在的传输失败,并自动触发重传,确保数据能够正确传输。

网络接口卡(NIC)的作用

传统需求:网络接口卡(NIC)

网络接口卡(NIC)是计算机与网络之间的桥梁,负责处理数据的物理传输。

  • 有线或无线网络连接
    • NIC可以支持有线(例如以太网)或无线(例如Wi-Fi)连接,允许计算机加入不同类型的网络环境。
  • 数据传输方法
    • 传统上,数据传输可以通过编程的I/O(Programmed I/O)方式进行,这种方式较为低效,因为CPU需要不断轮询设备状态。
    • 现代系统通常使用DMA(直接内存访问)方式进行数据传输,显著减少了CPU的负担,提高了数据传输的效率。

深入理解:

  • NIC的重要性:网络接口卡的性能直接影响计算机的网络通信能力。高速的NIC可以显著提高数据传输速度,降低延迟,提升整体网络性能。

结论

通过以上内容,我们可以总结出计算机系统的一些核心要点:

  • 理解计算机和操作系统的工作原理
    • 通过学习,我们深入了解了计算机硬件如何与操作系统交互,并处理不同任务,包括虚拟内存管理、I/O设备通信等。
  • 虚拟内存系统的构建
    • 我们学习了虚拟内存如何管理物理内存和存储设备,并如何通过翻译后备缓冲(TLB)等机制提升系统性能。
  • I/O设备与外围设备的连接
    • 理解了I/O设备与外围设备的连接方式及其重要性,这为系统的扩展性和设备间的有效通信奠定了基础。

深入理解:

  • 系统的扩展性:通过有效管理和连接I/O设备,计算机系统能够灵活扩展,适应不同的应用场景和需求。
  • 虚拟内存与物理内存的关系:虚拟内存的存在不仅提高了内存利用率,还提供了更好的数据保护和隔离机制。

© 2024 LzzsSite
该笔记由 LzzsG 基于 CS 61C / Garcia, Yan 的作品创作,采用的是 CC BY-NC-SA 许可。