inux进程
进程的概念
当一个系统启动时,刚开机是第一个运行的是内核代码!先把内核放到cpu上运行,等内核控制和掌管了一切,有内核启动进程!然后创建第一个进程 init进程 内核空间 用户空间也都已被创建成功!后期的一切管理工作都由init来负责 init不能代表系统完成一些内核特权的执行!但由他负责向内核提交 他是总的由用户管理的总进程,它会照自己样子创建一个子进程,除了init以外,所有的进程都是由其父进程创建! init是由 上帝(kernel)创造出来的 父进程如何创建子进程,是 fork 自身而来!父进程在创建子进程时是使用同一段内存空间!
-
内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能
-
Process: 运行中的程序的一个副本,是被载入内存的一个指令集合
-
进程ID(Process ID,PID)号码被用来标记各个进程
-
UID、GID、和SELinux语境决定对文件系统的存取和访问权限,
-
通常从执行进程的用户来继承
-
存在生命周期
-
Linux内核存储进程信息的固定格式:task struct
-
多个任务的的task struct组件的链表:task list
进程创建:
init:第一个进程 父子关系 进程:都由其父进程创建 fork(), clone()
进程优先级:
系统优先级:数字越小,优先级越高 0-139(CentOS4,5) 各有140个运行队列和过期队列 0-98,99(CenOS6) 实时优先级: 99-0:值最大优先级最高 Nice值:-20,19对应系统优先级100-139或99 Nice值: -20,19
Big O:时间复杂度,用时和规模的关系
O(1), O(logn), O(n)线性, O(n^2)抛物线, O(2^n)
进程内存:
-
Page Frame: 页框,用存储页面数据,存储Page 4k
-
LRU: Least Recently Used 近期最少使用算法,释放内存物理地址空间和线性地址空间
-
MMU:Memory Management Unit负责转换线性和物理地址
事实上应用程序是不可能访问硬件(包括内存),内核就是为了完成资源分配的,会把内存切割成固定大小的片段分配给各个应用使用大小为 4K! 内核分配多个不连续的内存,并把它们假装成连续的(用一个中间层!使应用假装跑在连续的内存中)
IPC: Inter Process Communication 进程之间的通信
-
同一主机上:
signal 发信号 shm: shared memory 使用共享内存,读其他进程的内存空间 semerphor 发一个短小的信号!
-
不同主机上:
rpc: remote procecure call 远程过程调用 socket: 基于套接字通信! 首先创建一个 socket 文件 :一端保存着自己的端口,还保存有对方的通信端口 进程关闭了就把这个关闭
Linux内核:抢占式多任务
进程类型:
-
守护进程: 在系统引导过程中启动的进程,跟终端无关的进程;
-
前台进程:跟终端相关,通过终端启动的进程
注意:也可把在前台启动的进程送往后台,以守护模式运行;
进程状态:
-
运行态:running
-
就绪态:ready
-
睡眠态:
-
可中断:interruptable
-
不可中断:uninterruptable
-
停止态:暂停于内存中,但不会被调度,除非手动启动之;stopped
-
僵死态:zombie
进程的分类:
CPU-Bound:CPU密集型,非交互 IO-Bound:IO密集型,交互
系统进程管理工具
Linux系统状态的查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup
pstree命令
pstree命令以树状图的方式展现进程之间的派生关系,显示效果比较直观。
显示当前所有进程的进程号和进程id
pstree -p
[root@qzx /etc/yum.repos.d ]# pstree -p systemd(1)─┬─ModemManager(789)─┬─{ModemManager}(807) │ └─{ModemManager}(818) ├─NetworkManager(44463)─┬─dhclient(47671) │ ├─dhclient(47742) │ ├─{NetworkManager}(44464) │ └─{NetworkManager}(44467) ├─abrt-watch-log(828)
显示所有进程的所有详细信息,遇到相同的进程名可以压缩显示。
pstree -a
ps 列举进程
适用ps来查看进程信息
语法 ps [OPTION]…
支持三种选项:
-
UNIX选项 如-A -e
-
BSD选项 如a
-
GUN选项 如—help
• 默认显示当前终端中的进程
• a 选项包括所有终端中的进程
• x 选项包括不链接终端的进程
• u 选项显示进程所有者的信息
• f 选项显示进程的父进程
• o 属性… 选项显示定制的信息:
pid、comm、%cpu、%mem、state、tty、euser、ruser
常用组合之一:aux
VSZ:虚拟内存集; RSS:Resident Size,常驻内存集; STAT: R:running S:interruptable sleeping D:uninterruptable sleeping T:Stopped Z:zombie +:前台进程 l:多线程进程 N:低优先级进程 <:高优先级进程 s:session leader
常用组合之二:-ef
-
-e:显示所有进程
-
-f:显示完整格式的进程信息
-
-F:显示完整格式的进程信息;
-
C: cpu utilization
-
PSR:运行于哪颗CPU之上
-
-H:以层级结构显示进程的相关信息;
常用组合之三:-eFH
常用组合之四:-eo, axo
o field1, field2,...:自定义要显示的字段列表,以逗号分隔; 常用的field:pid, ni, pri, psr, pcpu, stat, comm, tty, ppid, rtprio ni:nice值; priority:priority, 优先级; rtprio:real time priority,实时优先级;
搜索进程
最灵活:ps 选项 | 其它命令
按预定义的模式:pgrep
pgrep [options] pattern
-u uid: effective user,生效者-U uid: real user,真正发起运行命令者 -t terminal: 与指定终端相关的进程 -l: 显示进程名 -a: 显示完整格式的进程名 -P pid: 显示指定进程的子进程 按确切的程序名称:/sbin/pidof $pidof bash
uptime
[root@LinServ-1 ~]# uptime 15:31:30 up 127 days, 3:00, 1 user, load average: 0.00, 0.00, 0.00 15:31:30 //系统当前时间 up 127 days, 3:00 //主机已运行时间,时间越大,说明你的机器越稳定。 1 user //用户连接数,是总连接数而不是用户数 load average: 0.00, 0.00, 0.00 // 系统平均负载,统计最近1,5,15分钟的系统平均负载
显示当前时间,系统已启动的时间、当前上线人数,系统平均负载(1、5、10分钟的平均负载,一般不会超过1)
系统平均负载:
指在特定时间间隔内运行队列中的平均进程数。
如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。
如果linux主机是1个双核CPU的话,当Load Average 为6的时候说明机器已经被充分使用了。
top:
排序:
-
P:以占据的CPU百分比,%CPU
-
M:占据内存百分比,%MEM
-
T:累积占据CPU时长,TIME+
首部信息显示:
-
uptime信息:l命令
-
tasks及cpu信息:t命令
-
cpu分别显示:1 (数字)
-
memory信息:m命令
选项:
-
-d #:指定刷新时间间隔,默认为3秒;
-
-b:以批次方式显示;
-
-n #:显示多少批次;
退出命令:q
修改刷新时间间隔:s
终止指定进程:k
保存文件:W
%Cpu(s):对应的那一横栏:
us:用户空间
sy:内核空间
ni:调整nice时间
id:空闲
wa:等待IO时间
hi:硬中断
si:软中断(模式切换)
st:虚拟机偷走的时间
—
黑底的栏位信息简介
PID (Process Id ) : 任务的进程ID
PPID (Parent Process Pid) : 父任务的进程ID
RUSER (Real User Name) : 任务的所有者真实名称
UID (User Id) : 任务所有者ID
USER (User Name) : 任务所有者名称
GROUP (Group Name) : 任务所有者群组名
TTY (Controlling Tty) : 终端
PR (Priority):优先级
%CPU (CPU usage) : CPU使用率
%MEM (Memory usage (RES)) : 内存使用率
S (Process Status) : 进程状态
TIME+ (CPU Time, hundredths) : CPU时间,精确到秒
htop命令:需从Fedora-EPEL源安装
http://172.16.0.1/fedora-epel/7/x86_64
选项:
-
-d #: 指定延迟时间;
-
-u UserName: 仅显示指定用户的进程;
-
-s COLUME: 以指定字段进行排序;
子命令:
-
s: 跟踪选定进程的系统调用;
-
l: 显示选定进程打开的文件列表;
-
a:将选定的进程绑定至某指定CPU核心;
-
t: 显示进程树 或者 F5
vmstat命令:
-
Report virtual memory statistics
vmstat 2 10 表示 命令每2秒钟刷新一次,刷新10次
pmap命令:进程对应的内存映射表
语法 pmap [选项] pid […]
-x: 显示详细格式的信息;
#pmap 1 查看 1 号进程的系统映射 另外一种实现: # cat /proc/PID/maps
glances命令:EPEL源
glances
[-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P
password] [—password] [-t refresh] [-f file] [-o output]
常用选项:
-
-b: 以Byte为单位显示网卡数据速率
-
-d: 关闭磁盘I/O模块
-
-f /path/to/somefile: 设定输入文件位置
-
-o {HTML|CSV}:输出格式
-
-m: 禁用mount模块
-
-n: 禁用网络模块
-
-t #: 延迟时间间隔
-
-1:每个CPU的相关数据单独显示
C/S模式下运行glances命令
1、服务模式:
glances -s -B IPADDR
IPADDR: 指明监听的本机哪个地址
2、客户端模式:
glances -c IPADDR
IPADDR:要连入的服务器端地址
dstat命令:系统资源统计
dstat [-afv] [options..] [delay [count]]
-
-c: 显示cpu相关信息
-
-C #,#,…,total(总体的)
-
-d: 显示磁盘的相关信息
-
-D total,sda,sdb,…total
-
-g:显示page相关统计数据
-
-m: 显示memory相关统计数据
-
-n: 显示network相关统计数据
-
-p: 显示process相关统计数据
-
-r: 显示io请求相关的统计数据
-
-s: 显示swapped相关的统计数据
-
—tcp
-
—udp
-
—unix
-
—raw
-
—socket
-
—ipc
-
—top-cpu:显示最占用CPU的进程
-
—top-io: 显示最占用io的进程
-
—top-mem: 显示最占用内存的进程
-
—top-latency: 显示延迟最大的进程
kill命令:
向进程发送控制信号,以实现对进程管理
显示当前系统可用信号: kill -l
常用信号:man 7 signal
-
1) SIGHUP: 无须关闭进程而让其重读配置文件
-
2) SIGINT: 中止正在运行的进程;相当于Ctrl+c
-
9) SIGKILL: 杀死正在运行的进程
-
15) SIGTERM:终止正在运行的进程
-
18) SIGCONT:继续运行
-
19) SIGSTOP:后台休眠 相当于ctrl+z
如果复制一个大文件,可以用 ctrl+z送到后台,不过这是是停止状态,可以再用 kill 18 加这个进程 就可以继续进行了
指定信号的方法:
-
(1) 信号的数字标识;1, 2, 9
-
(2) 信号完整名称;SIGHUP
-
(3) 信号的简写名称;HUP
按PID:kill [-SIGNAL] pid …
按名称:killall [-SIGNAL] (名称)comm…
按模式:pkill [options] pattern
-
-SIGNAL
-
-u uid: effective user,生效者
-
-U uid: real user,真正发起运行命令者
-
-t terminal: 与指定终端相关的进程
-
-l: 显示进程名
-
-a: 显示完整格式的进程名
-
-P pid: 显示父进程为此处指定的进程的进程列表
例如:
pkill -t pts/2 表示杀掉 pts/2终端的进程!但是依赖的 bash 杀不了因为发的是 -15信号 要想杀全 就用 pkill -9 -t pts/2
jobs:
前台作业(foregroud):通过终端启动,且启动后会一直占据终端;
后台作业(backgroud):可以通过终端启动,但启动后即转入后台运行(释放终端);
如何让作业运行于后台?
(1) 运行中的作业
Ctrl+z
注意:送往后台后,作业会转为停止态;(2) 尚未启动的作业
# COMMAND &
注意:此类作业虽然被送往后台,但其依然与终端相关;如果希望把送往后台的作业剥离与终端的关系:
nohup COMMAND &
注意此命令执行后即使父进程关闭依然会运行!执行它的父进程为init。这时只能关闭不能再调入前台了~只能用kill关闭
查看所有作业:
# jobs
作业控制:
fg [%]JOB_NUM :把指定的后台作业调回前台;
bg [%]JOB_NUM :让送往后台的作业在后台继续运行;
kill %JOB_NUM :终止指定的作业 %号不可省!!
同时运行多个进程,提高效率
1、 vi all.sh f1.sh& f2.sh& f3.sh& 2、 (f1.sh&);(f2.sh&);(f3.sh&) 3、 { f1.sh& f2.sh& f3.sh& }
进程优先级调整:
静态优先级:100-139
进程默认启动时的nice值为0,优先级为120
只有根用户才能降低nice值(提高优先性)
数值越低,优先级越高!
nice命令:
nice [OPTION] [COMMAND [ARG]…]
[root@localhost ~]# nice -n 10 ping 10.1.0.1 调整进程优先级为 10
renice命令:对已运行的进程调整nice值
renice [-n] priority pid…
查看nice:
ps axo pid,comm,ni
原创文章,作者:qzx,如若转载,请注明出处:http://www.178linux.com/45219