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!

原文地址:http://blog.51cto.com/13667098/2125820

时间: 2024-08-29 18:13:30

linux中关于进程那些事的相关文章

linux 中的进程wait()函数

转载自:http://blog.sina.com.cn/s/blog_7776b9d3010144f9.html 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程. 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init 来接管他,成为他的父进程-- 一个进程在调用exit

Linux中查看进程占用内存和系统资源情况的命令

用 'top -i' 看看有多少进程处于 Running 状态,可能系统存在内存或 I/O 瓶颈,用 free 看看系统内存使用情况,swap 是否被占用很多,用 iostat 看看 I/O 负载情况... 还有一种办法是 ps -ef | sort -k7 ,将进程按运行时间排序,看哪个进程消耗的cpu时间最多. top: 主要参数 d:指定更新的间隔,以秒计算. q:没有任何延迟的更新.如果使用者有超级用户,则top命令将会以最高的优先序执行. c:显示进程完整的路径与名称. S:累积模式,

Linux中查看进程的多线程pstree, ps -L

Linux中查看进程的多线程 在SMP系统中,我们的应用程序经常使用多线程的技术,那么在Linux中如何查看某个进程的多个线程呢? 本文介绍3种命令来查看Linux系统中的线程(LWP)的情况:在我的系统中,用qemu-system-x86_64命令启动了一个SMP的Guest,所以有几个qemu的线程,以此为例来说明. 1. pstree 命令,查看进程和线程的树形结构关系.  BASH 1 2 3 4 5 [root@jay-linux ~]# pstree | grep qemu |-gn

Linux 中查看进程及资源使用情况

原文:Linux 中查看进程及资源使用情况 自带的 top 命令类似于平时我们使用的任务管理器,能够列出当前系统中的进程及资源的使用情况. $ man top top - display Linux tasks 使用起来很简单,不加任何参数的情况下已经很实用了.其输出大致是下面这个样子: top命令的输出界面 按 q 可退出该界面. Tips: top 的输出每 3 秒刷新一次,如果想将画面定格,Mac 下可使用 control + s 来停止刷新,control + q 恢复刷新.当然,还可以

Linux中的进程管理

什么是进程,顾名思义嘛!就是正在进行的程序,在Linux中,只要开启服务就会在后台对应的有了进程.那么进程管理究竟对于我们的日常运维工作有什么用呢? 主要作用有三点: 首先,最重要的是查看服务器健康状态 第二,查看系统中运行的所有进程 第三,杀死进程 我们用到进程最重要的作不就是用就是用来查看服务器的健康状态,做运维的不就是为了保证服务器能够一直这么正常运行吗? ① top命令 -->查看服务器健康状态 终端直接输入top,如图: 这里面最重要的就是前面的那5行,其中几个比较重要的参数如下: l

Linux中的进程

说进程之前要先说一下程序,相信大家都知道什么是程序,程序就是一个可执行文件,是一堆指令的集合.相对而言程序是静态的.而运行起来的程序就是进程,是动态的,是程序执行的过程.程序可以运行多次比如QQ可以启动多个,但是每一个都会在内存中有独立的隔离空间用于装载程序代码和数据. 我们通过ps命令可以查看Linux系统中当前运行的进程 ps -aux 具体字段请看 Linux系统的监控命令 这里面每一行都是一个进程,PID是进程号,后面的COMMAND这是具体进程或者说是程序名称.第一行永远都是PID 1

&lt;实训|第十一天&gt;学习一下linux中的进程,文件查找,文件压缩与IO重定向

[[email protected]~]#序言 在今后的工作中,运维工程师每天的例行事务就是使用free -m,top,uptime,df -h...每天都要检查一下服务器,看看是否出现异常.那么今天我们就讲解一下关于运维工程师例行事务的知识!  开班第十一天: [[email protected]~]#今天的课程大纲 查看进程,中断进程,切换进程 内存与swap分区 linux中文件查找的基本方法 linux中是如何解压缩文件的 关于I/O重定向的知识点 远程scp配合管道 详细讲解: [[e

每天进步一点点——重新认识Linux中的进程号

转载请说明出处:http://blog.csdn.net/cywosp/article/details/38968011 1. 概述 众所周知,进程(process)是一个可执行程序的实例,但是在Linux中进程可以重新改写为,进程是由内核定义的抽象的实体,并为该实体分配用以执行程序的各项系统资源.从内核的角度看,进程由用户内存空间(user-space memory)和一系列内核数据结构组成,其中用户内存空间包含了程序代码及代码所使用的变量,而内核数据结构则用于维护进程状态信息.记录在内核数据

Linux中查看进程的多线程

在SMP系统中,我们的应用程序经常使用多线程的技术,那么在Linux中如何查看某个进程的多个线程呢? 本文介绍3种命令来查看Linux系统中的线程(LWP)的情况: 在我的系统中,用qemu-system-x86_64命令启动了一个SMP的Guest,所以有几个qemu的线程,以此为例来说明. 1. pstree 命令 查看进程和线程的树形结构关系 [[email protected] ~]# pstree | grep qemu |-terminal-+-bash---qemu-sys---2