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; } } }