文章目录

  • 进程基础
  • 进程定义
  • 进程分类
  • 进程状态
  • 进程属性
  • 进程查看
  • 终止进程


linux 一个Java进程突然CPU飙高 linux java进程自动退出_linux

进程基础

  Linux 系统中基本所有的操作都以进程的形式进行,浏览网页、编辑文档、观看视频等,在使用命令进行操作的过程中,Linux内核都以进程的形式对其进行管理。

Linux 是一个多用户多任务操作系统→Linux 是一个多进程操作系统。

轮换着被CPU执行,一般CPU对于进程的执行采用时间片轮换的方法。每个进程运行在自己的空间内,只有通过操作系统内核才能与其进行交互。

间断性的特征。这些特征都是在程序的执行过程中发生的,是动态的过程;而传统的程序本身是一组指令的集合,是一个静态的概念,无法描述程序在内存中的执行情况,即无法从程序的字面上看出它何时执行,何时停顿,也无法看出它与其他执行程序的关系,因此,程序这个静态概念已不能如实反映程序并发执行过程的特征。为了深刻描述程序动态执行过程的性质,人们引入“进程”概念。

面向进程设计的系统(如早期的UNIX、Linux2.4及更早的版本)中,进程是程序的基本执行实体;在面向线程设计的系统(如当代多数操作系统、Linux2.6及更新的版本)中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。 若干进程有可能与同一个程序相关联,且每个进程皆可以同步(循序)或异步(平行)的方式独立运行。现代计算机系统可以同一段时间内以进程的形式将多个程序加载到存储器中,并可时间共享(或称时分复用),以在一个处理器上表现出同时(平行性)运行的感觉。同样的,使用多线程技术(多线程即每一个线程都代表一个进程内的一个独立执行上下文)的操作系统或计算机架构,同样程序的平行线程,可在多CPU主机或网络上真正同时运行(在不同的CPU上)。

  在进程的生存期内,将使用许多系统资源。进程使用系统CPU来运行自己的指令,并使用系统的物理内存保存自己的数据。进程打开和使用文件系统的文件,并直接或者间接地使用系统地物理设备。

一般创建一个新的进程是为了运行一个指定的指令,但是不运行新命令也可以创建进程,不创建新进程也可以运行命令。

进程定义

  狭义定义:进程就是一段程序的执行过程。

  广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

CPU核心在任何时间内仅能运行一项进程。

进程分类

  进程一般分为交互进程、批处理进程实时进程三类。

  守护进程总是处于活跃状态的,一般是后台运行;守护进程一般是由系统在开机时通过脚本自动激活启动或超级管理用户root来启动。比如在Fedora或Red Hat中,可以定义httpd服务器的启动脚本的运行级别,此文件位于/etc/init.d目录下,文件名是httpd,/etc/init.d/httpd就是服务器的守护程序,当把它的运行级别设置为3和5,系统启动时,它会跟着启动。

  (1)交互式进程:一般是由Shell启动的进程。这些进程经常和用户发生交互,所以花费一些时间等待用户的操作。当有输入时,进程必须很快地激活。通常,要求延时在50~150ms。典型的交互式进程有:控制台命令Shell、文本编辑器、图形应用程序。

  (2)批处理进程(Batch Process):不需要用户交互,一般在后台运行,所以不需要非常快的反应,他们经常被调度期限制。典型的批处理进程:编译器、数据库搜索引擎和科学计算。

  (3)实时进程:对调度有非常严格的要求,这种类型的进程不能被低优先级进程阻止,并且在很短时间内做出反应。典型的实时进程:音视频应用程序、机器人控制等。
  批处理进程可能与I/O或者CPU有关,但是实时进程完全通过Linux的调度算法识别。其实交互式进程和批处理进程很难区别。

进程状态

  Linux是一个多用户、多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。进程状态划分也有不同的分法,但一般分为5个状态,在进程管理过程中始终会处于某种状态,进程的当前状态决定了进程如何和何时获得CPU的访问权限。
  (1) 运行状态(正在运行或在运行队列中等待);
  (2) 中断状态(休眠中或受阻或在等待某个条件的形成或接收到信号);
  (3) 不可中断状态(收到信号不唤醒和不可运行,进程必须等待直到有中断发生);
  (4) 僵死状态(进程已终止,进程描述存在,直到父进程调用wait4()系统,调用后释放);
  (5) 停止状态(进程收到SIGSTOP、SIGSTP、SIGTIN、SIGTOU信号后停止运行)。

  ps工具标识进程的5种状态码:
  (1) D不可中断uninterruptible sleep(usually IO);
  (2) R运行runnable(on run queue);
  (3) S中断sleeping;
  (4) T停止traced or stopped;
  (5) Z僵死a defunct(“zombie”)process。

工具程序**传递给用户,并通过工具程序接受用户对某个进程的处理。

进程属性

  • 进程的属性也就是描述进程的信息,包含以下几个部分。
      
     进程ID(PID),是唯一的数值,用来区分进程;
     父进程和父进程的ID(PPID);
     启动进程的用户ID(UID)和所归属的组(GID);
     进程状态,状态分为运行R、休眠S、僵尸Z;
     进程执行的优先级;
     进程所连接的终端名;
     进程资源占用,比如占用资源大小(内存、CPU占用量)。

进程查看

  进程查看命令包括内存状态查看命令free、进程查看命令ps、top以及可以系统内进程查看命令pstree。

1、 查看内存状态

  名称:free
  使用权限:所有使用者
  使用方式:free [-bkmgto] [-s时间]
  说明:显示内存状态信息。free命令显示内存使用情况,包括物理内存、虚拟交换文件内存、共享内存区段,以及系统核心使用的缓冲区。

参数

说明

-b

free命令默认单位是kb;-b采用Byte为单位;-k采用KB为单位;-m采用MB为单位;-g采用GB为单位。

-t

显示内存的总和行。

-o

不显示缓存区调节行。

-s

间隔秒数,持续观察内存使用情况。

显示内存使用情况

linux 一个Java进程突然CPU飙高 linux java进程自动退出_执行过程_02

说明:
  total: 表示物理内存总量(total=used+free)。
  used: 表示总计分配给缓存(包含buffers与cache)使用的数量,但其中可能部分缓存并未实际使用。
  free: 未被分配的内存。
  shared: 共享内存,一般系统不会用到。
  buffers: 系统分配但未被使用的buffers数量。
  cached: 系统分配但未被使用的cache数量。

以MB显示内存使用情况

linux 一个Java进程突然CPU飙高 linux java进程自动退出_linux_03

每隔5s查看内存状态一次

linux 一个Java进程突然CPU飙高 linux java进程自动退出_父进程_04

2、 查看进程运行情况

  名称:ps
  使用权限:所有使用者
  使用方式1:ps aux
  使用方式2:ps –lA
  使用方式3:ps axjf
  说明:显示进程信息

参数

说明

-A

所有的process均显示出来,与-e具有同样的效用。

-a

不与terminal有关的所有process。

-u

有效使用者(Effective User)相关的process。

x

通常与a这个参数一起使用,可列出较完整信息。

  输出格式规划

  l:较长、较详细地将该PID的信息列出。
  j:工作的格式(Jobs Format)。
  -f:做一个更为完整的输出。

查看属于自己的进程的基本情况。

linux 一个Java进程突然CPU飙高 linux java进程自动退出_linux_05

PID代表进程ID;TTY代表登录者的终端位置;TIME代表使用掉的CPU时间;CMD代表造成程序触发的进程。

将目前属于你自己这次登入的PID相关信息列出来。

linux 一个Java进程突然CPU飙高 linux java进程自动退出_运维_06

参数

说明

F

代表这个进程的标志,说明这个进程的权限,4代表使用者为root。

S

代表这个进程的状态(STAT)。

UID

进程被该UID所拥有。

PID

进程的ID,也就是进程的唯一标识。

PPID

此进程的父进程的PID。

C

CPU使用的资源的百分比。

PRI

Priority(优先执行序)的缩写,代表CPU所执行的优先级,数值越小离执行的时间越短。

NI

Nice值,进程优先级。

ADDR

ADDR是指Kernel Function,即该程序在内存的哪个部分。

SZ

进程占用的内存大小。

WCHAN

目前这个程序是否正在运行当中,若为-表示正在运行。

TTY

登录者的终端机位置。

TIME

该进程占用的CPU时间。

CMD

该进程是由哪个命令触发的。

列出目前所有的正在内存当中的程序。

linux 一个Java进程突然CPU飙高 linux java进程自动退出_运维_07

参数

说明

USER

这个进程属于哪个用户。

PID

该进程的唯一ID。

%CPU

进程所使占用的CPU百分比。

%MEM

进程所占用的物理内存百分比。

VSZ

进程占用的虚拟内存量单位为Kbytes。

RSS

进程占用的固定的内存量单位为Kbytes.

TTY

该进程是在哪个终端机上面运行,若与终端机无关,则显示“?”;如果显示tty1~tty6代表本机上面的登录者程序;若为pts/0等,则表示为由网络连接进主机的程序。

STAT

该程序目前的状态。

START

该进程被触发启动的时间。

TIME

该进程实际使用CPU运行的时间。

COMMAND

该进程的实际命令。

和grep结合,提取指定程序httpd的进程。

linux 一个Java进程突然CPU飙高 linux java进程自动退出_父进程_08

列出类似程序树的程序显示。

linux 一个Java进程突然CPU飙高 linux java进程自动退出_linux_09

3、 以树状形式查看进程

  名称:pstree
  使用权限:所有使用者
  使用方式:ps [-ahlup]
  说明:以树状形式显示进程的情况。

参数

说明

-a

显示每个程序完整的命令。

-A

各进程之间以ASCII字符连接。

-h

显示树状图的时候标明现在执行的程序。

-u

同时列出每个进程的所有用户。

-p

显示进程PID。

使用默认命令查看进程树。

linux 一个Java进程突然CPU飙高 linux java进程自动退出_父进程_10


linux 一个Java进程突然CPU飙高 linux java进程自动退出_执行过程_11

  说明:此处只截取了进程树的一部分。

列出目前系统上的ASCII连接的各种进程树。

linux 一个Java进程突然CPU飙高 linux java进程自动退出_运维_12


linux 一个Java进程突然CPU飙高 linux java进程自动退出_java_13

  说明:和默认参数只是连接形式上有所差别而已。这里也只截取了一部分。

显示当前所有进程的进程ID。

linux 一个Java进程突然CPU飙高 linux java进程自动退出_java_14


linux 一个Java进程突然CPU飙高 linux java进程自动退出_linux_15

  说明:这里也只截取了一部分。

4、 动态查看进程

  名称:top
  使用权限:所有使用者
  使用方式:top [-d秒数] [-n执行次数] [-bnpc]
  说明:ps是查看某个时间点的进程情况,top可以持续检测进程的运行状态。

参数

说明

-d

后面接秒数,是指整个程序画面多少秒更新一次。

-b

以批次的方式执行top。

-n

后接执行次数,指定监控信息的更新次数。

-p

后接PID监控指定的进程。

-c

显示每个进程完成的命令。

每2s执行一次top。

linux 一个Java进程突然CPU飙高 linux java进程自动退出_父进程_16


linux 一个Java进程突然CPU飙高 linux java进程自动退出_父进程_17

  使用图形化界面监管进程。

  使用 gnome-system-monitor 命令或者选择面板上“应用程序”菜单中的“系统工具”→“系统监视器”命令,通过图形化界面的方式监视系统。

linux 一个Java进程突然CPU飙高 linux java进程自动退出_父进程_18

5、 进程前后台切换

前台进程;反之,则称为后台进程。对每一个终端,都允许多个后台进程。对前台、后台进程的控制与调度,被称为任务控制。
  command &:将一个进程直接丢入后台执行;
  Ctrl+Z组合键:将一个正在运行的前台进程暂时停止,并丢入后台。

  打开Firefox并将其进程放到后台。

(1) 使用firefox命令直接打开火狐。

linux 一个Java进程突然CPU飙高 linux java进程自动退出_运维_19


linux 一个Java进程突然CPU飙高 linux java进程自动退出_java_20

(2) 按Ctrl+C组合键结束进程。
(3) 使用firefox &命令直接打开火狐。

linux 一个Java进程突然CPU飙高 linux java进程自动退出_父进程_21


linux 一个Java进程突然CPU飙高 linux java进程自动退出_父进程_22

(4) 使用Ctrl+Z组合键,将一个正在运行的前台进程暂时停止,并丢入后台。

linux 一个Java进程突然CPU飙高 linux java进程自动退出_linux_23


linux 一个Java进程突然CPU飙高 linux java进程自动退出_运维_24

  说明:可以看到进程已停止。

终止进程

  终止一个进程或终止一个正在运行的程序,一般是通过kill命令进行的。比如一个程序已经死掉,但又不能退出,就可以考虑应用这些工具。

kill命令工作原理:

  向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,然后系统内核就可以对进程标识号指定的进程进行操作。

  比如在top命令中,看到系统运行许多进程,有时就需要使用kill命令终止某些进程来提高系统资源。系统多个虚拟控制台的作用是当一个程序出错造成系统死锁时,可以切换到其他虚拟控制台工作并关闭这个程序。此时使用的命令就是kill,因为kill是大多数Shell内部命令可以直接调用的。

以树状形式查看进程

  名称:kill
  使用权限:所有使用者
  使用方式:kill PID

  说明:终止编号为PID的进程,这个命令一般是要和ps命令一起配合使用的,因为要使用kill命令就必须知道进程的PID。

查看系统内的进程,并终止PID为20532的进程。

linux 一个Java进程突然CPU飙高 linux java进程自动退出_linux_25

终止进程,kill后面接上进程号。

查找并终止火狐进程。

linux 一个Java进程突然CPU飙高 linux java进程自动退出_执行过程_26

  说明1:ps –ef等同于ps aux,ps –ef | grep firefox用于查找与Firefox相关的进程;这里能查找到多个,是因为开启了多个Firefox上网。

kill终止的必须是一个已经存在的PID的号。

查看系统内的httpd服务,并终止这个进程。

linux 一个Java进程突然CPU飙高 linux java进程自动退出_linux_27

杀掉父进程,其下的子进程也会跟着死掉。只终止子进程,服务不会停止。

  说明2:service httpd status用来查看服务的状态。