Step 6 - 统计模块

This commit is contained in:
2026-04-14 09:11:55 +08:00
parent 61e0034800
commit 785e92ec8b
6 changed files with 256 additions and 8 deletions
@@ -0,0 +1,77 @@
using System;
namespace VMdemo.Simulation
{
public class StatsCollector
{
public int TotalAccess { get; private set; }
public int TlbHit { get; private set; }
public int PageTableHit { get; private set; }
public int PageFault { get; private set; }
public long TotalCost { get; private set; }
public double TlbHitRate => TotalAccess > 0 ? (double)TlbHit / TotalAccess : 0.0;
public double PageTableHitRate => TotalAccess > 0 ? (double)PageTableHit / TotalAccess : 0.0;
public double AvgCost => TotalAccess > 0 ? (double)TotalCost / TotalAccess : 0.0;
public void Reset()
{
TotalAccess = 0;
TlbHit = 0;
PageTableHit = 0;
PageFault = 0;
TotalCost = 0L;
}
public int CalculateCost(bool tlbHit, bool pageTableHit, bool pageFault, int pageFaultPenalty)
{
if (pageFaultPenalty <= 0)
{
throw new ArgumentOutOfRangeException(nameof(pageFaultPenalty), "pageFaultPenalty 必须是正整数。");
}
if (tlbHit)
{
return 1;
}
if (pageFault)
{
return 4 + pageFaultPenalty;
}
if (pageTableHit)
{
return 4;
}
throw new InvalidOperationException("访问结果无效:TLB miss 时必须是页表命中或缺页之一。");
}
public void RecordAccess(bool tlbHit, bool pageTableHit, bool pageFault, int cost)
{
if (cost < 0)
{
throw new ArgumentOutOfRangeException(nameof(cost), "cost 不能为负数。");
}
TotalAccess++;
if (tlbHit)
{
TlbHit++;
}
if (pageTableHit)
{
PageTableHit++;
}
if (pageFault)
{
PageFault++;
}
TotalCost += cost;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5fc1bac53447fa34db019e4b6ed2d26c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -75,6 +75,7 @@ namespace VMdemo.Simulation
_derivedConfig = derived;
_seed = seed;
State = new SimulationState();
Stats = new StatsCollector();
AddressTranslatorUtils.GetPageTableBitLayout(derived.VpnBits, out var l1Bits, out var l2Bits);
L1Bits = l1Bits;
@@ -97,6 +98,7 @@ namespace VMdemo.Simulation
public TlbCache TlbCache => _tlbCache;
public TwoLevelPageTable PageTable => _pageTable;
public PhysicalMemoryManager PhysicalMemoryManager => _physicalMemoryManager;
public StatsCollector Stats { get; }
public EvictionInfo LastEviction => _lastEviction;
public void Reset()
@@ -105,6 +107,7 @@ namespace VMdemo.Simulation
_lastEviction = EvictionInfo.None;
_hasPendingForcedVirtualAddress = false;
_pendingForcedVirtualAddress = 0UL;
Stats.Reset();
_addressGenerator = new AddressGenerator(_config.vaBits, _seed);
_tlbCache = new TlbCache(_config.tlbEntries);
@@ -278,6 +281,17 @@ namespace VMdemo.Simulation
private void ExecuteFinalize()
{
State.CurrentCost = Stats.CalculateCost(
State.IsTlbHit,
State.IsPageTableHit,
State.IsPageFault,
_config.pageFaultPenalty);
Stats.RecordAccess(
State.IsTlbHit,
State.IsPageTableHit,
State.IsPageFault,
State.CurrentCost);
State.CurrentRound += 1;
State.CurrentStep = TranslationStep.GenerateVA;
}