面试题答案
一键面试设计思路
- 确定监控范围:明确要监控进程的哪些状态信息(如运行、暂停、终止),以及资源使用情况(如 CPU 使用率、内存占用、磁盘 I/O、网络 I/O 等)。
- 数据收集方式:考虑定期收集数据还是基于事件驱动收集数据,以平衡性能与及时性。
可能用到的数据结构
- 进程信息结构体:
- 用于存储单个进程的详细信息,例如进程 ID(PID)、进程名、状态(运行、等待、睡眠等)、CPU 使用率、内存使用量等。
struct ProcessInfo { int pid; char processName[256]; char status[16]; float cpuUsage; long memoryUsage; // 其他资源使用字段 };
- 进程列表:
- 可以使用链表(如双向链表)或数组来存储系统中所有被监控进程的 ProcessInfo 结构体。链表适合动态添加和删除进程信息,数组适合快速索引。例如,使用双向链表:
struct ProcessNode { struct ProcessInfo data; struct ProcessNode *prev; struct ProcessNode *next; };
- 时间相关数据结构:
- 用于记录进程资源使用情况的时间戳,以便计算使用率等指标。如使用系统时间函数获取当前时间。
算法
- CPU 使用率计算:
- 记录进程在两个不同时间点的 CPU 时间(user time + system time),以及系统总的 CPU 时间。
- CPU 使用率 = (进程 CPU 时间变化量 / 系统 CPU 时间变化量)× 100%
- 内存使用率计算:
- 获取进程当前占用的内存量,与系统总内存量对比计算使用率。
与操作系统内核交互获取信息
- Linux 系统:
- /proc 文件系统:内核将进程相关信息以文件形式存储在 /proc 目录下,每个进程对应一个以其 PID 命名的子目录。例如,/proc/[pid]/stat 文件包含进程状态、CPU 时间等信息,/proc/[pid]/status 文件包含进程状态、内存使用等信息。通过读取这些文件获取进程信息。
- sysfs 文件系统:用于获取系统设备和驱动相关信息,可获取硬件资源使用情况,辅助进程资源监控。
- 系统调用:如
getrusage
系统调用可以获取进程资源使用情况,ptrace
可用于跟踪进程状态。
- Windows 系统:
- Windows Management Instrumentation (WMI):提供了一个统一的接口来访问系统信息,包括进程信息。可以使用 WMI API 来查询进程的各种属性,如进程状态、CPU 使用、内存使用等。
- Kernel32 函数:例如
CreateToolhelp32Snapshot
函数可以创建系统快照,获取进程列表及相关信息;GetProcessTimes
函数可获取进程的 CPU 时间等。