首页 > 代码库 > 进程及进程的管理

进程及进程的管理

  首先得理解进程的含义,进程不同于程序,进程是程序的一次运行实例,当一个程序运行时,就会产生相应的进程,因此,程序是死的,而进程是活的。一个进程可以包含若干线程,线程可以帮助应用程序同时做几件事(比如一个线程向磁盘写入文件,另一个则接收用户的按键操作并及时做出反应,互相不干扰),在程序被运行后中,系统首先要做的就是为该程序进程建立一个默认线程,然后程序可以根据需要自行添加或删除相关的线程。

  进程是由内核进行管理的,内核在正常启动并且全面接管硬件资源之后,会创建一个Init的进程;而这个名叫init的进程负责用户空间的进程管理;此外,每个进程的组织结构是一致的。

  CentOS5及以前:SysV Init,Classic Init,这种方式有缺陷:在启动系统时,Init通过写脚本的方式来创建各个子进程;利用shell来实现,因此其执行速度非常慢;导致系统的启动速度和进程的创建速度都非常慢;

CentOS6:upstart,有Ubuntu研发的新型的Init进程;可以并行的启动某些有关联的服务进程,在创建进程的时候,可以多线创建进程;如果有多个CPU或这有多颗CPU核心的话,其进程的创建速度会有比较明显的变化;第一个进程名称仍然是init;

CentOS7:Systemd,参考了MAC OS的启动逻辑开发一款新版的init程序;其可以以其自身独立完成整个操作系统的启动工作;也就是说,在开机并加载内核之后,只需要启动一个systemd进程就可以将其他各服务进程启动起来,从而引导整个系统启动;

  由此可以看出,centos7创建进程的方式是最快的,也就是为什么centos7开机速度快的根本原因。

  除了init进程之外,其他的各个进程都是由其父进程创建的;任何的进程的父子关系都保存在task struct中,每个子进程的生命周期也由父进程决定,于是会出现一种特殊情况,就是当父进程“死亡”之后,其子进程会一直存在于内存中,成为“僵尸”,这对系统来说必定是有害的。

  每个父进程通过fork()系统调用,复制自身的数据给子进程使用;这种复制方式不是立即复制,而是写时复制(CoW);所谓写时复制,就是只有进程空间的各段内容要发生改变时,才会将父进程的内容复制给子进程

   进程的优先级为0-139中的140个整数,其中1-99为实时优先级,数字越大优先级越高;在系统启动时启动的进程;而100-139为静态优先级,数字越小优先级越高;在用户执行某些应用程序的时候启动的进程;

  更改优先级的方法为使用nice值,nice值的范围为-20-19,默认的nice值为0,只有管理员才能使用负整数的nice值,以提升进程的优先级;而普通用户只能使用正整数的nice值,以降低进程的优先级;

  进程的类型有以下几种分类:

               按照进程的启动方式:

守护进程:

Daemon,通常是在系统引导的过程被启动的,与任何的终端无关;也可以通过终端启动;

用户进程:

用户登录到系统之后,通过终端启动的进程;


按照进程的运行位置:

前台进程:

在进程启动之后,进程一直占用标准输出或者标准输入或者同时占用标准输出和标准输入;

后台进程:

在进程启动之后,进程不占用标准输出和标准输入;


按照进程对于资源消耗:

CPU-Bond:非交互式的进程;

IO-Bond:编辑器等各种交互式进程;



  Linux系统上进程管理的相关命令:

    1,pstree,顾名思义,就是将子父进程以树的方式显式出来

    2,ps,报告一个当前进程的快照,其后接的选项有三种风格,UNIX,BSD,和GNU,以下是各选项的意义:

       

     BSD风格的选项:

a:显示所有与终端相关的进程;

x;显示所有与终端无关的进程;

u:显示发起进程的用户的账户名称;


常用的选项组合之一:aux


ps aux命令显示的结果中各字段的含义:

USER:进程的所有者

PID:进程标识符

%CPU:进程占用的CPU处理时间的百分比;

%MEM:进程占用的物理内存的百分比;

VSZ:虚拟内存集(可交换内存集)

RSS:常驻内存集

TTY:进程与哪个终端相关;?表示与终端无关;

STAT:

R:running,正在运行的进程;

S:interuptible sleeping,可中断的睡眠状态;

D:uninteruptible sleeping,不可中断的睡眠状态;Disk Block;

T:Trace/STOPPED,被跟踪/已停止;

Z:Zombie,僵死态;

+:前台进程

l:包含多线程的进程

<:高优先级进程

N:低优先级进程

s:session leader,有子进程的父进程;

START:进程开始执行的时候时间戳

TIME:进程累计的CPU占用时间;

COMMAND:启动进程的命令行参数;


UNIX风格的选项:

-e:显示所有进程

-f:显示完整格式的进程信息

-F:显示完整格式的进程信息,与-f几乎相同;


常用的选项组合之二:-ef

PPID:父进程PID

C:表示进程占用的CPU时间的百分比


常用的选项组合之三:-eF

SZ:虚拟内存集

RSS:常驻内存集

PSR:表示此进程在哪个CPU核心上运行;


-H:以层级机构显示进程的父子关系;

常用的选项组合之四:-eFH


o|-o field1,field2,...:以自定义字段的方式显示进程相关信息;

field:pid, ppid, ni, rtprio, psr, pcpu, stat, comm, user, tty, vsz, rss,...


常用的选项组合之五:-eo | axo field1,field2,...


  3,pgrep,pkill,根据进程名称或其他属性查看进行或向进程发送信号;

    

        pgrep [options] pattern

pkill [options] pattern


常用选项:

-u uid:显示进程的有效用户

-U uid:显示进程的真实用户

-t TERM:显示与指定的终端相关的进程

-l:显示进程名称

-a:显示进程的完整的命令行参数

  4,pidof,示指定进程名称对应的进程ID

  5,top:

    

  剩下的命令待续!

   

       


   

  



  

进程及进程的管理