当前位置: 首页 > Linux

Linux命令系列顶楼——里面藏着很多鲜为人知的宝藏

时间:2023-04-06 22:39:48 Linux

Linux命令系列顶楼——里面藏着很多鲜为人知的宝藏指令,提供一个动态实时的借口帮助我们查看系统执行过程中的进程、线程、系统参数等信??息。top命令输出结果详解首先我们看top命令的输出结果:下面一一分析一下这几个字段的含义:第一行12:53:04表示当前时间,也就是当前真正的时间时间。up157days13:35,表示系统启动到现在的时间。上图显示系统在157天13小时35分钟前启动。5users表示当前使用本机的用户数。loadaverage:0.00,0.00,0.00,这个值代表系统在过去1分钟、5分钟、15分钟的系统负载。现在的问题是我们在这里谈论的系统负载是什么。所谓系统负载,我们以一分钟为例,我们定义每分钟一个CPU时间为t,这一分钟内消耗的CPU总时间为c,那么这一分钟内的负载为$\frac{c}{t}$,需要注意的是消耗的CPU时间c可以大于t,因为一个程序可能使用多个CPU(并发程序,或者多个进程可能同时使用不同的CPU)。比如上图中1分钟内的负载大约是10,那么系统中各个程序在过去一分钟内消耗的CPU时间就是$c=10.04\timest$。他的意思是,在过去的1分钟内,CPU时间的消耗可以看作是10个CPU满负荷运行。注:这里可以看成10个CPU满负荷运行。事实上,真实情况可以是过去一分钟有20个CPU在进行计算,那么每个CPU的计算时间为$\frac{1}{2}t$,或者其他等价的CPU消耗。第二行第二行主要表示任务在当前系统中的相关情况。所谓任务就是当前系统中有多少个进程。652totoal,这意味着当前系统中有652个进程。1runnung,表示有进程正在执行。651sleeping,表示651进程处于休眠状态,即不需要使用CPU的状态。0stopped,表示有0个进程处于stopped状态。此状态是已停止的进程。例如,如果你通过ctrl+z停止一个进程,你可以向进程发送一个信号SIGCONT来恢复进程的执行。Linux进程的状态转换如下:0zombie,意思是僵尸进程的个数,这里是0zombieprocess,所谓僵尸进程就是已经执行完毕的进程,对于C程序,可以这样理解当你的main函数执行完毕(这个不够准确,其实main函数执行完之后还会有其他的函数需要执行,不过这里可以大致理解),如果此时(的函数执行完成),本进程的父进程不接受子进程发给他的信号(子进程执行完成后会发信号给父进程,需要父进程接受这个信号通过wait等系统调用),那么子进程就处于僵尸状态,处于这个状态的进程需要父进程接受自己发送的信号,这样子进程的系统资源就可以回收了,然后子进程将完全死亡。现在让我们花点时间谈谈Linux中的进程状态。就绪,进程创建时,处于就绪状态。这个状态的进程只缺CPU,也就是说只需要被操作系统调度获取CPU就可以执行了。Running,当进程从Ready状态获得CPU的执行权时,进程处于Running状态,即进程正在执行。查到,这个状态主要是一个进程处于调试状态,这个状态需要被调试进程向被调试进程发送信号,进程才能继续执行。Zombie,当进程执行完成时,在父进程接受子进程发送的信号之前,进程处于这种状态。Suspended,这个状态表示进程被挂起。当进程请求IO时,需要阻塞等待IO请求完成。此时的进程状态为Suspended状态。第三行这一行主要是统计各种时间的百分比。这条数据的统计时间间隔是从本次刷新到上次刷新。实际上,这个区间统计的数据是,运行时没有指定优先级的用户进程消耗的CPU时间百分比。默认情况下,终端执行的程序没有指定优先级。我们可以使用nice命令来改变程序执行的优先级:sudonice-n-10./time。sy,运行内核进程所花费的CPU时间百分比。ni,run指定修改后的优先级后用户进程占用CPU时间的百分比。这里我们可以结合PR和NI这两个领域进行分析。现在我们执行sudonice-n10./a.out命令。在./a.out中,我启动了10个无限循环线程。我们来看看Top输出结果:从上面的结果来看,我们可以通过nice命令修改进程的优先级,但是最主要的是一个进程的PR值越大,优先级越低,越大ni值,越低的优先级,也就是上面说的我们其实把进程执行的优先级降低了,但是我们可以看到ni的值发生了变化,这也印证了我们讲的改变ni值的进程关于以上。看一下不设置优先级直接执行sudo./a.out的结果:但是在实验测试的时候发现了一个奇怪的问题,但是我们提高了进程的优先级(提高优先级需要管理员权限)当ni的值没有变化时,那么上面说的ni的变化应该只适用于普通用户的进程(因为降低优先级不需要管理员权限)。id,空闲进程执行占用的CPU时间百分比。当系统中没有足够的进程供CPU执行时,就会将空闲的进程调度给CPU执行。这个空闲进程是为了让操作系统能够很好地执行。如果设置,空闲进程主要执行HLT指令。这条指令主要是为了节省CPU能量,不需要CPU满负荷运行,因为此时没有具体的进程要执行。百分比越大,系统负载越轻,CPU不忙。哇,这很好解释,等待IO的时间。嗨,处理硬件中断所花费的时间。si,处理软件中断所消耗的时间st,这个时间有点复杂,IBM对原文的解释为:Stealtime是虚拟CPU在hypervisor为另一个虚拟处理器服务时等待真实CPU的时间百分比。这主要是虚拟机的虚拟CPU等待真实物理CPU的时间,大致可以看成是从Ready态到Running态的等待时间。如果该值较大,则虚拟机运行状态较差,因为它等待真正的CPU时间很长。第四行这行代表物理内存的信息,单位是KiB。total,表示总共有多少内存,即物理内存大小。free,表示有多少物理内存没有被使用。used,指示使用了多少物理内存。buff/cache,表示用于缓存的物理内存大小。第五行这一行主要表示swap区的数据。所谓交换区,就是当操作系统发现内存满了的时候,操作系统会选择一些不经常使用的页面放到磁盘上,以备需要时再次使用。从磁盘中读取这部分数据。total,表示交换区的总大小。free,指示交换区中还有多少空间未使用。used,指示交换区中使用了多少空间。最后一项availMem是对可用于启动新程序的内存量的估计。header的内容是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个线程无限循环:#includevoid*func(void*args){while(1){/*code*/}}intmain(){#definenum_threads10pthread_t[num_threads];for(inti=0;i