A:基础实现 及调整
This commit is contained in:
1 parent
a6922cea36
commit
04e912a830
6 files changed
+54
-94
No files matched your search
@@ -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 被重用了)
|
||||
→ ❌ 不应该关联这条连接
|
||||
|
||||
*/
|
||||
Reference in new issue
Block a user