什么是进程?
进程(Process)是一个程序在其自身的虚拟地址空间的一次执行活动。之所以要创建进程,就是为了使
多个程序可以并发的执行,从而提高系统的资源利用率和吞吐量。简单来说进程就是一个程序的执行活动。
进程和程序有什么不同?
程序:只是一个静态的指令集合;而进程是一个程序的动态执行过程,它具有生命周期,是动态的产生和消亡的。
进程:是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源;而程序不能申请系统资源、不能被系统调度、
也不能作为独立运行的单位,因此,它不占系统的运行资源。
程序和进程无一 一对应关系。一方面一个程序可以由多个进程所公用,即一个程序正在运行过程中可以产生多个进程;另一方面,一个进程在生命期内可以顺序的执行若干个程序。
进程的属性
在linux系统中总有很多进程同时在运行,每一个进程都有一个识别号,叫做PID(Process ID),用以区分不同的进程。每个进程都有一个ID号,可以通过ps命令看出来
可以用echo $$,查看shell和子shell
[root@Lyon ~]# echo $$ 第一个$代表变量 ,第二个$变量值,此$代表当前shell的进程号
2943
[root@Lyon~]# bash 进入子shell
[root@Lyon~]# echo $$
2983 进程号和父进程的不一样
查看系统进程树
[root@Lyon~]# pstree -p
systemd(1)─┬─ModemManager(909)─┬─{ModemManager}(938)
│ └─{ModemManager}(964)
systemd 是系统开启的第一个进程,是所有进程的父进程,它的进程号为1。
通常杀死子进程不影响父进程,杀死父进程会影响子进程,而且systemd这个进程不能被杀死,除非关机或重启。
硬盘、进程、内存、CPU之间的关系
人生三大错觉之中的一个:QQ、暴风影音、浏览器等能够一起执行。难道进程是并行执行的.非也非也.对于单CPU系统来说在某一时刻,仅仅能有一个进程处于执行状态,占有CPU的使用权,其它进程都处于其它状态,等待系统资源,各进程依据调度算法在某些状态之间不停地的切换.但因为CPU处理效率较快,使用户感觉不到当中的变化.
进程的状态
R (TASK_RUNNING),可执行状态。
S (TASK_INTERRUPTIBLE),可中断的睡眠状态
D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态
T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态。
Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程。
X (TASK_DEAD - EXIT_DEAD),退出状态,进程即将被销毁。
R (TASK_RUNNING),可执行状态。
正在运行或处于就绪状态:就绪状态是指进程申请到了CPU以外的其它全部资源。
实验:
打开火狐浏览器后用top命令查看状态
S (TASK_INTERRUPTIBLE),可中断的睡眠状态 浅度睡眠
处于等待队伍中,等待资源有效时唤醒(比方等待键盘输入、socket连接、信号等等
实验:
打开火狐浏览器后用top命令查看状态
D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态 深度睡眠
于等待队伍中,等待资源有效时唤醒(比方等待键盘输入、socket连接、信号等等),但不能够被中断唤醒.
实验:
打开火狐浏览器后用top命令查看状态
T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态。
进程被外部程序暂停(如收到SIGSTOP信号,进程会进入到TASK_STOPPED状态),当再次同意时继续运行(进程收到SIGCONT信号,进入TASK_RUNNING状态)。
暂停jobs任务
Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程。
僵死状态。进程资源用户空间被释放,但内核中的进程PCB并没有释放。等待父进程回收
X (TASK_DEAD - EXIT_DEAD),退出状态,进程即将被销毁。
正常退出
进程调度流程
查看进程
学习进程管理的目标:
1、查看系统当前进程,是否有资源使用过高的进程
2、通过调整进程优先级来让程序优先执行
3、对崩溃的滞留在内存中的程序如何处理
常用命令
PS:静态方式列出进程信息
top:动态方式列出进程信息
PS:
ps -l 查看自己bash程序
vim file1 &
ps -l
F:代表这个程序标记
4:表示程序权限为root
1:表示子程序仅进行复制fork而没有实际执行exec
S:代表这个程序的状态STAT,进程状态共5种。
R (running):该程序正在运行:
S(sleep):程序是睡眠状态idle,可以被唤醒(signal)
D:不可被唤醒的睡眠状态,通常这支程序可能在等待I/O。
T:停止状态(stop),可能是jobs后台程序或traced追踪状态
Z(Zombie):僵尸状态,程序已终止但是在内存中无法移除。
UID/PID/PPID:所有者/进程ID/此程序父进程ID
C:cpu使用率,单位为百分比
PRI/NI :priority/Nice的缩写,代表程序被cpu执行的优先顺序,越小,越先被执行
ADDR/SZ/WCHAN:ADDR与内存有关,如果状态是运行的程序running,一般显示 - 。SZ代表程序使用了多少内存。WCHAN表示程序是否在运行,如果是用 - 表示。
TTY:登录着的终端机位置
TIME:花费cpu运行程序时间
CMD:
ps -ef 列出所有进程及相信信息 比ps -l详细
ps -A 显示所有进程
ps -e 此参数的效果和指定"A"参数相同。
f 以进程树的形式显示
[kiosk@Lyon~]$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 22:39 ? 00:00:03 /usr/lib/systemd/systemd --switche
root 2 0 0 22:39 ? 00:00:00 [kthreadd]
ps aux 查看所有系统运行程序
a 显示现行终端机下的所有程序,包括其他用户的程序。
u 以用户为主的格式来显示程序状况。
x 显示所有程序,不以终端机来区分。
yum repolist all
yum install -y httpd
systemctl start httpd
systemctl status httpd
ps aux
ps aux | grep httpd
top:
1、命令选项:
-d: 屏幕刷新间隔时间 top -d second
2、命令中的快捷键:
h显示快捷键帮助
k终止一个进程 进程号 9
q退出程序
r重新安排一个进展的优先等级
s更改刷新间隔时间,单位秒
l切换显示平均负载和启动时间信息
m切换显示内存信息
t切换显示进程和CPU状态信息
c切换显示命令名称和完整命令行
M根据内存使用大小排序
P根据CPU使用率进行排序(默认排序)
T根据时间/渐进时间进行排序
1展开多核cpu显示
3、top内容说明
top-系统当前时间
系统已开机多长期
用户当前用户数
load average cpu平均负载,三个数值分别为,1分钟,5分钟,15分钟
任务系统当前进程数,总计:总进程数,运行:正在运行的进程数,睡觉:睡眠的进程数,已停止:停止的进程数,僵尸:僵尸进程数
%Cpu(s)cpu使用率,我们:用户使用cpu百分百,sy:系统内核使用cpu百分百,id:剩余的cpu百分百
Mem内存使用信息,总计:总内存大小,可用:已缓存的内存,已使用:已使用的内存,buff / cache:缓存的内存大小
交换虚拟内存信息
PID进程ID
用户进程所有者
PR优先级
NI nice值,负值表示高优先级,正值表示低优先级
VIRT进程使用的虚拟内存数量
RES进程使用的物理内存大小
SHR共享内存大小
S进程状态,D:不可中断的睡眠状态,R:运行,S:睡眠,T:跟踪/停止,Z:僵尸进程
%CPU进程使用的CPU占用百分比
%MEM进程使用的物理内存百分比
TIME +进展使用的CPU时间总计
COMMAND命令名
杀死进程:
kill 信号编号 PID
-1:重新加载
-9:强制杀死
-15:正常退出
[root@Lyon mnt]# ps aux | grep vim
root 7258 0.0 0.4 33972 8152 pts/1 T 22:18 0:00 vim file
root 7490 0.0 0.0 12320 1076 pts/0 S+ 22:32 0:00 grep --color=auto vim
[root@Lyon mnt]# kill -9 7258
[root@Lyon mnt]# ps aux | grep vim
root 7504 0.0 0.0 12320 1056 pts/0 R+ 22:32 0:00 grep --color=auto vim
killall 进程名称
[root@Lyon mnt]# ps aux | grep httpd
root 6424 0.0 0.6 273848 10816 ? Ss 21:47 0:00 /usr/sbin/httpd -DFOREGROUND
apache 6426 0.0 0.4 286064 8312 ? S 21:47 0:00 /usr/sbin/httpd -DFOREGROUND
apache 6429 0.0 0.5 1474980 9652 ? Sl 21:47 0:00 /usr/sbin/httpd -DFOREGROUND
apache 6430 0.0 0.5 1343852 9652 ? Sl 21:47 0:00 /usr/sbin/httpd -DFOREGROUND
apache 6431 0.0 0.5 1343852 9652 ? Sl 21:47 0:00 /usr/sbin/httpd -DFOREGROUND
root 7544 0.0 0.0 12320 1028 pts/0 R+ 22:32 0:00 grep --color=auto httpd
[root@Lyon mnt]# killall httpd
[root@Lyon mnt]# ps aux | grep httpd
root 7570 0.0 0.0 12320 1072 pts/0 R+ 22:34 0:00 grep --color=auto httpd
[root@Lyon mnt]# pgrep vim | xargs kill -9
备注:
Linux中的buff/cache内存
我们用free、top等相关能够查询到当前内存的使用情况的命令时,总会有一个buff/cache让我们很困惑。
buffer
即写如磁盘时,先保存到磁盘缓冲区(buffer),然后再写入到磁盘。
cache
即读磁盘时,数据从磁盘读出后,暂留在缓冲区(cache),为后续程序的使用做准备。
如何划分buffer/cache(已使用 or 空闲)
操作系统的角度:这块内存确实被操作系统使用了。
用户角度:如果用户要使用,这块内存是可以很快被回收而被用户空间程序使用,因此从用户角度而言这块内存应被划为空闲状态。
Linux这种机制的好处
这是Linux一种非常优秀的设计,目的就是为了提升磁盘IO的性能,从低速的块设备上读取的数据会暂时保存在内存中,即使数据在当时已经不再需要了,但在应用程序下一次访问该数据时,它可以从内存中直接读取,绕开了低速的块设备,从而提高系统的整体性能。
为了提高系统性能和不浪费内存,linux把多的内存做了cache,以提高io速度.你的那些内存并没有被占用。
Linux的工作调度 jobs
由于linux是一个多人多任务的操作系统,所以用户在使用linux的时候就会出现有些工作我们需要盯着完成的进度,而有些工作我们直接放在后台执行就可以了,这里我们就涉及到任务的前后台执行问题,那么如何将一个任务放到后台执行?
[root@Lyon ~]# firefox & #&符号是将进程放入后台执行
[1] 9283
[root@Lyon ~]# jobs #查看后台任务
[1]+ 运行中 firefox &
结论,程序在后台运行,不影响命令提示符
工作管理job control
通过job control在一个bash环境下执行多个任务。
我们无法将tty1的任务放到tty2的下面执行。
假设我们只有一个终端界面的话。因此可以出现命令提示符的界面我们称为前景foreground,至于其他工作可以放入背景background取暂停或工作。放入到背景的工作比如vim是不能够执行的,也不能用ctrl+c来终止。
需要注意的点:
这些工作出发的程序必须来自于你shell的子程序(只管理自己的bash);
前景:你可以控制与下达指令的这个环境称为前景的工作(foreground);
背景:可以自行运作的工作,你无法使用ctrl+c终止它,可以使用bg/fg呼叫该工作;
背景中:‘执行’的程序不能等待terminal/shell的输出input
例子:
1、tar -zpcf /tmp/etc.tar.gz /etc &
[root@Lyon 桌面]# tar -zpcf /tmp/etc.tar.gz /etc &
[1] 10502 1是工作编号,10502是进程号
[1]+ Done tar -zpcf /tmp/etc.tar.gz /etc 出现Done表示此任务以完成
将工作中的任务放到背景里jobs
执行两个命令
vim ~/.bashrc 执行后安ctrl+z
find / print 执行后按ctrl+z
jobs 查看背景中的任务
选项:
-l 显示PID
-r 显示正在running的任务
-s 显示stop的任务
fg %任务编号 将后台调到前台
bg %任务编号 让在后台的任务在背景运行
kill -9 %任务编号
[root@Lyon ~]# dd if=/dev/zero of=/bigfile bs=1M count=4000 #按ctrl+z 手动切入后台
^Z
[4]+ 已停止 dd if=/dev/zero of=/bigfile bs=1M count=4000
[root@Lyon ~]# jobs
[1] 运行中 firefox &
[2] 已停止 vim 1.sh
[3]- 已停止 vim 2.sh
[4]+ 已停止 dd if=/dev/zero of=/bigfile bs=1M count=4000 #手动切入的任务会暂停
[root@Lyon ~]# jobs -l
[1] 9283 运行中 firefox &
[2] 9689 停止 (tty 输出) vim 1.sh
[3]- 9808 停止 vim 2.sh
[4]+ 9839 停止 dd if=/dev/zero of=/bigfile bs=1M count=4000
[root@Lyon ~]# jobs -r
[1] 运行中 firefox &
[root@Lyon ~]# jobs -s
[2] 已停止 vim 1.sh
[3]- 已停止 vim 2.sh
[4]+ 已停止 dd if=/dev/zero of=/bigfile bs=1M count=4000
[root@Lyon ~]# bg %4 #后台任务继续运行
[4]+ dd if=/dev/zero of=/bigfile bs=1M count=4000 &
[root@Lyon ~]# jobs
[1] 运行中 firefox &
[2]- 已停止 vim 1.sh
[3]+ 已停止 vim 2.sh
[4] 运行中 dd if=/dev/zero of=/bigfile bs=1M count=4000 &
[root@Lyon ~]# 记录了4000+0 的读入
记录了4000+0 的写出
4194304000 bytes (4.2 GB, 3.9 GiB) copied, 178.781 s, 23.5 MB/s
[4] 已完成 dd if=/dev/zero of=/bigfile bs=1M count=4000
[root@Lyon ~]# fg %2 #后台任务调入前台
vim 1.sh
[root@Lyon ~]# jobs
[1]- 运行中 firefox &
[3]+ 已停止 vim 2.sh
[root@Lyon ~]# kill -9 %3 #杀死后台任务
[3]+ 已杀死 vim 2.sh
[root@Lyon ~]# jobs
[1]+ 运行中 firefox &
nice值
PRI:系统给予的优先级不能人为修改
NI:nice值,可以认为更改范围-20~19
1 root可以更改自己或他人程序的Nice值范围-20~19
2、一般用户仅可调整自己的Nice值范围0-19
3、一般用户仅可以将nice值越调越高
最后优先级公式:PRI(新)=PRI(旧)+nice值
优先级越低越先执行
调整nice值指令:
系统设置的nice值用:nice命令
已有被指定的nice值用:renice命令
语法:
nice -n 数字 command
-n 后面可以接一个数字范围-20~19
nice -n -5 vi & 开启一个进程并且设定nice值
renice 10 20485 修改一个已经运行的程序
范例:
nice -n -5 vi &
[root@Lyon 桌面]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 18949 18947 0 80 0 - 1719 - pts/0 00:00:00 bash
4 T 0 20485 18949 0 75 -5 - 1700 - pts/0 00:00:00 vi
0 T 0 20490 18949 0 80 0 - 1700 - pts/0 00:00:00 vi
4 R 0 20491 18949 0 80 0 - 1624 - pts/0 00:00:00 ps
renice 10 进程号 ,那么修改后数值直接变成默认值80+10
[root@Lyon 桌面]# renice 10 20485
20485: old priority -5, new priority 10
[root@Lyon 桌面]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 18949 18947 0 80 0 - 1719 - pts/0 00:00:00 bash
4 T 0 20485 18949 0 90 10 - 1700 - pts/0 00:00:00 vi
0 T 0 20490 18949 0 80 0 - 1700 - pts/0 00:00:00 vi
4 R 0 20778 18949 3 80 0 - 1625 - pts/0 00:00:00 ps