linux中关于进程那些事
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux中关于进程那些事相关的知识,希望对你有一定的参考价值。
进程(Process)是系统进行资源分配和调度的基本单位,一个进程是一个程序的运行实例。而在Linux中,可以使用一个进程来创建另外一个进程。
进程和程序是有本质区别的:
进程是一个程序的一次执行过程,同时也是资源分配的最小单元。
程序是静态的,它是一些保存在磁盘上的指令的有序集合,没有任何执行的概念;
而进程是一个动态的概念,它是程序执行的过程,包括了动态创建、调度和消亡的整个过程。
Linux操作系统包括三种不同类型的用户进程,每种类型的进程都有自己的特点和属性。
(1) 交互进程——由shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。
(2) 批处理进程——这种进程和终端没有联系,它是被提交到一个队列中的进程序列。
(3) 守护进程——又称监控进程,也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。
一,进程的创建
在Linux中主要提供了fork、vfork、clone三个进程创建方法。
在linux源码中这三个调用的执行过程是执行fork(),vfork(),clone()时,通过一个系统调用表映射到sys_fork(),sys_vfork(),sys_clone(),再在这三个函数中去调用do_fork()去做具体的创建进程工作。
fork出来的子进程是父进程的一个拷贝,即,子进程从父进程得到了数据段和堆栈段的拷贝,这些需要分配新的内存;而对于只读的代码段,通常使用共享内存的方式访问;而vfork则是子进程与父进程共享内存空间, 子进程对虚拟地址空间任何数据的修改同样为父进程所见;clone则由用户通过参clone_flags 的设置来决定哪些资源共享,哪些资源拷贝。
二,进程的查看和调用
命令:pstree,ps,top
pstree命令以树状图显示进程间的关系。ps命令可以显示当前正在运行的那些进程的信息,但是对于它们之间的关系却显示得不够清晰。
1.pstree display a tree of processes
以树状图显示进程,只显示进程的名字,且相同进程合并显示。
参数:-p 显示进程号
[[email protected] 桌面]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
├─NetworkManager─┬─dhclient
│ └─2*[{NetworkManager}]
├─2*[abrt-watch-log]
[[email protected] 桌面]# pstree -p
systemd(1)─┬─ModemManager(828)─┬─{ModemManager}(882)
│ └─{ModemManager}(895)
├─NetworkManager(928)─┬─dhclient(7190)
│ ├─{NetworkManager}(943)
│ ├─{NetworkManager}(945)
│ └─{NetworkManager}(10036)
2.ps process snapshot
显示瞬间的进程的状态
参数: -a -u -x -e -l -f
u: 以用户为中心组织进程状态信息显示
a: 与终端相关的进程;
x: 与终端无关的进程;
e: 显示所有进程
f: 显示完整格式程序信息
l: 长格式显示
[[email protected] 桌面]# ps
进程号 终端设备 占用cpu处理时间 命令
PID TTY TIME CMD
8232 pts/1 00:00:00 bash
9895 pts/1 00:00:00 bash
10335 pts/1 00:00:00 ps
TTY 终端设备teletype
pts(虚拟终端pseudo-tty)
pts(pseudo-terminal slave)是pty的实现方法,是伪终端
[[email protected] 桌面]# ps aux //BSD风格
用户 进程号 cpu 内存 虚拟内存 常驻内存 终端 进程状态 开始 时间 命令
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 193704 6868 ? Ss 10:56 0:03 /usr/lib/system
root 2 0.0 0.0 0 0 ? S 10:56 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 10:56 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 10:56 0:00 [kworker/0:0H]
[[email protected] 桌面]# ps -elf //标准风格
状态 用户 进程 父进程 cpu 优先级 nice值 地址
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 48426 ep_pol 10:56 ? 00:00:03 /usr/lib/systemd/system
1 S root 2 0 0 80 0 - 0 kthrea 10:56 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 10:56 ? 00:00:00 [ksoftirqd/0]
进程的5中状体:
R:running 运行
S: interruptable sleeping 中断
D: uninterruptable sleeping 不可中断
T: stopped 停止
Z: zombie 僵死
3.top display linux processes
动态显示系统进程状态 -d 刷新秒数 -U用户
top交互操作命令
? 帮助
P 降序查看cpu
M 降序查看内存
T 降序查看进程占用时间
k 杀死进程
q 退出
[[email protected] 桌面]# top
当前时间 运行时间 用户个数 负载: 1分钟 5分钟 15分钟 //uptime查看也可以
top - 15:31:30 up 4:35, 3 users, load average: 0.53, 0.55, 0.43
Tasks: 254 total, 1 running, 253 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.0 us, 0.7 sy, 0.0 ni, 96.2 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3936028 total, 226112 free, 1692012 used, 2017904 buff/cache
KiB Swap: 4063228 total, 4063228 free, 0 used. 1627952 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3797 root 20 0 2144524 300668 72032 S 10.0 7.6 20:49.80 Web Content
注:
用cttl + z把占用终端的进程打入后台,jobs命令可用来查看被打入后台的进程,fg 可把进程调回前台,bg 可将后台暂停的进程运行。
三,进程的优先级
命令:nice和renice
内核使用一些简单的数值范围0~139表示内部优先级, 数值越低, 优先级越高。
从0~99的范围专供实时进程使用, nice的值[-20,19]则映射到范围100~139
静态优先级:100-139,数字越小,优先级越高
进程默认启动时的nice值为0,优先级为120,nice值的范围是(-20,19)
nice命令:启动进程时,以指定优先级运行
nice [OPTION] [COMMAND [ARG]...],例如:nice -n 5 htop
renice命令:对已处于运行态的进程,调整优先级
renice [-n] priority pid...,例如: renice -n 2 3618
查看进程的优先级:
[[email protected] 桌面]# ps axo pid,comm,ni,pri
PID COMMAND NI PRI
1 systemd 0 19
2 kthreadd 0 19
3 ksoftirqd/0 0 19
5 kworker/0:0H -20 39
四,杀死进程
命令:
kill,pkill,killall (-9 强制删除)
格式:
kill pid (进程名)
killall 进程名
pkill 查找条件
killall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。pkill或者pgrep只要给出进程名的一部分就可以终止进程。
[[email protected] 桌面]# firefox
[[email protected] 桌面]# pgrep firefox
3773
[[email protected] 桌面]# pgrep firefox | xargs kill //pkill=pgrep+kill
[[email protected] 桌面]# pkill firefo //不写全也可以杀掉进程
[[email protected] 桌面]# killall firefo // 如果写成firefox就可以杀掉
firefo: no process found
[[email protected] 桌面]# w //查看哪些用户登录
09:27:15 up 6 min, 4 users, load average: 0.03, 0.25, 0.16
USER TTY FROM [email protected] IDLE JCPU PCPU WHAT
root :0 :0 09:22 ?xdm? 27.63s 0.12s gdm-session-wor
root pts/0 :0 09:23 3.00s 0.11s 0.03s w
root pts/1 :0 09:24 11.00s 0.05s 0.01s ssh [email protected]
lu pts/2 localhost 09:27 3.00s 0.01s 0.01s -bash
[[email protected] 桌面]# pkill -U lu //把用户踢出
参考网址:
https://www.cnblogs.com/regit/p/7766135.html
共勉:I hear and I forget. I see and I remember. I do and I understand!
以上是关于linux中关于进程那些事的主要内容,如果未能解决你的问题,请参考以下文章