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