Linux操作系统总结

进程控制块PCB

Linux中,PCB(进程控制块)是 task_struct,包含:

  • pid

  • *mm:内存描述符

  • *fs:文件系统信息, *pwd, *root

  • *files:打开的文件信息,打开的fd数组

  • *signal:信号,信号处理函数

pid的数量是有限的

  • task_struct管理:保证不同场景速度

    • 形成链表

    • 形成树

    • 形成hash:pid -> task_struct

进程生命周期

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SZPkkSSt-1684156134704)(images/image-20221223190609692.png)]

  • 就绪: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。

    getpidtop进程视角,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 段

    • 用于在程序运行过程中动态申请内存的

    • 用于存放动态链接库以及内存映射区域的文件映射与匿名映射区

      文件映射:把文件的一个区间映射到进程的虚拟地址空间,数据源是存储设备上文件。

      匿名映射:没有文件支持的内存映射,把物理内存映射到进程的虚拟地址空间,没有数据源

      通常把文件映射的物理页称为文件页,把匿名映射的物理页称为匿名页。

    • 用于存放函数调用过程中的局部变量和函数参数的

img虚拟内存空间划分

image.png

进程和线程的本质区别:是否共享地址空间。子进程共享了父进程的虚拟内存空间,这样子进程就变成了我们熟悉的线程。Linux 内核并不区别对待它们,线程对于内核来说仅仅是一个共享特定资源的进程而已。

内核线程和用户态线程的区别:核线程没有相关的内存描述符 mm_struct (内存空间描述符),内核线程对应的 task_struct 结构中的 mm 域指向 Null,所以内核线程之间调度是不涉及地址空间切换的。

Linux进程运行过程

  1. 进程编译:

    • 源代码在编译后会生成一个可执行程序二进制文件,加载起来并运行。在内存中创建一个进程实体。一个进程实体(进程映像)由PCB、程序段、数据段组成。
  2. 进程创建:

  • Linux 把所有的进程使用双向循环链表连接起来,链表的每一项都是类型为task_struct, 称为进程描述符
  • Linux中,PCB(进程控制块)是 task_struct,包含:
    • 进程状态
    • 进程/线程的PID:内核是用 bitmap 来管理使用和为使用的 pid 号的
    • 进程/线程树关系:父进程、子进程、兄弟进程
    • 进程调度优先级
    • 进程地址空间:mm_struct
    • 文件系统信息: fs_struct,当前目录pwd, root等信息
    • 打开的文件信息:files_struct记录文件描述符的使用情况
    • namespaces :用来隔离内核资源的方式。
  • 其中内存描述符 mm_struct描述了这个进程的虚拟内存空间。CPU 只会访问虚拟内存,通过MMU(内存管理单元)完成虚拟内存地址转换成物理地址。
图片 图片
  • 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函数族。
  • 进程和线程在创建出来后会添加到就绪队列中等待调度。

  1. 进程调度:
  • 每个 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命令

网络:
  • 查看网络配置:ifconfigip

    • 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:仅查看头部,还可以指定行数
  • 创建目录和移除目录:mkdirrmdir
  • 显示当前所在目录: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:显示当前用户在所有终端下的进程。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-INDwiC2O-1684156134705)(images/fc095fa47dfe481d9616ef84c5e4ef11tplv-k3u1fbpfcp-zoom-in-crop-mark4536000.webp)]

    • 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:启动该进程的命令的名称.

  • ps -ef显示信息说明,两者的输出结果差别不大,但展示风格不同。aux是BSD风格,-ef是System V风格。

    • -e:显示系统内的所有进程信息,及显示系统中所有用户的进程。
    • -l:使用长(long)格式显示进程信息。
    • -f:使用完整的(full)格式显示进程信息,及不会截断

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l8WMWuvT-1684156134705)(images/b328170ccd1e4a13ad6794a1917c702btplv-k3u1fbpfcp-zoom-in-crop-mark4536000.webp)]

    • 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-Oo2AMf9J-1684156134705)(images/a9ddc5096add30022f84a8567fec366e82566ce3.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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 :显示网络状态和端口占用信息

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Guanam_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值