Archived
Step 6 - 统计模块
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user