简单来说,每当执行一个程序或者命令,启动事件的时候都会得到一个PID,也就是进程ID。比如用户登陆的时候就会得到一个PID。如下所示。两个用户zhf和root在登陆后分别获得PID 3212和3214

root@zhf-linux:/home/zhf/zhf# ps -aux | grep 'bash'

zhf 3212 0.0 0.2 8968 4812 pts/5 Ss 08:36 0:00 bash

root 3224 0.0 0.1 6008 3600 pts/5 S 08:36 0:00 bash

前面我们还讲到了父子进程,比如在root这个账户下执行一些命令,那么root的PID 3224就是这些命令的父进程。用ps -l查看可以看到,ps命令的PID=4259. PPID=3224. PPID就父进程ID。

root@zhf-linux:/home/zhf/zhf# ps -l

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

4 S 0 3223 3212 0 80 0 - 2079 wait pts/5 00:00:00 su

4 S 0 3224 3223 0 80 0 - 1502 wait pts/5 00:00:00 bash

0 R 0 4259 3224 0 80 0 - 1869 - pts/5 00:00:00 ps

linux是多任务,多用户的系统。最直接的体现就是工作管理。什么是工作管理呢,比如我想ping一个网站,同时呢我又在做其他的事情,我不想ping网站的结果干扰我。那么我就可以把ping这个动作扔到后台去。前台继续做我的工作。前台就是你可以控制与执行命令的环境。后台就是自动运行的工作。那么如何将命令扔到后台去呢。只需要在命令的最后加一个
&就可以了。如下:

ping
-c 10 www.sina.com.cn &

执行完后会提示如下:

10
packets transmitted, 10 received, 0% packet loss, time 9012ms

rtt
min/avg/max/mdev = 27.893/28.957/31.411/1.237 ms

[1]+
Done ping -c 10 www.sina.com.cn

但是有一点不好的是,由于每秒都会进行一次ping操作,结果也会在终端上显示,这会干扰到我正在执行的动作。最简单的办法就是将就结果重定向到文件中去。如下所示,这样在前台界面就不会看到执行的结果了。

命令执行后会返回一个进程执行的pid。要查看在后台运行的程序可以通过jobs就可以看到后台执行的程序

root@zhf-linux:/home/zhf/zhf#
ping -c 10 www.sina.com.cn > test1.txt &

[1]
4437

root@zhf-linux:/home/zhf/zhf#
jobs

[1]+
Running ping -c 10 www.sina.com.cn > test1.txt &

root@zhf-linux:/home/zhf/zhf#
cat test1.txt

PING
www.sina.com.cn (218.30.66.248) 56(84) bytes of data.

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=1 ttl=54
time=31.1 ms

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=2 ttl=54
time=30.6 ms

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=3 ttl=54
time=29.8 ms

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=4 ttl=54
time=32.0 ms

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=5 ttl=54
time=28.4 ms

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=6 ttl=54
time=29.3 ms

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=7 ttl=54
time=28.1 ms

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=8 ttl=54
time=30.5 ms

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=9 ttl=54
time=28.6 ms

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=10 ttl=54
time=33.8 ms

---
www.sina.com.cn ping statistics ---

10
packets transmitted, 10 received, 0% packet loss, time 9013ms

rtt
min/avg/max/mdev = 28.135/30.271/33.876/1.708 ms

[1]+
Done ping -c 10 www.sina.com.cn > test1.txt

但是如果此刻我正在用VIM,但是想退出去查找某个东西,那么是否需要退出VIM呢。当然不需要,我们只需要将VIM丢到后台去执行就可以了。按下ctrl+z就可以了。就想下面一样。

root@zhf-linux:/home/zhf/zhf#
vim test1.txt

[1]+
Stopped vim test1.txt

root@zhf-linux:/home/zhf/zhf#
jobs

[1]+
Stopped vim test1.txt

如果我想把后台的工作移到前台来,比如刚才的VIM操作,查找完毕继续编辑文档。这就要用到fg命令

fg
%jobnumber就可以将后台的工作任务移动到前台来,这个jobnumber就是用jobs结果的第一列的值。在这里VIM的jobnumber是1。执行fg
%1就可以回到VIM的界面
root@zhf-linux:/home/zhf/zhf#
fg %1

vim
test1.txt

前面在执行ctrl+z的时候看到后台的程序状态都是stopped.
表示后台程序已停止运行,那么如果我想让后台程序保持运行就要用到bg命令。比如查找一个文件,转到后台后状态是stopped。当执行bg
%1后,状态变为running。

root@zhf-linux:/home/zhf/zhf#
find / -name test1.txt

^Z

[1]+
Stopped find / -name test1.txt

root@zhf-linux:/home/zhf/zhf#
bg %1

[1]+
find / -name test1.txt &

root@zhf-linux:/home/zhf/zhf#
jobs

[1]+
Running find / -name test1.txt &

那如果我想将后台任务给删除掉呢,这就需要用到kill命令

root@zhf-linux:/home/zhf/zhf#
kill %1

root@zhf-linux:/home/zhf/zhf#
jobs

[1]+
Terminated find / -name test1.txt

进程的查看:

种方法:1
查看当前终端有关的进程 2
查看系统所有的进程

首先来看下查看当前终端有关的进程:ps
-l

root@zhf-linux:/home/zhf/zhf#
ps -l

F
S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

4
S 0 3245 3233 0 80 0 - 2079 wait pts/2 00:00:00 su

4
S 0 3246 3245 0 80 0 - 1497 wait pts/2 00:00:00 bash

0
R 0 3266 3246 0 80 0 - 1869 - pts/2 00:00:00 ps

说明此进程的权限是root,若为1表示此子进程仅可进行复制fork,而无法执行

S:代表进程的状态。R
running S sleep D 不可唤醒 T
停止状态 Z
僵尸状态

UID/PID/PPID:分别是用户ID,进程PID,以及父进程PID

C代表CPU使用率,单位为百分比

PRI/NI:
priority和nice的缩写,代表进程的优先级,数值越小代表该进程越快被进程执行

ADDR/SZ/WCHAN:和内存有关,指进程在内存中的位置

TTY:登陆者的终端位置

TIME:CPU时间,实际耗费CPU的时间

CMD:进程的bash命令

系统所有的进程查看:
ps
aux

root@zhf-linux:/home/zhf/zhf#
ps aux

USER
PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root
1 0.1 0.2 24176 5228 ? Ss 08:39 0:02
/sbin/init spla

root
2 0.0 0.0 0 0 ? S 08:39 0:00
[kthreadd]

root
3 0.0 0.0 0 0 ? S 08:39 0:00
[ksoftirqd/0]

root
5 0.0 0.0 0 0 ? S< 08:39 0:00
[kworker/0:0H]

root
7 0.1 0.0 0 0 ? S 08:39 0:01
[rcu_sched]

root
8 0.0 0.0 0 0 ? S 08:39 0:00 [rcu_bh]

root
9 0.0 0.0 0 0 ? S 08:39 0:00
[migration/0]

root
10 0.0 0.0 0 0 ? S 08:39 0:00
[watchdog/0]

root
11 0.0 0.0 0 0 ? S 08:39 0:00
[watchdog/1]

这里只介绍前面没有的字段:

MEM:内存占用百分比

VSZ:使用的虚拟内存

RSS:固定占用的内存

上面看到的这些进程CPU或者内存百分比都是静态的,如果我们想查看动态的变化的话要使用top命令。

-d:
后面接秒数,就是进程的更新秒数,默认是5秒

-b:以批次的方式执行top,

-n:与-b搭配,意义是需要进行几次top的输出结果

-p:
指定某些PID来进行查看监控。

如果我想查看自己bash的进程变化情况:可以用下面的方法,首先查看当前进程的PID,
然后用-p
进程id的方式查看。

root@zhf-linux:/home/zhf/zhf#
echo $$

root@zhf-linux:/home/zhf/zhf#
top -d 2 -p 3246

进程的管理:

进程之间是可以相互控制的。比如我在运行某个进程的时候死机了,我可以启动另外一个终端查出死机的进程ID
并将进程杀死掉。这也是linux比windows维护起来方便的原因。进程之间通信需要用signal也就是信号来进行通知。

信号signal的值有下面几个:

1
SIGHUP 启动被终止的进程。

2
SIGNINT 相当于用键盘输入ctri-c来进行中断一个进程的进行

9
SIGKILL 代表强制中断一个进程的进行

15
SIGTERM 以正常的结束进程来终止该进程

17
SIGSTOP 相当于用键盘ctrl-z来暂停一个进程的进行。

进程之间传递进程采用kill命令。kill
-signal PID

就是我们当前使用的终端进程ID

zhf@zhf-linux:~$
ps -l

F
S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

0
S 1000 3620 3615 0 80 0 - 2242 wait pts/2 00:00:00 bash

0
R 1000 3644 3620 0 80 0 - 2305 - pts/2 00:00:00 ps

采用如下的命令
-9
强制中断当前的终端。执行后当前终端就会退出

zhf@zhf-linux:~$
kill -9 3620

进程的执行顺序:

在前面执行ps
-l的时候有两个参数priority和nice值。这两个值的作用在于调节进程的执行顺序。如果进程都是在一个队列里面进行,每个都按照顺序来,虽然很公平,但是会带来一个问题,比如有3个进程,进程1是紧急的进程,进程2和3是一般的进程而且进程2和进程3的工作很耗时间。如果按照顺序来,紧急的进程1就有可能半天得不到调度。紧急的任务就一直卡在那里。为了解决这个问题,引入了进程的优先级参数,也据是priority和nice值。PRI越低就代表越优先的意思。那么nice值是起什么作用的呢。

因为PRI是内核动态调整的,我们是无法去修改的。如果要调整进程的优先级,只能通过nice值来进行调整。PRI(new)=PRI(old)+nice。当nice为负值的时候,就是降低PRI值,优先级就会提高。反之则是降低

nice值的可调整范围是-20-19

比如我们新增一个vi进程并转入后台处理,设置nice值为-5。
通过ps
-l可以看到vi进程的nice值。原本BASH内置的PRI值为80,
nice设为-5以后,PRI变为75

root@zhf-linux:/home/zhf#
nice -n -5 vi &

[1]
3802

root@zhf-linux:/home/zhf#
ps -l

F
S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

4
S 0 3681 3670 0 80 0 - 2079 wait pts/2 00:00:00 su

4
S 0 3682 3681 0 80 0 - 1497 wait pts/2 00:00:00 bash

4
T 0 3802 3682 2 75 -5 - 3634 signal pts/2 00:00:00 vi

0
R 0 3803 3682 0 80 0 - 1869 - pts/2 00:00:00 ps

已有的进程可以通过renice的方法进行调整。下面的就是将su进程的nice调整为-5

root@zhf-linux:/home/zhf#
ps -l

F
S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

4
S 0 3681 3670 0 80 0 - 2079 wait pts/2 00:00:00 su

4
S 0 3682 3681 0 80 0 - 1500 wait pts/2 00:00:00 bash

0
R 0 3817 3682 0 80 0 - 1869 - pts/2 00:00:00 ps

root@zhf-linux:/home/zhf#
renice -5 3681

3681
(process ID) old priority 0, new priority -5

root@zhf-linux:/home/zhf#
ps -l

F
S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

4
S 0 3681 3670 0 75 -5 - 2079 wait pts/2 00:00:00 su

4
S 0 3682 3681 0 80 0 - 1500 wait pts/2 00:00:00 bash

0
R 0 3823 3682 0 80 0 - 1869 - pts/2 00:00:00 ps

一起来学linux:进程的更多相关文章

  1. 十天学Linux内核之第二天---进程

    原文:十天学Linux内核之第二天---进程 都说这个主题不错,连我自己都觉得有点过大了,不过我想我还是得坚持下去,努力在有限的时间里学习到Linux内核的奥秘,也希望大家多指点,让我更有进步.今天讲 ...

  2. 跟着鸟哥学Linux系列笔记3-第11章BASH学习

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 跟着鸟哥学Linux系列笔记2-第10章VIM学习 认识与学习bash 1. ...

  3. 为学Linux,我看了这些书

    为学Linux,我看了这些书   去年开始,抱着学习的态度开始了我的Linux学习,到现在,差不多一年了,收获很多,不敢说精通Linux,但是,还是对得起"略懂"这两个字的.这一年 ...

  4. 十天学Linux内核之第八天---构建Linux内核

    原文:十天学Linux内核之第八天---构建Linux内核 今天是腊八节,说好的女票要给我做的腊八粥就这样泡汤了,好伤心,好心酸呀,看来代码写久了真的是惹人烦滴,所以告诫各位技术男敲醒警钟,不要想我看 ...

  5. 十天学Linux内核之第七天---电源开和关时都发生了什么

    原文:十天学Linux内核之第七天---电源开和关时都发生了什么 说实话感觉自己快写不下去了,其一是有些勉强跟不上来,其二是感觉自己越写越差,刚开始可能是新鲜感以及很多读者的鼓励,现在就是想快点完成自 ...

  6. 十天学Linux内核之第六天---调度和内核同步

    原文:十天学Linux内核之第六天---调度和内核同步 心情大好,昨晚我们实验室老大和我们聊了好久,作为已经在实验室待了快两年的大三工科男来说,老师让我们不要成为那种技术狗,代码工,说多了都是泪啊,, ...

  7. 十天学Linux内核之第五天---有关Linux文件系统实现的问题

    原文:十天学Linux内核之第五天---有关Linux文件系统实现的问题 有时间睡懒觉了,却还是五点多醒了,不过一直躺倒九点多才算起来,昨晚一直在弄飞凌的嵌入式开发板,有些问题没解决,自己电脑系统的问 ...

  8. 十天学Linux内核之第四天---如何处理输入输出操作

    原文:十天学Linux内核之第四天---如何处理输入输出操作 真的是悲喜交加呀,本来这个寒假早上8点都去练车,两个小时之后再来实验室陪伴Linux内核,但是今天教练说没名额考试了,好纠结,不过想想就可 ...

  9. 十天学Linux内核之第三天---内存管理方式

    原文:十天学Linux内核之第三天---内存管理方式 昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今 ...

  10. 十天学Linux内核之第一天---内核探索工具类

    原文:十天学Linux内核之第一天---内核探索工具类 寒假闲下来了,可以尽情的做自己喜欢的事情,专心待在实验室里燥起来了,因为大二的时候接触过Linux,只是关于内核方面确实是不好懂,所以十天的时间 ...

随机推荐

  1. gtest 自动化测试 部署

    1.部署 a)编译框架 1.1下载gtest库1.6.0 并解压到文件夹 "/user/{user}/gtest.1.6.0" 下载地址:https://code.google.c ...

  2. Windows 10系统出现:“出现系统还原使用的卷影复制服务无法运行...”的问题解决

    在服务中是:Volume Shadow Copy和Microsoft Software Shadow Copy Provider这两项.把它开启.

  3. [ios]objective-c 协议和委托 (重点基础知识)

    objective-c protocol delegateprotocol-协议,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现. delegate-委托,顾名思义就是委托 ...

  4. Ambient Occulution

    SSAO HDAO normal pair 求一个谷 SAO 重建normal HBAO input depth,normal 这几个都是screen space的ao

  5. ClassPathXmlApplicationContext和FileSystemXmlApplicationContext区别

    ClassPathXmlApplicationContext 默认文件路径是src下那一级classpath:和classpath*:的区别: classpath: 只能加载一个配置文件,如果配置了多 ...

  6. JAVA Eclipse的Android文件结构是怎么样的

    默认res目录下面存放了界面需要的布局和图片文件,之所以图片分为hdpi,ldpi,mdpi这些,是为了不同的设备准备的(高/中/低分辨率的图片)   Bin目录类似于VS的debug或者releas ...

  7. Bootstrap 模态框、轮播 结合使用

    Bootstrap 模态框和轮播分开使用的教程网上非常多.可是两者结合使用的样例和资料非常少. 两者结合使用时,開始我遇到了不少bug,如今分享给大家. 我的这个样例是把图片轮播嵌入到模态框里. 最后 ...

  8. Interleaving String——是否由两个string交叉、DP

    Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given:s1 = ...

  9. innodb之change buffer被动merge

    被动merge情景一.二级索引页空间不足:ibuf0ibuf.cc:: ibuf_insert_low 1.当尝试缓存插入操作时,假设预估二级索引page的空间不足.可能导致索引分裂,则定位到尝试缓存 ...

  10. UVA12096 - The SetStack Computer(set + map映射)

    UVA12096 - The SetStack Computer(set + map映射) 题目链接 题目大意:有五个动作: push : 把一个空集合{}放到栈顶. dup : 把栈顶的集合取出来, ...