`

ma系列之-22-进程 ps top 作业管理

 
阅读更多

 

 

0  进程相关概念和线程

 

内核负责追踪每一个进程的状态信息  
内核数据结构 task structure ,里面保存每个进程的数据结构,比如数据扇区位置,父进程号,当前进程号,操作者等

在某一时刻,内存是被分成两段的,一段是内核空间,一段是用户空间,用户空间里面有多少个用户进程,
而每个进程对应的结构都会在内核空间中有相对应的一段来保存,CPU的寄存器会保存每个进程task structure的地址位置。
每个中间挂起的进程在重新加载到CPU的时候,CPU会根据寄存器存储的进程task structure地址找到task structure,
然后进而得到task structure内存储的当前启动进程对应在磁盘的数据位置和开始执行位置,这个过程就是恢复现场。

程序: 可执行文件,位于磁盘上
进程: 程序被装载入内存,在内存中提供的特定区域内存放需要的数据和指针,是一个逻辑概念,而不是一个实体

堆内存: 过一会打开一个文件需要创建一个空间,过一会打开一个文件需要创建一个空间,根据需要不停动态申请内存空间,就叫做堆内存。
栈: 本地变量

每一次内核装载进程的时候,必须要把进程的页面翻译成物理内存的叶匡(真实分配给进程逻辑连续内存对应的分散物理内存地址区域)
将进程页面翻译成物理内存叶匡的过程是交给MMU来操作,你可以联想记忆为:
页面 叶匡  MMU
域名 IP地址 路由器


进程上下文切换: 就是不同进程不断的装载到CPU和退出CPU的过程

 

进程在内存中区域:



 

 

 

1 进程状态:

 

进程生命周期: 类比于人一天24小时,睡觉时间,娱乐时间,工作时间等,因此执行时间和挂起时间组成了一个进程的生命周期
多核CPU: 仅仅是在多进程下,将进程分配到不同的CPU下排队执行,而不仅仅是放在一个CPU下来排队,这样来解决了每个进程的处理速度。

 

进程状态截图如下:


 

部分解释:

进程睡眠: 因为需要的资源没有正常获取到 或者没有其他更多事情可以去做了  比如当前进程分配给CPU4ms,读取一个文件需要3s 那么进程会睡眠
Uninterruptible sleep: 不可中断的睡眠  就是当前请求的资源比如文件加载到内存耗时较长,即使当前CPU继续分配时间片给当前进程 因为需要文件还没有加载进来因此进程依旧不可唤醒
Interruptible sleep:可中断睡眠  随时来请求 随时能唤醒  比如处理完当前请求后暂时还没有更多请求下,这种sleep就是可中断

Zombie: 僵死进程,进程正常进行,也结束掉了,但是占用的内存没有释放,在这种情况下,会由它的父进程来收尸
进程结束: 1占用内存空间释放 2task structure内对应进程数据删除

进程父子关系:
linux的进程都是父子关系,祖先进程是 init进程(联想与上帝),上帝照着自己的样子clone出子孙,这就是 具体任务子进程。 init进程是由内核来生成
eg:
[root@chinadaas13 ~]# pstree
init─┬─abrtd
     ├─acpid
     ├─atd
     ├─auditd─┬─audispd─┬─sedispatch
     │        │         └─{audispd}
     │        └─{auditd}
     ├─automount───4*[{automount}]
     ├─bonobo-activati───{bonobo-activat}

 

 

2 进程和多线程关系:

 

多线程: 以数据库为例,三个人访问同一个表,如果处理成三个进程,那么在每个进程的内存空间中,这个表的数据都要放在内存中,这样就有了三份同样的数据
         实际消耗了很多内存空间,这就是进程之间不共享数据的真实案例。
		 如果是线程,那么这三个线程共享同一份数据,在一个进程中维系多个线程,需要在这些线程之间同步来平均这些资源,并监控每个资源是否被加锁(防止死锁)

 


 

3 进程优先级:

 

 

进程优先级:
	0-139, 数字越小,优先级越高。
100-139:用户可控制
0-99:内核调整的

进程优先级分配有如下几种方式:
O:
 O(1): 固定不变的一个横线 联想于 0°直线    y=1在四象限的表示
 O(n): 所需要的时间长度随着队列长度而发生线性增长,可预测 可接受 联想于 45°直线   y=n 随着n增加而增加的线
 O(logn): y=logn 的线
 O(n^2): y=n平方的线
 O(2^n): y=2的n次方的线

优先级高,那么进程能够获得更高的运行时间,更有限获得CPU运行机会。

每个进程都有个nice值,范围在 -20--19之间,对应的进程数值为 100-139, 因此提高nice数值,就直接提高了进程优先级值,从而给别的进程让出了CPU执行权。
即nice值越小,优先级越高。
默认情况下,每个进程的nice数值为0,
nice联想于 人好的话,那么这个人就把机会让给别人。

 

 4 进程号和/proc

 

init进程号为1是固定的
其下每一个数字代表一个pid为对应数字的进程,每一个进程号码都是唯一的,即使这个进程退出,其他进程也不会占用这个号码,因此下面展示进程号是不连续的
[root@chinadaas13 ~]# ls /proc   器下的信息都是当前当前内核信息中的映射,而进入每个号码下面在ls的信息是内核中某个参数被映射成了文件,因此这下面东西是伪文件系统
1     140    179   1995   234    2533  258   2621   2740  29     32    3752  4624  643   8503
.... 
[root@chinadaas13 ~]# ls /proc/140 
ls: 无法读取符号链接/proc/140/exe: 没有那个文件或目录
attr       clear_refs       cwd      fdinfo    maps       mountstats  oom_score      root       smaps  status
autogroup  cmdline          environ  io        mem        net         oom_score_adj  sched      stack  syscall
auxv       coredump_filter  exe      limits    mountinfo  numa_maps   pagemap        schedstat  stat   task

 

 

5 进程相关命令ps pidof  pgrep  pstree:

 

ps: Process State 查看进程状态的专用命令
 SysV风格:每个选项都要加-来分隔
 BSD风格:
 
 a: 所有与终端有关的进程 
 u: 显示进程的启动用户
 x: 所有与终端无关的进程
 
进程的分类:
 跟终端相关的进程,即通过命令行进入的
 跟终端无关的进程

eg:
[root@chinadaas13 ~]# ps aux | head
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  19360  1536 ?        Ss   Oct22   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S    Oct22   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    Oct22   0:00 [migration/0]
root         4  0.0  0.0      0     0 ?        S    Oct22   0:02 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S    Oct22   0:00 [migration/0]
root         6  0.0  0.0      0     0 ?        S    Oct22   0:00 [watchdog/0]
root         7  0.0  0.0      0     0 ?        S    Oct22   0:00 [migration/1]
root         8  0.0  0.0      0     0 ?        S    Oct22   0:00 [migration/1]
root         9  0.0  0.0      0     0 ?        S    Oct22   0:02 [ksoftirqd/1]
对上述结果的解释
VSZ: 虚拟内存集
RSS: 常驻内存集
TTY:关联到哪个终端上去, ?表示和终端无关
TIME: 运行时真正占用CPU的时长
COMMAND:哪个命令占用的进程, []表示是一个内核线程
STAT:进程状态
进程状态字段含义:
 D:不可中断的睡眠
 R:运行或就绪
 S:可中断的睡眠
 T:停止
 Z:僵死
 
 <:高优先级进程
 N: 低优先级进程
 +:前台进程组中的进程
 l: 多线程进程
 s: 会话进程首进程


ps 
 -elF
 -ef
 -eF

[root@chinadaas13 ~]# ps -el | head     e表示所有进程
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0     1     0  0  80   0 -  4840 poll_s ?        00:00:01 init
1 S     0     2     0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd
1 S     0     3     2  0 -40   - -     0 migrat ?        00:00:00 migration/0
1 S     0     4     2  0  80   0 -     0 ksofti ?        00:00:02 ksoftirqd/0
1 S     0     5     2  0 -40   - -     0 cpu_st ?        00:00:00 migration/0
5 S     0     6     2  0 -40   - -     0 watchd ?        00:00:00 watchdog/0
1 S     0     7     2  0 -40   - -     0 migrat ?        00:00:00 migration/1
1 S     0     8     2  0 -40   - -     0 cpu_st ?        00:00:00 migration/1
1 S     0     9     2  0  80   0 -     0 ksofti ?        00:00:02 ksoftirqd/1
对上述展示的解释
PRI: 优先级
NI: nice数值



ps -o PROPERTY1,PROPERTY2  -o表示 指定后面要专门显示的参数值
eg: 
[root@chinadaas13 ~]# ps -o pid,comm,ni
  PID COMMAND          NI
 8890 bash              0
31157 ps                0


 
 
pstree: 显示当前系统上的进程树
pgrep:eg pgrep bash 找进程中有bash的进程
pidof: 根据程序名称,查找其相关进程的ID号;
[root@chinadaas13 ~]# pidof java
31586 31581 29602 21179 18000 15917 9385 7846

 

 

6 进程命令之 top:

 

top:类似于window的任务管理器,间隔5秒不停刷出
[root@chinadaas13 ~]# top  
top - 14:40:33 up 7 days, 37 min,  4 users,  load average: 0.12, 0.23, 0.25
Tasks: 684 total,   1 running, 683 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,  0.5%sy,  0.0%ni, 99.1%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  65961460k total, 14694752k used, 51266708k free,   352200k buffers
Swap: 20479992k total,        0k used, 20479992k free,  1353244k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                      
15305 root      20   0 15428 1732  952 R  1.0  0.0   0:00.34 top                                                          
 9385 root      20   0 4052m 308m  30m S  0.7  0.5   9:26.16 java                                                         
15917 mapred    20   0 4710m 146m  14m S  0.7  0.2  15:34.41 java                                                         
18000 root      20   0 17.9g 317m   9m S  0.7  0.5   0:17.52 java    

如下是对上述显示结果解释:
top后为当前时间
up后时间表示运行时长,从上一次启动到这一刻为止时长
4 users表示登录用户
load average: 0.12, 0.23, 0.25 平均负载,过去1,5,15分钟下的队列平均长度,长度越小,则CPU负载越低。
Tasks: 所有进程相关信息, 一个在运行,683个在睡觉,0个停止,0个僵死
Cpu(s): 多个CPU平均值 us用户空间用户进程占据cpu的百分比  sy系统空间占据cpu的百分比    ni调整nice值影响的cpu比例 id空闲百分比  wa等待io完成所占用的时间 hi硬件中断占据的时间
		si 软中断占据的时间  st被偷走的时间 
 
上述结果 可以通过 uptime来简单实现:
[root@chinadaas109 ~]# uptime
 00:26:56 up 100 days,  5:16,  4 users,  load average: 0.21, 0.32, 0.26


PR: 表示优先级



top: 部分字段解释如下, 只需要在 top输入的显示结果后 在输入M/P/T 命令 就会自动按照内存大小排序展示
 M: 根据驻留内存大小进行排序
 P:根据CPU使用百分比进行排序
 T: 根据累计时间进行排序
 
 l: 是否显示平均负载和启动时间    只需要在 top输入的显示结果后 在输入l/t/m 命令 就会自动显示或者隐藏相关项数据
 t: 是否显示进程和CPU状态相关信息
 m: 是否显示内存相关信息
 
 c: 是否显示完整的命令行信息(即完整命令路径)   
 q: 退出top
 k: 终止某个进程


top 
 -d: 指定延迟时长,单位是秒
 -b: 批模式
 -n #:在批模式下,共显示多少批

 

 

7 进程间通信和 kill :

 

进程间通信方式(IPC: Inter Process Communication)
 1 共享内存 , 一个进程向内存中写,另一个进程从这个内存中读
 2 信号: Signal 一个进程向另一个进程发送信号来控制另外一个进程
 3 Semaphore 旗语
 
以方式2信号为例, kill通常都是用于进程之间发送信号 
[root@chinadaas13 ~]# help kill
kill: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
    Send a signal to a job.
[root@chinadaas13 ~]# 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
	
kill中重要的几个信号:
1:SIGHUP: 让一个进程不用重启,就可以重读其配置文件,并让新的配置信息生效;
2: SIGINT:Ctrl+c: 中断一个进程
9: SIGKILL:杀死一个进程, 并强制立马执行,即使当前进程有比如写入文件操作,那么也立即执行,立马杀死
15: SIGTERM:终止一个进程, 默认信号,杀死之前,让这个进程先交代后事,然后处理完后事后再弄死这个进程

  
指定一个信号:
 信号号码:eg---> kill -1
 信号名称:eg---> kill -SIGKILL
 信号名称简写:eg---> kill -KILL

使用如下:
kill PID
killall COMMAND进程名    killall httpd 杀死所有httpd,取代了一个个的来执行httpd对应的进程号的杀死

 

 8 调整nice值:


调整已经启动的进程的nice值:
renice NI PID


在启动时指定nice值:
nice -n NI COMMAND

 

 

9  前台作业 后台作业:

 

 Ctrl+z: 把正在前台的作业送往后台
 COMMAND &:让命令在后台执行
 
bg: 让后台的停止作业继续运行   backgroud
 bg [[%]JOBID]


jobs: 查看后台的所有作业
 作业号,不同于进程号
 +:命令将默认操作的作业
 -:命令将第二个默认操作的作业
 
fg: 将后台的作业调回前台  frontgroud
 fg [[%]JOBID]

 

 

10 vmstat 和查看系统内存

 

虚拟内存  系统状态查看命令


[root@chinadaas109 ~]# vmstat 1  1表示每间隔1秒钟显示一次  
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0 8400188 11107092 695044 60202828    0    0    10    54    0    0  2  1 96  0  0

 r: 运行队列长度
 b: 阻塞队列长度
 swpd: 交换空间大小
 free:空闲内存
 buff: 缓冲
 cache: 缓存
 swap: 动态
 si: 从物理空间有多少页面到swap
 so: 从物理空间到swap导出多少
 bi: 有多少磁盘块调入到内存中
 bo: 有多少磁盘块从内存中同步到磁盘上
 in: 中断个数
 cs: context switch 上下文进程切换次数
 us: 用户空间占据CPU百分比
 sy: 内核空间占据CPU百分比
 id:空闲 
 wa: 等待IO
 st: 被偷走的CPU时间
 
# vmstat 1 5 表示间隔1秒显示一次 一共显示5次 
 
 
 
[root@chinadaas109 ~]# cat /proc/meminfo  
MemTotal:       132089436 kB
MemFree:        53439820 kB
Buffers:          702300 kB
Cached:         61056300 kB
SwapCached:        44716 kB
Active:         17207024 kB
Inactive:       59399112 kB
Active(anon):    9954564 kB
Inactive(anon):  4893312 kB
Active(file):    7252460 kB

 

  • 大小: 95.8 KB
  • 大小: 67.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics