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 显示进程号

[root@luc 桌面]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─2*[abrt-watch-log]
[root@luc 桌面]# 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: 长格式显示

[root@luc 桌面]# 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的实现方法,是伪终端

[root@luc 桌面]# 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]
[root@luc 桌面]# 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 退出

[root@luc 桌面]# 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)
linux中关于进程那些事
nice命令:启动进程时,以指定优先级运行
nice [OPTION] [COMMAND [ARG]...],例如:nice -n 5 htop
renice命令:对已处于运行态的进程,调整优先级
renice [-n] priority pid...,例如: renice -n 2 3618
查看进程的优先级:

[root@luc 桌面]# 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只要给出进程名的一部分就可以终止进程。

[root@luc 桌面]# firefox 
[root@luc 桌面]# pgrep firefox
3773
[root@luc 桌面]# pgrep firefox | xargs kill     //pkill=pgrep+kill
[root@luc 桌面]# pkill firefo     //不写全也可以杀掉进程
[root@luc 桌面]# killall firefo      //  如果写成firefox就可以杀掉
firefo: no process found
[root@luc 桌面]# w           //查看哪些用户登录
 09:27:15 up 6 min,  4 users,  load average: 0.03, 0.25, 0.16
USER     TTY      FROM             LOGIN@   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
[root@luc 桌面]# 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!

猜你喜欢

转载自blog.51cto.com/13667098/2125820