Linux基础知识 ·

Linux进程与查看

进程与线程

在Linux系统中,触发任意一个事件时,系统都会将它定义为一个进程,并且给予这个进程一个ID,称为PID,同时依据触发这个进程与用户相关的属性关系,给予这个PID一组有效的权限设置。

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

线程是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

进程与程序

操作系统中最小的资源分配单位就是进程了,从系统启动的那一刻起,就有一个个服务在被启动起来,而每个进程都与其定义的发起者权限相关联,所以我们的进程也会沿用我们定义的权限关系。

所以包括我们在shell中执行任务开启的子进制,也会沿用父进程的权限。

子进程与父进程

 

程序彼此之间是有相关性的!以下面的图示来看,连续运行两个 bash 后,第二个 bash 的父程序就是前一个 bash。因为每个程序都有一个 PID ,那某个程序的父程序该如何判断?就通过 Parent PID (PPID) 来判断即可。子进程可以取得父进程的环境变量,有时候杀掉一个进程,过段时间又出现的话,如果不是crontab定时任务的话,那么很有可能就是它的父进程又创建了它哦。

让我们来进行底下的练习,以了解什么是子程序/父程序。

fork and exec

其实子进程与父进程的关系还挺复杂的,最大的复杂点在于进程互相之间的调用,在Linux的过程调用中通常称为fork-and-exec 的流程,进程都会通过父进程以复制(fork)的方式产生一个一模一样的子进程,然后被复制出来的子进程再以exec 的方式来执行实际要进行的进程,最终就成为一个子进程的存在。

进程查看

查看系统中的进程:

ps

常用选项:

-A:显示所有进程,同-e。

-a:不与terminal有关的所以进程。

-u:有效用户(effective user)相关进程。

x:通常与a配合使用,列出较完整信息。

l:较长、较详细地将该PID的信息列出。

j:工作格式:

-f:较完整输出。

常用 ps aux ,查看较详细信息。

使用 ps axjf ,以树状查看详细的从属关系。或使用 pstree


pstree

常用选项:

-p :同时列出每个 process 的 PID;

-u :同时列出每个 process 的所属帐号名称。


仅观察自己的 bash 相关程序: ps -l

系统整体的程序运行是非常多的,但如果使用 ps -l 则仅列出与你的操作环境 (bash) 有关的程序而已, 亦即最上一级的父程序会是你自己的 bash 而没有延伸到 init 这支程序去!那么 ps -l 列出来的数据如下:

  • F:代表这个程序旗标 (process flags),说明这个程序的总结权限,常见号码有:
    • 若为 4 表示此程序的权限为 root ;
    • 若为 1 则表示此子程序仅进行复制(fork)而没有实际运行(exec)。
  • S:代表这个程序的状态 (STAT),主要的状态有:
    • R (Running):该程序正在运行中;
    • S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
    • D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>列印)
    • T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
    • Z (Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。
  • UID/PID/PPID:代表『此程序被该 UID 所拥有/程序的 PID 号码/此程序的父程序 PID 号码』
  • C:代表 CPU 使用率,单位为百分比;
  • PRI/NI:Priority/Nice 的缩写,代表此程序被 CPU 所运行的优先顺序,数值越小代表该程序越快被 CPU 运行。
  • ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该程序在内存的哪个部分,如果是个 running 的程序,一般就会显示【- 】 / SZ 代表此程序用掉多少内存 / WCHAN 表示目前程序是否运行中,同样的, 若为 - 表示正在运行中。
  • TTY:登陆者的终端机位置,若为远程登陆则使用动态终端介面 (pts/n);
  • TIME:使用掉的 CPU 时间,注意,是此程序实际花费 CPU 运行的时间,而不是系统时间;
  • CMD:就是 command 的缩写,造成此程序的触发程序之命令为何。

所以你看到的 ps -l 输出信息中,他说明的是:bash 的程序属于 UID 为 0 的使用者,状态为睡眠 (sleep), 之所以为睡眠因为他触发了 ps (状态为 run) 之故。此程序的 PID 为 3528,优先运行顺序为 80 , 下达 bash 所取得的终端介面为 pts/0 ,运行状态为等待 (wait) 。


观察系统所有程序: ps aux

ps -l 与 ps aux 显示的项目并不相同!在 ps aux 显示的项目中,各栏位的意义为:

  • USER:该 process 使用者帐号。
  • PID :该 process 的进程识别码。
  • %CPU:该 process 使用掉的 CPU 资源百分比;
  • %MEM:该 process 所占用的实体内存百分比;
  • VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
  • RSS :该 process 占用的固定的内存量 (Kbytes)
  • TTY :该 process 是在那个终端机上面运行,若与终端机无关则显示 “?”,另外, tty1-tty6 是本机上面的登陆者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
  • STAT:该程序目前的状态,状态显示与 ps -l 的 S 旗标相同 (R/S/T/Z)
  • START:该 process 被触发启动的时间;
  • TIME :该 process 实际使用 CPU 运行的时间。
  • COMMAND:该程序的实际命令。

一般来说,ps aux 会依照 PID 的顺序来排序显示。


僵尸程序的成因是因为该程序应该已经运行完毕,或者是因故应该要终止了, 但是该程序的父程序却无法完整的将该程序结束掉,而造成那个程序一直存在内存当中。 如果你发现在某个程序的 CMD 后面还接上 <defunct> 时,就代表该程序是僵尸程序啦,例如:

当系统不稳定的时候就容易造成所谓的僵尸程序,可能是因为程序写的不好,或者是使用者的操作习惯不良等等所造成。 如果你发现系统中很多僵尸程序时,记得!要找出该程序的父程序,然后好好的做个追踪,好好的进行主机的环境最佳化! 看看有什么地方需要改善的,不要只是直接将他 kill 掉而已呢!不然的话,万一他一直产生,那可就麻烦了!


pidof

找出某支正在运行的程序的 PID

pidof 选项 程序名称

常用选项:

-s :仅列出一个 PID 而不列出所有的 PID

-x :同时列出该 program name 可能的 PPID 那个程序的 PID

进程类型

守护进程: daemon,在系统引导过程中启动的进程, 和终端无关进程

前台进程:跟终端相关,通过终端启动的进程

注意:两者可相互转化

进程状态:

运行态: running

就绪态: ready

睡眠态:

可中断: interruptable

不可中断: uninterruptable

停止态: stopped,暂停于内存中,但不会被调度,除非手动启动

僵死态: zombie,结束进程,父进程结束前,子进程不关闭

事实上,通常僵尸程序都已经无法控管,而直接是交给 init 这支程序来负责了,偏偏 init 是系统第一支运行的程序, 他是所有程序的父程序!我们无法杀掉该程序的 (杀掉他,系统就死掉了!),所以,如果产生僵尸程序, 而系统过一阵子还没有办法通过核心非经常性的特殊处理来将该程序删除时,那你只好通过 reboot 的方式来将该程序抹去了!

top:动态观察程序的变化

相对于 ps 是截取一个时间点的程序状态, top 则可以持续侦测程序运行的状态!使用方式如下:

top [-d 数字] | top [-bnp]

常用选项:
-d :后面可以接秒数,就是整个程序画面升级的秒数。默认是 5 秒;
-b :以批量的方式运行 top ,还有更多的参数可以使用!
通常会搭配数据流重导向来将批量的结果输出成为文件。
-n :与 -b 搭配,意义是,需要进行几次 top 的输出结果。
-p :指定某些个 PID 来进行观察监测而已。

在 top 运行过程当中可以使用的按键命令:
? :显示在 top 当中可以输入的按键命令;
P :以 CPU 的使用资源排序显示;
M :以 Memory 的使用资源排序显示;
N :以 PID 来排序!
T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。
k :给予某个 PID 一个讯号 (signal)
r :给予某个 PID 重新制订一个 nice 值。
q :离开 top 软件的按键。


top 也是个挺不错的程序观察工具!但不同于 ps 是静态的结果输出, top 这个程序可以持续的监测整个系统的程序工作状态。 在默认的情况下,每次升级程序资源的时间为 5 秒,不过,可以使用 -d 来进行修改。

top 主要分为两个画面,上面的画面为整个系统的资源使用状态,基本上总共有六行,显示的内容依序是:

  • 第一行(top...):这一行显示的信息分别为:
    • 目前的时间,亦即是 17:03:09 那个项目;
    • 启动到目前为止所经过的时间,亦即是 up 7days, 16:16 那个项目;
    • 已经登陆系统的使用者人数,亦即是 1 user项目;
    • 系统在 1, 5, 15 分钟的平均工作负载。代表的是 1, 5, 15 分钟,系统平均要负责运行几个程序(工作)的意思。 越小代表系统越闲置,若高于 1 得要注意你的系统程序是否太过繁复了!
  • 第二行(Tasks...):显示的是目前程序的总量与个别程序在什么状态(running, sleeping, stopped, zombie)。 比较需要注意的是最后的 zombie 那个数值,如果不是 0 !好好看看到底是那个 process 变成僵尸了吧?
  • 第三行(Cpus...):显示的是 CPU 的整体负载,每个项目可使用 ? 查阅。需要特别注意的是 %wa ,那个项目代表的是 I/O wait, 通常你的系统会变慢都是 I/O 产生的问题比较大!因此这里得要注意这个项目耗用 CPU 的资源! 另外,如果是多核心的设备,可以按下数字键『1』来切换成不同 CPU 的负载率。
  • 第四行与第五行:表示目前的实体内存与虚拟内存 (Mem/Swap) 的使用情况。 再次重申,要注意的是 swap 的使用量要尽量的少!如果 swap 被用的很大量,表示系统的实体内存实在不足!
  • 第六行:这个是当在 top 程序当中输入命令时,显示状态的地方。

至于 top 下半部分的画面,则是每个 process 使用的资源情况。比较需要注意的是:

  • PID :每个 process 的 ID 啦!
  • USER:该 process 所属的使用者;
  • PR :Priority 的简写,程序的优先运行顺序,越小越早被运行;
  • NI :Nice 的简写,与 Priority 有关,也是越小越早被运行;
  • %CPU:CPU 的使用率;
  • %MEM:内存的使用率;
  • TIME+:CPU 使用时间的累加;

top默认使用 CPU 使用率排序,如果想要使用内存使用率排序,则在top内按下“M”,恢复 CPU 使用率排序则按一下“P”。

参与评论