A:基础实现 及调整

This commit is contained in:
jimmy committed 2025-06-07 11:21:41 +08:00
1 parent a6922cea36
commit 04e912a830
6 files changed
+54 -94

No files matched your search

+33 -10
View File
@@ -8,16 +8,14 @@ namespace Infrastructure.GlobalCaches;
/// </summary>
public sealed class ProcessCache
{
private static readonly Lazy<ProcessCache> _instance = new Lazy<ProcessCache>(() => new ProcessCache());
private static readonly Lazy<ProcessCache> _instance = new(() => new ProcessCache());
public static ProcessCache Instance => _instance.Value;
public record ProcessCacheKey(int Pid, DateTime StartTime);
public ProcessCacheKey GetProcessKey(int pid)
public static string GetProcessKey(int pid)
{
var process = Process.GetProcessById(pid);
return new ProcessCacheKey(pid, process.StartTime);
return $"{pid}-{process.StartTime:yyyyMMddHHmmss}";
}
// 私有构造函数,禁止外部创建实例
@@ -26,11 +24,13 @@ public sealed class ProcessCache
// 初始化缓存等操作
}
// 示例缓存字段
private readonly Dictionary<ProcessCacheKey, ProgramInfo> _cache = new Dictionary<ProcessCacheKey, ProgramInfo>();
/// <summary>
/// 缓存字典【给定初始量 1000 ,后期可根据需求调整,避免频繁扩容】
/// </summary>
private readonly Dictionary<string, ProgramInfo> _cache = new(1000);
// 设置缓存
public void Set(ProcessCacheKey key, ProgramInfo value)
public void Set(string key, ProgramInfo value)
{
lock (_cache)
{
@@ -39,7 +39,7 @@ public sealed class ProcessCache
}
// 获取缓存
public ProgramInfo? Get(ProcessCacheKey key)
public ProgramInfo? Get(string key)
{
lock (_cache)
{
@@ -48,7 +48,7 @@ public sealed class ProcessCache
}
// 移除缓存
public void Remove(ProcessCacheKey key)
public void Remove(string key)
{
lock (_cache)
{
@@ -56,3 +56,26 @@ public sealed class ProcessCache
}
}
}
/*
PID 重用问题:
🧠 背景 recap:
操作系统(如 Windows)中的每个连接通常可以获取一个 PID。
但由于:
进程退出后,PID 会被操作系统复用(可能很快)
某些连接(如 TIME_WAIT、CLOSE_WAIT)在进程退出后仍然保留一段时间
因此:不能仅仅根据 PID 匹配连接与进程。
✅ 解决方法:引入 进程启动时间 + 连接时间戳 双重判断
✅ 核心原则:
一个连接只能属于:连接开始时间 ≥ 进程启动时间 的进程
❗反面例子:
如果连接时间是 18:00
但 PID 对应的进程启动时间是 18:10
→ 说明这个进程是后来启动的(PID 被重用了)
→ ❌ 不应该关联这条连接
*/