1.进程和程序(process and program)

首先我们对进程作一明确定义:所谓进程是由正文段(text)、用户数据段(user segment)以及系统数据段(system segment)共同组成的一个执行环境。

程序只是一个普通文件,是一个机器代码指令和数据的集合,这些指令和数据存储在磁盘上的一个可执行映象(executable p_w_picpath)中,所以,程序是一个静态的实体。linux是一个多任务操作系统,也就是说,可以有多个程序同时装入内存并运行,操作系统为每个程序建立一个运行环境即创建进程,每个进程拥有自己的虚拟地址空间,它们之间互不干扰,即使要相互作用(例如多个进程合作完成某个工作),也要通过内核提供的进程间通信机制(ipc)。linux内核支持多个进程虚拟地并发执行,这是通过不断地保存和切换程序的运行环境而实现的,选择哪个进程运行是由调度程序决定的。

进程是一个动态实体,进程实体由三个独立的部分组成:

(1)正文段(text):存放被执行的机器指令。这个段是只读的(所以,在这里不能写自己能修改的代码),它允许系统中正在运行的两个或多个进程之间能够共享这一代码。例如,有几个用户都在使用文本编辑器,在内存中仅需要该程序指令的一个副本,他们全都共享这一副本。

(2)用户数据段(user segment):存放进程在执行时直接进行操作的所有数据,包括进程使用的全部变量在内。显然,这里包含的信息可以被改变。虽然进程之间可以共享正文段,但是每个进程需要有它自己的专用用户数据段。例如同时编辑文本的用户,虽然运行着同样的程序__编辑器,但是每个用户都有不同的数据:正在编辑的文本。

(3)系统数据段(system segment):该段有效地存放程序运行的环境。事实上,这正是程序和进程的区别所在。如前所述,程序是由一组指令和数据组成的静态事物,它们是进程最初使用的正文段和用户数据段。作为动态事物,进程是正文段、用户数据段和系统数据段的信息的交叉综合体,其中系统数据段是进程实体最重要的一部分,之所以说它有效地存放程序运行的环境,是因为这一部分存放有进程的控制信息。系统中有许多进程,操作系统要管理它们、调度它们运行,就是通过这些控制信息。linux为每个进程建立了task_struct数据结构来容纳这些控制信息。

进程和程序(process and program)

如图所示,程序与进程的关系

2.工作管理(job control)

工作管理就是当我们登录系统取得bash shell 之后,在单一终端机下同时进行多个工作的行为管理。bash只能管理自己的工作,不能管理其他bash的工作,此外,工作又分为前台和后天,在后天的工作状态分为“暂停”与“运行”。

2.1&:可以直接将命令丢到后台执行

例如我们将/etc目录进行备份成为/tmp/etc.tar.gz,并丢到后台。

2.2"&"代表丢到后台,[1]代表工作号码,“2448”代表PID

ctrl+z:可以将目前的工作丢到后台暂停,如我编辑/etc/fstab后按ctrl+z,如下所示

[2]代表第二个工作,Done表示完成,Stopped表示停止

2.3查看目前后台的状态:

[root@lys ~]# jobs

  • -l  列出job number和命令,pid

  • -r  仅列出正在运行的job

  • -s  仅列出停止状态的job

2.4将后台工作拿到前台处理:fg

%2就是取出2号工作,其中“+”代表默认的取用工作,“-”次取用工作。如果fg后不带参数,就默认取用“+”工作。

2.5让工作在后天的状态变成运行态:bg

可以看到通过bg命令可以使工作由STOPPED变成RUNNING。 

2.6管理后台的工作:kill

[root@lys ~]# kill 

  • -l  列出目前kill能够使用的信号

  • -1  重新读取一次参数的配置文件

  • -9  立刻强制删除一个工作

  • -15 以正常的流程结束一个工作

kill -l 命令可以查看所有single

3.进程的查看

3.1ps:将某个时间点的进程运行情况选取下来

ps [options]

  1. -A  :所以进程均显示出来

  2. -a  :与terminal无关的进程

  3. -u  :有效用户的进程

  4. x   :列出完整信息

  5. l  :较详细的列出pid的信息

  6. j  :工作的格式

  7. -f  

3.2将系统的PID及相关信息列出(只与自己的bash有关)

  • F:说明这个进程的权限,常见有4和1,4代表此进程的权限为root,1代表此进程仅可进行复制而无法执行

  • S:代表进程的状态

    R:(running) 该进程正在运行

    S:(sleep)  睡眠状态

    D:不可唤醒状态

    T:(stop) 停止状态

    Z:(zombie) “僵尸状态”

  • UID/PID/PPID :代表该进程的UID ,PID,PPID

  • C:代表cpu使用率

  • PRI/NI: priority/nice的缩写,代表进程的优先级,数值越小越先执行

  • ADDR/SZ/WCHAN:都与内存有关

  • TTY:登录者的终端机位置

  • TIEM:使用cpu的时间

  • CMD:当前命令

3.3查看系统的所有进程

个字段的意义为:

  • USER:该进程属于哪个用户

  • PID: 该进程的ID号

  • %CPU:该进程cpu使用率

  • %MEM:进程内存占有率

  • VSZ:进程使用的虚拟内存

  • RSS:进程使用的固定内存

  • TTY:进程使用的终端

  • STAT:进程的状态

  • START:进程被触发的时间

  • TIME:进程使用cpu的时间

  • COM:该进程的命令

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

3.4动态的查看进程的变化

相对于ps是选取某一时刻的进程状态,top则可以动态的查看进程的状态

top - display Linux processes,相关参数如下

  • -d :后面接秒数 默认是5s

  • -b :以批次的方式执行top

  • -n :与-b搭配 代表几次

  • -p :指定pid查看进程

在top执行的过程中还可以使用的按键命令:

?:显示在top执行过程中可以使用的命令

P:以cpu使用资源排序

M:以内存使用资源排序

N:以pid排序

T:以占用cpu时间排序

K:给与某个进程信号

r:给与某个进程重新定义nice值

q:离开top

第一行显示的信息等同于uptime

[root@lys ~]# uptime 

 13:49:18 up 40 min,  2 users,  load average: 0.00, 0.01, 0.05

13:49:18 当前时间
up 40 min 系统运行时间
2 users 当前登录用户数
load average: 0.00, 0.01, 0.05 系统负载,三个数值1,5,15分钟平均值

第二行进程数与状态

217 total 进程总数
2 running 运行进程数量
215 sleeping 睡眠状态进程数
0 stopped 停止状态进程数
0 zombie 僵尸进程数

第三行cpu信息

0.0 us 占用cpu百分比
0.5 sy 内核空间占用cpu百分比
0.0 ni
99.0 id
0.0 wa
0.0 hi
0.5 si
0.0 st

第四行物理内存信息

1010340 total 物理内存总量
725424 free 空闲物理内存
129988 used 已使用物理内存
154928 buff/cache 缓存区总量

第五行交换内存信息

 2097148 total 交换内存的总量
 2097148 free 空闲交换内存
 0 used 已使用交换内存
727944 avail Mem 可用内存
另外一个可以动态查看进程状态的命令htop也非常实用

htop: 

交互式命令:

u: 过滤仅显示选定用户的进程;

s: 跟踪选定的进程所发起的系统调用;

l: 显示选定进程所打开的文件;

t: 显示进程的层次结构;

a: 设定进程的cpu亲缘性;(将选定的进程绑定在指定的CPU上)

选项:

-d #: 延迟时长

-u USERNAME: 仅显示指定用户的进程;

-s COLUMN: 根据指定的字段进行排序;

glances: 常用选项

glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]

-b: 以Byte/s为单位显示网卡设备数据交换速率;

-d: 关闭磁盘I/O功能模块;

-f /PATH/TO/SOMEFILE:设置输出文件的位置及格式;

-o {HTML|CSV}:

-m: 关闭mount功能模块

-n: 关闭网络功能模块

-r: 关闭进程列表功能模块

-t #: 指定延迟时长,默认为3秒;

-1:单独显示每颗CPU相关负载数据信息;

通过h可以获取帮助

4.进程的管理 

4.1进程之间是相互控制的,那么进程是如何相互管理?其实是通过给与一个信号(signal)去告知进程让它做什么。系统到底有多少signal,可以使用kill -l 查看。

[root@lys ~]# kill -l

 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP

 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1

11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM

16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP

21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ

26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR

31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3

38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8

43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13

48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12

53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7

58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2

63) SIGRTMAX-1 64) SIGRTMAX

重要的如下

1 SIGHUP 启动被终止的进程,可让该pid重新读取自己的配置文件
2 SIGINT 中断一个进程
9 SIGKILL 强制中断一个进程
15 SIGTERM 以正常的流程结束一个进程
17 SIGSTOP 暂停一个进程

结束一个进程可以使用kill或者killall

  • kill -signal pid

  • killall -signal 命令名称

NICE值:当nice值为负值时,那么该程序就会降低PRI值,即会变得优先被处理。nice值的可调整范围-20~19。root可以随意更改自己或他人的nice值,而一般以后仅可以调整自己的nice值范围0~19。

  • nice:新执行的命令及给与一个nice值

  • [root@lys ~]# nice -n -3 vi &   //-n 后面接数值范围-20~19

  • [root@lys ~]# ps -l

    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD

    4 S     0  2991  2987  0  80   0 - 29132 wait   pts/1    00:00:00 bash

    4 T     0  3029  2991  0  77  -3 - 31577 signal pts/1    00:00:00 vi

    0 R     0  3032  2991  0  80   0 - 30319 -      pts/1    00:00:00 ps

  • renice:给已存在进程的nice重新赋值

  • [root@lys ~]# renice 10 3029

    3029 (process ID) old priority -3, new priority 10

  • [root@lys ~]# ps -l

    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD

    4 S     0  2991  2987  0  80   0 - 29132 wait   pts/1    00:00:00 bash

    4 T     0  3029  2991  0  90  10 - 31577 signal pts/1    00:00:00 vi

    0 R     0  3034  2991  0  80   0 - 30319 -      pts/1    00:00:00 ps