Linux命令系列之top——里面藏着很多鲜为人知的宝藏知识( 三 )

  • wa , 这个很好解释 , 等待IO的时间 。
  • hi , 处理硬件中断所消耗的时间 。
  • si , 处理软件中断所消耗的时间
  • st , 这个时间稍微有点复杂 , IBM解释原文为:
  • Steal time is the percentage of time a virtual CPU waits for a real CPU while the hypervisor is servicing another virtual processor.
    这个主要是虚拟机的虚拟CPU等待真实物理CPU的时间 , 可以大致认为是Ready状态到Running状态的等待时间 , 如果这个值越大说明虚拟机运行状态越不好 , 因为它等待真实CPU的时间很长 。
    第四行这一行表示的是物理内存的信息 , 单位是KiB 。
    • total, 表示一共有多少内存 , 也就是物理内存大小 。
    • free, 表示还有多少物理内存没有使用 。
    • used, 表示使用了多少物理内存 。
    • buff/cache, 表示用于用于缓存的物理内存的大小 。
    第五行这一行主要表示的是对换区的数据 , 所谓对换区就是当操作系统发现内存满了之后 , 操作系统会选择部分不常使用的页面将它放到磁盘当中当需要使用的时候再将这部分数据从磁盘当中读取出来 。
    • total, 表示对换区的总大小 。
    • free, 表示对换区当中还有多少空间没有使用 。
    • used, 表示对换区当中有多少空间被使用了 。
    • 最后一项 avail Mem 是一个可用于启动新程序的内存大小的估计值 。
    表头内容含义
    • PID , 表示进程号 , 就是每个进程的ID 。
    • USER , 就是用户的名称 。
    • PR , 优先级值 。
    • NI , nice值 , 通过程序给进程设置的 。
    • VIRT , 进程使用的虚拟内存的大小 , 单位是KiB 。
    • RES , 常驻内存的内存大小 , 单位是KiB 。
    • SHR , 共享内存的大小 , 单位是KiB 。
    • S , 表示进程的状态 , 有一下几个状态 。
      • D , 不能够中断的睡眠状态 。
      • R , 表示程序正在CPU上执行 。
      • S , 表示进程正在睡眠 。
      • T , 进程被信号停止执行 。
      • t , 表示进程正在被调试器追踪 , 调试器将这个进程停了下来 。
      • Z , zombie表示是一个僵尸进程 。
    • %CPU , 上次一刷新之前对应的进程对CPU的占有率 , 这个值是可以突破100%的 , 因为一个进程可以有多个进程 , 比如下面这样 , 我们开启10个线程进行死循环:
    #include <pthread.h>void* func(void * args) {while (1){/* code */}}int main() {#define num_threads 10pthread_t t[num_threads];for(int i = 0; i < num_threads; i++) {pthread_create(&t[i], NULL, func, NULL);}for (size_t i = 0; i < num_threads; i++){pthread_join(t[i], NULL);}return 0;}执行上面的程序之后 , top的输出结果如下所示:
    Linux命令系列之top——里面藏着很多鲜为人知的宝藏知识

    文章插图
    从上面的这个结果我们可以知道CPU的占有率是可以超过%100的 , 这个值的计算主要是在刷新之间内一个进程消耗的CPU时间和在这段时间内一个CPU能够产生的CPU时间的比值 。