进程控制块PCB
Linux中,PCB(进程控制块)是 task_struct,包含:
-
pid
-
*mm:内存描述符
-
*fs:文件系统信息, *pwd, *root
-
*files:打开的文件信息,打开的fd数组
-
*signal:信号,信号处理函数
pid的数量是有限的
-
task_struct管理:保证不同场景速度
-
形成链表
-
形成树
-
形成hash:pid -> task_struct
-
进程生命周期
- 就绪:fork出来的进程是就绪状态。
- 深度睡眠:
- 不可中断,收到信号不唤醒和不可运行,进程必须等待直到有中断发生。
- 必须等到资源ready了才能醒。在一个进程处于深度睡眠的时候 不会相应任何信号**,kill -9也杀不死**。
- 为什么要搞深度睡眠呢?举例:有个代码段再硬盘中,还没有在内存中,想要执行这个代码段,会收到一个page fault,如果此时进程还是浅度睡眠 就会反复page fault。因为信号处理函数还是属于代码段也可能不在内存中,还是可能发生信号的代码段未命中的情况。
- 浅度睡眠:
- 中断,休眠中,受阻,在等待某个条件的形成或接收到信号。
- 资源来了我会醒,信号来了我也会醒。信号:signal,linux中signal有这些。信号就是针对进程的一个异步打断机制。kill -l。
- 执行:占有cpu。
- 暂停:进程收到SiGSTOP,SIGSTP,SIGTOU信号后停止运行。
- 僵尸:进程已终止,但进程描述还在,直到父进程调用wait4()系统调用后释放。
僵尸进程
-
僵尸进程进程停止时候 task-srtuct还没有及时清理的进程。
-
僵尸进程一般发生有父子关系的进程中,一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过调用 wait4() 获取了子进程死亡信息后才会释放。如果子进程退出,而父进程并没有调用 wait4(),那么子进程的进程描述符仍然保存在系统中,此时这个进程就是僵尸状态
-
解决:此时杀死父进程,父进程转变为init。init发现子进程是僵尸,自动回收。
-
目的:这个状态是为了让父进程还是可以检索到子进程的信息,确定没有用了再去回收
-
资源已经释放,没有内存泄漏问题。
wait()系统调用:阻塞当前调用进程,等待直到任意一个子进程终止。
内存泄露
不是:进程死了,内存没释放
而是:进程或者,运行越久,耗费内存越多
检测:连续多个时间点,检测内存耗费。
fork
-
通过
fork()
函数创建一个子进程,父进程的task_struck对拷给子进程,,包括文件描述符、内存地址空间、程序计数器、执行的代码等。父子进程最初资源完全一样,但是两份不同拷贝,因此任何改动都造成二者的分裂。(如chroot,open,mmap…) -
PID:
根据返回值来区分是父进程还是子进程,如果返回值是 0,则是子进程;如果返回值是其他的整数,就是父进程。fork作为一个函数被调用。这个函数会有两次返回,将子进程的PID返回给父进程,0返回给子进程。(如果pid为负数,则说明创建子进程失败)。
PID表示的进程号,是唯一的,一个PID只标识一个进程,子进程的PID=父进程的PID+1。
getpid:
top
进程视角,top -H
线程视角 -
COW:出于效率考虑,Linux 操作系统中使用 COW(Copy On Write)写时复制机制,fork 子进程一般情况下与父进程共同使用一段物理内存,复制页表,只有在进程空间中的内存发生修改时,内存空间才会复制一份出来。
-
在fork之前,一片内存区对应一份物理地址和一份虚拟地址,内存区的权限的RW;
-
在fork之后,父子进程看到的内存区虚拟地址相同,物理地址也相同,父子进程使用的其实是同一片物理内存,未发生内存拷贝,操作系统会将此内存区权限改为RO(read only);
-
父或子进程对内存区执行写操作将触发Page Fault(因为ro权限,cpu会收到pagefault缺页中断),操作系统此时会将内存区拷贝一份,父子进程看到的虚拟地址仍然一样,但是物理地址已经不则(内存权限改为RW)。各进程虚拟地址到物理地址的映射由MMU(Memory Management Unit, 内存管理单元)管理。
-
父子进程谁先写,谁就得到新的物理地址,原来地址让出去。
对于文件资源,fork之后的父子进程共享文件,fork之后的父进程与子进程的文件描述符表指向相同的文件表,引用计数增加,共享文件偏移指针。
-
-
fork出的子进程如何让其不继承父进程的文件描述符:使用
clone
系统调用使用参数在复制时将父进程资源有选择地复制给子进程。创建进程的系统调用:fork、vfork、clone。
系统调用fork()和vfork()是无参数的,fork()是全部复制。
而clone()则带有参数,clone()可以将父进程资源有选择地复制给子进程,而没有复制的数据结构则通过指针的复制让子进程共享,具体要复制哪些资源给子进程,由参数列表中的clone_flags来决定。clone()返回的是子进程的pid。
Linux调用pthread_create -> clone创建线程,本质是调用clone,将指针指向资源而不是复制资源写时分裂,CLONE_VM,CLONE_FS,CLONE_FILES,CLONE_SIGHAND,CLONE_THREAD.
-
文件描述符:FD,是一个从0开始递增的无符号整,用来关联Linux中得一个文件。在Linux中,一切皆文件,例如常规的文件、视频、硬件设备、包括网络套接字(Socket)。
-
**vfork:**fork运行在有MMU的CPU上。对于无MMU的CPU,无法应用COW,无法支持fork。 无MMU的CPU使用vfork创建进程,父进程将一直阻塞直到子进程exit或exec。 vfork和fork的本质区别是,vfork中的父子进程共用同一片内存区。
exit :终止进程。当编译器完成了所给定程序的编译之后,编译期执行 exit 系统调用,通知操作系统 它的工作已经完成
缺页异常
-
Linux 内核给每个进程都提供了一个独立的虚拟地址空间,虚拟地址空间的内部又被分为内核空间和用户空间两部分,只有那些实际使用的虚拟内存才分配物理内存。
-
缺页异常:为了完成内存映射,内核为每个进程都维护了一张页表,记录虚拟地址与物理地址的映射关系。页表实际上存储在 CPU 的内存管理单元 MMU 中。而当进程访问的虚拟地址在页表中查不到时,MMU将会通知CPU产生了一个缺页异常。
-
处理:当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常( soft page fault),进入系统内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行。
major page fault 也称为 hard page fault, 指需要访问的内存不在虚拟地址空间,也不在物理内存中,需要从慢速设备载入。从swap 回到物理内存也是 hard page fault。
minor page fault 也称为 soft page fault, 指需要访问的内存不在虚拟地址空间,但是在物理内存中,只需要MMU建立物理内存和虚拟地址空间的映射关系即可。
孤儿进程(托孤)
一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。
- 孤儿进程将被 init 进程 (进程 ID 为 1 的进程) 所收养,并由 init 进程对它们完成状态收集工作。因为孤儿进程会被 init 进程收养,所以孤儿进程不会对系统造成危害。
- 孤儿进程找到最近的subreaper(收割机)托孤。
第一个进程
0号进程是Linux启动的第一个进程,当系统中所有进程启动之后,0号进程退化为idle进程,当一个core上没有任务运行时就会调度运行idle进程,core进入低功耗模式。idle进程调度优先级最低。
init进程:它是内核启动的第一个用户级进程
Linux进程和线程
-
**Linux进程:**p2的复制p1的资源,写时分裂。
-
**Linux线程:**p2的指针指向p1的资源。本质上就是进程,只是线程间共享所有资源。 每个线程都有自己的task_struct,因为每个线程可被CPU调度。多线程间又共享同一进程资源。
Linux调用pthread_create -> clone创建线程,本质是调用clone,将指针指向资源而不是复制资源写时分裂,CLONE_VM,CLONE_FS,CLONE_FILES,CLONE_SIGHAND,CLONE_THREAD.
Linux用进程实现了线程,所以线程又称为轻量级进程。
Linux进程调度和线程调度
进程调度:
线程调度:
- 用户级线程:内核不知道线程的存在,还是选择进程进行调度,分配时间片。由于操作系统不参与用户线程的调度,所以该线程运行不会被打断。如果该线程用完了进程的时间片,内核就会选择另一个进程运行。
- 内核级线程:内核选择特定线程运行,不用考虑它属于哪个进程。分配时间片给线程,到期后挂起。
Linux中的调度:
-
进程调度:
-
每个 CPU 核都有一个运行队列。为了支持不同的调度需求,运行队列是由实时调度器、完全公平调度器等多种调度器组成。Linux调度器实际是识别task_struct进行调度。
-
实时调度器:优先级是最主要考虑的因素。高优先级的进程可以抢占低优先级进程 CPU 资源来运行。同优先级FIFO或者RR轮转。
-
完全公平调取器(CFS):CFS 调度器的核心思想是强调让每个进程尽量公平地分配到 CPU 时间即可,而不是实时抢占。
-
它引入了一个虚拟时间的概念。一旦进程运行虚拟时间就会增加。尽量让虚拟时间最小的进程运行,谁小了就要多运行,谁大了就要少获得 CPU。最后尽量保证所有进程的虚拟时间相等,动态地达到公平分配 CPU 的目的。
Vruntime = Pruntime / weight * 1024,权重由nice值确定,nice 0=1024, nice 10=110
每次调度的进程:nice小的,实际运行时间pruntime小的。
综合考虑了cpu/IO和nice
-
实现:使用红黑树来管理任务。红黑树把进程按虚拟运行时间从小到大排序。越靠树的左侧,进程的运行虚拟时间越小。越靠树的右侧,进程的运行虚拟时间就越大。这样每当想挑选可运行进程时,直接从树的最左侧选择节点就可以了。
-
考虑性能:进程上下文切换会导致额外的 CPU 浪费。Linux 会保证选择到的进程一个最短的运行时间。
-
考虑权重:优先照顾IO密集型。不采用固定时间片,而是采用比例,这个比例取决于nice value。这个权重就是 Linux 进程的 nice 值,也就是我们平时 top 命令结果中看到的 ni 这一列。nice 范围为 -20(最高权重)到 19(最低权重)。nice value越小,权重越高,得到调度的机会越多。
-
-
-
第一,是进程在 fork 的时候会选择自己的调度器,用户进程一般都是用完全公平调度器(fair_sched_class)。
-
第二,进程创建完前会综合考虑缓存友好性以及空闲状况,选择一个 CPU 运行队列出来,并将新进程添加到该队列中。
-
第三,内核有很多的时机来触发调度。在放弃 CPU 前会从当前 CPU 的运行队列获取一个进程出来,上下文切换后运行之。
-
-
线程调度:
- 对线程的调度可以有两种方式:一种是直接调度线程,不考虑它们所属的进程,这种方式叫做直接调度或者一级调度;另一种是先调度进程,再在进程内部调度线程,这种方式叫做间接调度或者二级调度。POSIX规定,操作系统可以选择这两种方式中的任何一种都行。Linux选择的是一级调度。
- Linux中线程就是轻量级进程,线程的调度是按照进程的调度方式来进行调度的。
调度时机:IO等待、加锁失败等各种阻塞操作以及用户空间主动调用sched_yield。
Linux内存布局
-
32位3G虚拟空间,1G内核空间,65位,128T虚拟空间,128T内核空间
-
Linux 系统中虚拟空间分布可分为用户态和内核态两部分,
-
内核态虚拟内存空间是所有进程共享的,不同进程进入内核态之后看到的虚拟内存空间全部是一样的。
-
其中用户虚拟空间的分布:代码段、全局变量、BSS、函数栈、堆内存、映射区。
-
用于存放进程程序二进制文件中的机器指令的代码段
-
用于存放程序二进制文件中定义的全局变量和静态变量的数据段和 BSS 段。
-
用于在程序运行过程中动态申请内存的堆。
-
用于存放动态链接库以及内存映射区域的文件映射与匿名映射区。
文件映射:把文件的一个区间映射到进程的虚拟地址空间,数据源是存储设备上文件。
匿名映射:没有文件支持的内存映射,把物理内存映射到进程的虚拟地址空间,没有数据源
通常把文件映射的物理页称为文件页,把匿名映射的物理页称为匿名页。
-
用于存放函数调用过程中的局部变量和函数参数的栈。
-
![image.png](images/68763fe509b7adf5987a3ce96c9d12ee.png)
进程和线程的本质区别:是否共享地址空间。子进程共享了父进程的虚拟内存空间,这样子进程就变成了我们熟悉的线程。Linux 内核并不区别对待它们,线程对于内核来说仅仅是一个共享特定资源的进程而已。
内核线程和用户态线程的区别:核线程没有相关的内存描述符 mm_struct (内存空间描述符),内核线程对应的 task_struct 结构中的 mm 域指向 Null,所以内核线程之间调度是不涉及地址空间切换的。
Linux进程运行过程
-
进程编译:
- 源代码在编译后会生成一个可执行程序二进制文件,加载起来并运行。在内存中创建一个进程实体。一个进程实体(进程映像)由PCB、程序段、数据段组成。
-
进程创建:
- Linux 把所有的进程使用双向循环链表连接起来,链表的每一项都是类型为task_struct, 称为
进程描述符
。 - Linux中,PCB(进程控制块)是 task_struct,包含:
- 进程状态
- 进程/线程的PID:内核是用 bitmap 来管理使用和为使用的 pid 号的
- 进程/线程树关系:父进程、子进程、兄弟进程
- 进程调度优先级
- 进程地址空间:mm_struct
- 文件系统信息: fs_struct,当前目录pwd, root等信息
- 打开的文件信息:files_struct记录文件描述符的使用情况
- namespaces :用来隔离内核资源的方式。
- 其中内存描述符 mm_struct描述了这个进程的虚拟内存空间。CPU 只会访问虚拟内存,通过MMU(内存管理单元)完成虚拟内存地址转换成物理地址。
![图片](images/640-167082639402839.png)
![图片](images/640-167082679879742.png)
-
Linux进程的创建:fork 系统调用创建一个进程出来。然后在子进程中调用 execve 加载可执行文件。
-
fork:
- 执行fork后,父进程的task_struck对拷给子进程,父子进程最初资源完全一样,但是两份不同拷贝,因此任何改动都造成二者的分裂。(task_struct中内容)
父子进程对内存资源(mm)的管理使用了COW(Copy-On-Write, 写时拷贝)技术:
- 在fork之前,一片内存区对应一份物理地址和一份虚拟地址,内存区的权限的RW;
- 在fork之后,父子进程看到的内存区虚拟地址相同,物理地址也相同,父子进程使用的其实是同一片物理内存,未发生内存拷贝,操作系统会将此内存区权限改为RO;
- 父或子进程对内存区执行写操作将触发PageFault,操作系统此时会将内存区拷贝一份,父子进程看到的虚拟地址仍然一样,但是物理地址已经不则。各进程虚拟地址到物理地址的映射由MMU(Memory Management Unit, 内存管理单元)管理。
-
在 execve 系统调用中:
-
首先会申请一个 linux_binprm 对象。该内核对象用于保存加载二进制文件时使用的参数。在申请完后,对该参数对象进行各种初始化。
-
在初始化 linux_binprm 的过程中,会申请一个全新的 mm_struct 对象,准备留着给新进程使用。
-
给新进程的栈申请一页4kb的虚拟内存空间,并将栈指针记录下来
-
读取二进制可执行文件的前 128 字节。
-
调用 ELF 加载器的 load_elf_binary 函数:
- ELF 文件头解析
- 清空父进程继承来的资源,使用新的 mm_struct 以及新的栈。
- 数据段虚拟内存申请&堆初始化(开始指针和结束指针)
- 计算出程序入口地址
fork函数
:通过拷贝当前进程创建一个子进程,子进程和父进程的区别就只在于PID(进程id)和PPID(父进程id)和少量资源exec函数
:j把一个进程的代码段数据段用新的可执行程序替换。负责读取可执行文件并载入地址空间开始运行。通常是指exec函数族。
-
-
进程和线程在创建出来后会添加到就绪队列中等待调度。
- 进程调度:
-
每个 CPU 核都有一个运行队列。为了支持不同的调度需求,运行队列是由实时调度器、完全公平调度器等多种调度器组成。
- 实时调度器:优先级是最主要考虑的因素。高优先级的进程可以抢占低优先级进程 CPU 资源来运行。多级优先反馈队列算法。
- 完全公平调取器(CFS):CFS 调度器的核心思想是强调让每个进程尽量公平地分配到 CPU 时间即可,而不是实时抢占。
- 它引入了一个虚拟时间的概念。一旦进程运行虚拟时间就会增加。尽量让虚拟时间最小的进程运行,谁小了就要多运行,谁大了就要少获得 CPU。最后尽量保证所有进程的虚拟时间相等,动态地达到公平分配 CPU 的目的。
- 实现:使用红黑树来管理任务。红黑树把进程按虚拟运行时间从小到大排序。越靠树的左侧,进程的运行虚拟时间越小。越靠树的右侧,进程的运行虚拟时间就越大。这样每当想挑选可运行进程时,直接从树的最左侧选择节点就可以了。
- 考虑性能:进程上下文切换会导致额外的 CPU 浪费。Linux 会保证选择到的进程一个最短的运行时间。
- 考虑权重:这个权重就是 Linux 进程的 nice 值,也就是我们平时 top 命令结果中看到的 ni 这一列。nice 范围为 -20(最高权重)到 19(最低权重)。权重越高获得CPU时间越多。
-
第一,是进程在 fork 的时候会选择自己的调度器,用户进程一般都是用完全公平调度器(fair_sched_class)。
-
第二,进程创建完前会综合考虑缓存友好性以及空闲状况,选择一个 CPU 运行队列出来,并将新进程添加到该队列中。
-
第三,内核有很多的时机来触发调度。在放弃 CPU 前会从当前 CPU 的运行队列获取一个进程出来,上下文切换后运行之。
Linux命令
网络:
-
查看网络配置:
ifconfig
和ip
-
ifconfig
:查看IP 地址、子网掩码、MAC 地址、网关地址、MTU 大小、网口的状态以及网络包收发的统计信息
-
-
查看 socket、TCP连接状态,显示网络状态和端口占用信息:
netstat
或者ss
-
netstat
或者ss
:socket 的状态(State)、接收队列(Recv-Q)、发送队列(Send-Q)、本地地址(Local Address)、远端地址(Foreign Address)、进程 PID 和进程名称(PID/Program name)等
-
-
查看连通性和延时:
ping
-
ping
命令:icmp_seq
(ICMP 序列号)、TTL
(生存时间,或者跳数)以及time
(往返延时),packet loss
的百分比是 0。
-
文件
- 查看文件:
cat
:由第一行到最后一行连续显示在屏幕上less
:不加载整个文件,输出一小页内容more
:分页显示文件内容vi
:编辑方式查看tail
:仅查看尾部,还可以指定行数head
:仅查看头部,还可以指定行数
- 创建目录和移除目录:
mkdir
,rmdir
- 显示当前所在目录:
pwd
- 创建空文件:
touch
进程
-
查看当前进程: ps
- Linux中的ps命令是Process Status的缩写。 ps命令用来列出系统中当前运行的那些进程。
- ps命令列出的是当前那些进程的
快照
,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。
- ps -l 列出与本次登录有关的进程信息;
- ps -aux 查询内存中进程信息;
- ps -aux | grep * 查询 *进程的详细信息;
- top 查看内存中进程的动态信息;
- kill -9 pid 杀死进程。
-
ps -aux
:- a:all,不止显示当前用户启动的进程,也显示系统中其他所有用户启动的进程(因为linux是多用户的系统)。如果没有a参数,则只显示
当前用户
启动的进程,不显示其他用户显示的进程。 - u:user,使用以用户为主的格式输出进程信息,user为第一列(如下图所示) 如果没有u参数,则PID是第一列
- x:显示当前用户在所有终端下的进程。
-
USER:启动该进程的用户。因为一台服务器可以有很多用户,每个用户都可以启动进程。
-
PID:进程的ID号。在系统中是唯一的,需要杀死进程的时候,就是kill pid 命令杀死进程。
-
%CPU:CPU占用的百分比,可以超过100,因为linux系统一般都是多核心的。如果是10个核心,那总共就是1000%
-
%MEM:物理内存占用的百分比
-
VSZ:占用虚拟内存(swap空间)的大小KB,VSZ表示如果一个程序完全驻留在内存的话需要占用多少内存空间;
-
RSS:占用常驻内存(物理内存)的大小KB,RSS指明了当前实际占用了多少内存;
-
TTY:该进程在哪个终端上运行。“?”表示未知或不需要终端
-
STAT:显示了进程当前的状态:
Linux上进程的五种状态:
R——Runnable(运行):正在运行或在运行队列中等待
S——sleeping(中断):休眠中,受阻,在等待某个条件的形成或接收到信号
D——uninterruptible sleep(不可中断):收到信号不唤醒和不可运行,进程必须等待直到有中断发生,通常用于磁盘写入
Z——zombie(僵死):进程已终止,但进程描述还在,直到父进程调用wait4()系统调用后释放
T——traced or stoppd(停止):进程收到SiGSTOP,SIGSTP,SIGTOU信号后停止运行
状态后缀表示:
<:优先级高的进程
N:优先级低的进程
L:有些页被锁进内存
s:进程的领导者(在它之下有子进程)
l:ismulti-threaded (using CLONE_THREAD, like NPTL pthreads do)
+:位于后台的进程组
- S(休眠):大S, 进程处在睡眠状态,表明这些进程在等待某些事件发生–可能是用户输入或者系统资源的可用性;
- R(运行): 正在运行,或者即将要运行
- Z(僵死): 在一个进程调用了exit之后,该进程并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构。在Linux进程的5种状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。对处于僵死状态的进程应予以手动终止。
- <(高优先级)、
- N(低优先级)、
- s(父进程):小s, 进程的领导者(在它之下有子进程);
- +(前台进程):比如你执行 python aaa.py命令,则就是前台执行,就会有+显示, 但是如果你执行python aaa.py & 命令,则就是后台执行,就不会有+
- START:该进程开始的时间,什么时间开始的。
-
TIME: 该进程已经占用的CPU时间,可以理解为该进程已经执行了多长时间。该时间并不一定是从start开始的。如果是多进程的话,则time代表是该子进程占用了多长时间cpu 一个子进程执行完毕之后,新的子进程开始执行,则该参数从0开始计数。
-
COMMAND:启动该进程的命令的名称.
- a:all,不止显示当前用户启动的进程,也显示系统中其他所有用户启动的进程(因为linux是多用户的系统)。如果没有a参数,则只显示
-
ps -ef
显示信息说明,两者的输出结果差别不大,但展示风格不同。aux是BSD风格,-ef是System V风格。- -e:显示系统内的所有进程信息,及显示系统中所有用户的进程。
- -l:使用长(long)格式显示进程信息。
- -f:使用完整的(full)格式显示进程信息,及不会截断
- UID:用户 ID
- PID:进程 ID
- PPID:父进程 ID
- C:CPU用于计算执行优先级的因子。数值越大,表明进程是 CPU密集型运算, 执行优先级会降低;数值越小,表明进程是 I/O密集型运算,执行优先级会提高
- STIME:进程启动的时间
- TTY:完整的终端名称
- TIME:CPU时间
- CMD:启动进程所用的命令和参数。
-
ps -o lstart
:格式化查看上次进程启动时间。# ps -o lstart 13515//格式化查看上次进程启动时间 STARTED Wed Aug 31 14:28:53 2022
-
实时监控系统进程状态
top
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x5w0II4D-1684156134705)(images/e9b90ed19730f457a41d55f28b5ce198bf7406b1.png)]
进程信息:
- Tasks(系统任务)信息:total,总进程数;
- running,正在运行的进程数;
- sleeping,休眠的进程数; stopped,中止的进程数;
- zombie,僵死无响应的进程数。
CPU信息:
比如一秒内有100个cpu时间片,这个cpu时间片就是cpu工作的最小单位。那么这100个cpu时间片在不同的区域和目的进行操作使用,就代表这个区域所占用的cpu时间比。也就是这里得出的cpu时间百分比。
如下为TOP命令看到的信息,每个参数将表示cpu时间片被占用的分布情况,如下所有相加为100%。
- us:用户空间占用CPU百分比
- sy:内核空间占用CPU百分比
- ni:改变过优先级的用户进程占用的 CPU百分比
- id:空间cpu的百分比
- wa:等待输入/输出的进程的占用 CPU百分比
- hi:硬中断请求服务占用的 CPU百分比
- si:软中断请求服务占用的 CPU百分比
- st:st(Steal time)虚拟时间百分比。就是当有虚拟机时,虚拟 CPU等待实际CPU的时间百分比。
物理内存信息:
- Mem(内存)信息:total,总内存空间;
- used,已用内存;
- free,空闲内存;
- buffers,缓存区域。
交换分区(swap)信息:
- Swap(交换空间)信息:total,总交换空间;
- used,已用交换空间;
- free,空闲交换空间;
- cached,缓存空间。
-
top -H -p 4262
:TOP查看进程的所有线程信息。 -
netstat
:显示网络状态和端口占用信息