一、进程

1、什么是进程

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

        在Linux系统当中,触发一个事件,系统会将他定义成一个进程,运行者的权限与属性信息,程序的代码和所需的数据信息都会被加载到内存,内核会给进程分配一定的内存空间,并且给予这个进程一个ID,这个ID 我们称之为PID ,即进程号,从此以后这个PID 就能在系统上进行一些特定操作。进程的拥有者是是该进程的发起者。

2、进程的创建

init:第一个进程

父子关系

进程:都由其父进程创建,CoW

fork(), clone()

3、进程的优先级

3.1系统优先级:数字越小,优先级越高  

   0-139(CentOS4,5)

   各有140个运行队列和过期队列

   0-98,99(CentOS6)

   pri 查看当前进程的优先级

3.2实时优先级: 99-0 值最大优先级最高 

   rtprio 查看实时优先级

3.3nice值:-20到19,对应系统优先级100-139或99 

   nice 查看当前进程的nice值

3.4 Big O:时间复杂度,用时和规模的关系

  O(1), O(logn), O(n)线性, O(n^2)抛物线, O(2^n)

4、进程被内核调度过程中的状态

4.1 运行态:running(R)

4.2 就绪态:ready

4.3 睡眠态:

     可中断:interruptable(S)

     不可中断:uninterruptable(D)

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

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

有些进程状态之后会有以下字母:

                   +: 前台进程,占据着某终端

                   l: 多线程进程

                   L:内存分页并带锁

                   N:低优先级进程

                   <: 高优先级进程

                   s: session leader,会话(子进程)发起者

5、进程的分类

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

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

   注意:两者可相互转化

6、进程的管理

Linux系统状态的查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup

6.1进程的查看工具

6.1.1 pstree 进程状态

6.1.2 ps 查看进程信息(常用组合方式)

     ps -ef以完整的信息显示所有的进程信息进程管理工具

     ps -axo 显示特定的信息如pid 、comm、%cpu、%mem、state 、tty、euser、ruser

     ps -C f1.sh

6.1.3 pgrep进程搜索

     ps选项|其他命令

[root@centos6 ~]# pgrep -lu root  知道用户名的进程
[root@centos6 ~]#pgrep -P 1800 显示子进程
[root@centos6 ~]#pgrep -a "vi.*" 支持正则
[root@centos6 ~]#pgrep -a "bash"   显示完整格式的进程名

6.1.4按确切的程序名称显示: /sbin/pidof

[root@centos6 ~]# pidof bash 查看程序对应的进程编号

6.2系统监控工具

   ps 显示的只是系统某一时间点的进程状态信息,在实际应用中,我们需要动态的监控进程的运行状态,此时就需要另一个命令top,htop是增强版的top

6.2.1top

     -d指定刷新时间间隔,默认为3s

     -b全部显示所有进程

     -n刷新多少次后退出

wKioL1m6i-HSX71bAABJZGC0Y9o525.png

6.2.2 htop

     -d指定延迟时间

     -u仅显示指定用户进程

     -s 以指定字段排序

子命令

     s跟踪选定进程的系统调用

     l显示选定进程打开的文件列表

     a将选定的进程绑定至某指定CPU核心

     t显示进程树

wKiom1m6jCKCmmz0AABKbZ37RsE202.png

6.2.3 glances 用于监控    

   C/S模式下运行glances命令

   服务器模式:

     glances -s -B IPADDR     IPADDR: 指明监听的本机哪个地址

   客户端模式:

     glances -c IPADDR       IPADDR:要连入的服务器端地址     

6.2.4 dstat 系统资源统计,代替vmstat,iostat用于监控系统运行状况并且用于基准测试和故障排除

6.3 进程的管理工具

6.3.1kill

向进程发送一些控制信号,来完成对进程的管理控制,每个信号对应一个数字

信号名称以SIG开头(可省略),不区分大小写

显示当前系统可用信号: kill –l,trap -l

常用信号:man 7 signal

      1) SIGHUP: 无须关闭进程而让其重读配置文件

      2) SIGINT: 中止正在运行的进程;相当于Ctrl+c

      3) SIGQUIT:相当于ctrl+\

      9) SIGKILL: 强制杀死正在运行的进程

      15) SIGTERM:终止正在运行的进程

      18) SIGCONT:继续运行

      19) SIGSTOP:后台休眠

指定信号的方法:

(1) 信号的数字标识:1, 2, 9

(2) 信号完整名称:SIGHUP

(3) 信号的简写名称:HUP

二、作业管理

  通过对进程的学习我们知道在登录系统之后的每一个工作进程都是当前bash 的子进程,那么每一个子进程能否同时运行呢?显然是可以的,此时我们就需要对这些作业进行管理,将一部分放在后台运行,同时在前台编辑文件,完成后把作业调回前台运行

前台作业:通过终端启动,且启动后一直占据终端;

后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)

1、如何让作业运行于后台?

(1) 运行中的作业: Ctrl+z

(2) 尚未启动的作业: COMMAND &

2、如何让作业与终端无关?

   后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭

后台作业。如果希望送往后台后,剥离与终端的关系

nohup COMMAND &将对应的作业任务放在后台执行

screen;COMMAND

3、作业控制命令

fg [[%]JOB_NUM]:把指定的后台作业调回前台

bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行

kill [%JOB_NUM]: 终止指定的作业

wKiom1m6h5qjxwq2AAAW7Sp1lqA125.png

4、并行运行

同时运行多个进程,提高效率

方法1(编写脚本)

vi all.sh

f1.sh&

f2.sh&

f3.sh&

方法2

(f1.sh&);(f2.sh&);(f3.sh&)

方法3

{ f1.sh& f2.sh& f3.sh& }

例:并行执行

{ ping -c3 127.1 ; ping 127.2 ; } & { ping -c3 127.3 ; ping 127.4 ; }&