标签 IOKit 下的文章

自己做了一个 macOS 上的完整版任务管理器

为什么

macOS 上的官方任务管理器,也就是 “活动监视器 (Activity Monitor)”,是

只能监视,不能管理

也就是:只能查看进程,不能结束进程,更不能看进程文件位置

基本上没用

但我又是一个对这方面有大量需求的开发者,刚好我会 iOS 开发,于是我不能自己造一个呢?

怎么做

架构选型

最开始,我的目标很明确:做一个 macOS 版的 Windows 任务管理器 。

为了保证 “原生” 和 “极速”,我果断放弃了 Electron 这种网页套壳方案,选了 SwiftUI 。

但是,监控软件有个特点:数据更新非常快。如果让每个界面自己去拉数据,CPU 肯定受不了,界面也会卡。

所以,我确立了 MVVM + 单向数据流 的架构:

  1. 心脏 (SystemMonitorService.swift) :这是一个单例(Singleton)。它像心脏一样,每隔 2 秒跳动一次(Timer),负责把所有数据采集回来。
  2. 大脑 (AppViewModel.swift) :这是为了解决 “刷新页面数据重置” Bug 引入的。它把数据存住,不管界面怎么切,数据都在那儿。
  3. 脸面 (Views) :界面只负责展示,不负责逻辑。

数据获得

这是项目最难的部分。macOS 的上层 API(像 ProcessInfo )给的数据太浅了,根本不够用。我不得不 “下潜” 到内核层。

  1. CPU 计算
    我们不能直接问系统 “CPU 占用多少”,系统只会告诉你 “这一瞬间” 的状态。
    我们用的是 C 语言的 host_statistics 接口。
  • 逻辑 :现在看一眼 CPU,记录下 User/System/Idle 的时间滴答数(Ticks);过 2 秒再看一眼。
  • 计算 : (第二次的总数 - 第一次的总数) 就是这段时间的总工作量。然后算出百分比。这部分逻辑都在 SystemMonitorService.swift 的 getSystemCpuUsage 方法里。 内存压力
    普通的 “已用内存” 其实没意义。macOS 有个 “内存压缩” 技术。
    我们用了 host_statistics64 ,专门去读 VM_WIRE_COUNT (内核占的)、 VM_ACTIVE_COUNT (App 正在用的)和 VM_COMPRESSOR_PAGES (被压缩的)。
  • 磁盘读写(最硬核的部分)
    这个是很多同类软件做不到的。我没有监控文件系统(那样太慢了),而是直接找 驱动 。
    我们用了 IOKit 框架,去遍历硬件注册表,找到所有类型为 IOBlockStorageDriver 的硬件,直接问它们:“你们一共读写了多少字节?”。这招非常底层,但效率极高。
  • 网络测速
    这个相对标准,我们用了 BSD Socket 的 getifaddrs 。
    难点在于 去重 。电脑里有很多虚拟网卡(比如 lo0 本地回环),如果不剔除,速度会翻倍。我们写了个过滤器,只把真实网卡(WiFi、以太网)的流量加起来。

进程列表

做完监控,接下来就是那个密密麻麻的进程列表了 (ProcessListView.swift)。

这里有个大坑: 权限 。

  • 如果你是普通用户运行,macOS 的 SIP(系统完整性保护)不让你看别人的进程内存。
  • 所以我做了一套 Fallback(回退)机制 :
    • 先试着用高级 API (task_for_pid),如果系统报错说 “没权限”;
    • 我们立马切换到 libproc 库的 proc_pidinfo 。虽然拿不到极度精确的内存细节,但至少能把 CPU、内存占用显示出来,保证不白屏。

还有一个痛点优化: “打开文件位置” 。
以前点击这个,会跳转到 App 里面的二进制文件(比如 Safari.app/Contents/MacOS/Safari )。用户会一脸懵。
我们写了个正则逻辑:如果路径里包含 .app ,就自动截断路径,直接选中那个 App 图标。这就很符合直觉了。

画图

数据有了,得画出来。
在 PerformanceView.swift 里,我们用 SwiftUI 的 Path 画贝塞尔曲线。
为了让波形图平滑,我维护了一个长度为 60 的数组(代表最近 60 次采样),每次新数据进来,就把最老的数据挤出去(FIFO 队列),然后重绘线条。

能做什么

系统级性能监测

CPU

提供基于内核 Ticks 差值计算的实时负载分析,可以显示 CPU 利用率,实时绘制波形图

内存

实现内存压力 (Memory Pressure) 实时评估,精确展示、内存分页状态,内存使用率

磁盘 I/O

基于 IOKit 驱动层的数据采集,提供全系统块设备 的实时读写吞吐量监控。

网络流量

支持多网卡流量聚合 (Interface Aggregation) 及回环过滤,提供精确的上下行速率统计。

高级进程管理

进程结束

进程查看文件位置

总之,Windows 上的主要功能都有(不想写了)

硬件信息

可以查看当前设备的基本硬件信息

彩蛋

连续点击几下设备名称,就会可以进入一个

(自己去看)

的功能

「合法使用」!

如何安装?

只支持 macOS14 + 系统,M2 + 芯片(M1CPUData 算不出来,也不知道为什么)

App 文件:

XH Task Manager.zip

关于开源

这个项目目前还很不成熟,并且设计暴露系统 API,所以目前暂时不开放原代码。


📌 转载信息
转载时间:
2026/1/18 08:42:25