Linux进程与线程状态监测 您所在的位置:网站首页 监控进程开启与关闭 Linux进程与线程状态监测

Linux进程与线程状态监测

2024-04-01 00:13| 来源: 网络整理| 查看: 265

问题

我的程序在其内部创建并执行了多个线程,我怎样才能在该程序创建线程后监控其中单个线程?我们想要看到带有它们名称的单个线程详细情况(如,CPU/内存使用率)。

Linux上显示某个进程的线程的几种方式

ps或top,都可以用来显示线程级别的信息,只是默认情况下它们显示进程级别的信息,我们需要添加相应的参数来设置。

ps命令

列出了由进程号为的进程创建的所有线程:

$ ps -T -p ps命令中,“-T”选项可以开启线程查看。SID栏表示线程ID,而CMD栏则显示了线程名称。 top 命令

top命令可以实时显示各个线程情况。要在top输出中开启线程查看,请调用top命令的“-H”选项,该选项会列出所有Linux线程。或者在top运行时,通过按“H”键将线程查看模式切换为开或关。

$ top -H

要让top输出某个特定进程并检查该进程内运行的线程状况:

$ top -H -p

在这里插入图片描述 在这里插入图片描述

htop命令

htop中启用线程查看的步骤:

先开启htop,然后按< F2 >来进入htop的设置菜单。选择“设置”栏下面的“显示选项”,然后开启“树状视图”和“显示自定义线程名”选项。按< F10 >退出设置。

在这里插入图片描述

在这里插入图片描述 相关的进程状态说明:

R running or runnable (on run queue) 正在执行或者可执行,此时进程位于执行队列中。D uninterruptible sleep (usually I/O) 不可中断阻塞,通常为 IO 阻塞。S interruptible sleep (waiting for an event to complete) 可中断阻塞,此时进程正在等待某个事件完成。Z zombie (terminated but not reaped by its parent) 僵死,进程已经终止但是尚未被其父进程获取信息。T stopped (either by a job control signal or because it is being traced) 结束,进程既可以被作业控制信号结束,也可能是正在被追踪。 进程查看

ps 查看某个时间点的进程信息。

$ ps -l #查看自己的进程 $ ps aux #查看系统所有进程 $ ps aux | grep threadx #查看特定的进程

pstree 查看进程树。

$ pstree -A #查看所有进程树

在这里插入图片描述

端口占用进程

netstat -anp 查看端口占用情况。

$ netstat -anp | grep port #查看特定端口的进程 QAQ

Q:Linux下的线程与进程有什么区别? 用户级线程

用户级线程内核的切换由用户态程序自己控制内核切换,不需要内核干涉,少了进出内核态的消耗,但不能很好的利用多核Cpu,目前Linux pthread大体是这么做的。

内核级线程

切换由内核控制,当线程进行切换的时候,由用户态转化为内核态。切换完毕要从内核态返回用户态,被称为内核支持的线程或轻量级进程。

Q:孤儿进程和僵尸进程是什么? 孤儿进程:

一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程(进程号为 1)所收养,并由 init 进程对它们完成状态收集工作,,因此孤儿进程不会对系统造成危害。

僵尸进程:

一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过 wait() 或 waitpid() 获取了子进程信息后才会释放。如果子进程退出,而父进程并没有调用 wait() 或 waitpid(),那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵尸进程。

状态标识:僵尸进程通过 ps 命令显示出来的状态为 Z(zombie)。

产生的问题:系统所能使用的进程号是有限的,如果产生大量僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。

解决办法:要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时僵尸进程就会变成孤儿进程,从而被 init 进程所收养,这样 init 进程就会释放所有的僵尸进程所占有的资源,从而结束僵尸进程。

线程

当一个程序内有多个线程被拆分出用以执行多个流时,这些线程就会在它们之间共享特定的资源(如,内存地址空间、打开的文件),以使拆分开销最小化,并避免大量高成本的IPC(进程间通信)通道。

线程与进程之间的ID

在Linux中,程序中创建的线程(也称为轻量级进程,LWP)会具有和程序的PID相同的“线程组ID”。然后,各个线程会获得其自身的线程ID(TID)。对于Linux内核调度器而言,线程不过是恰好共享特定资源的标准的进程而已。

参考资料

Linux上如何查看某个进程的线程 htop 命令详解 CS-Notes_Linux



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有