十、进程管理

什么是进程?
进程(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

Original: https://www.cnblogs.com/wang-yongxu/p/16449576.html
Author: Lyon-w
Title: 十、进程管理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581977/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • CMU15-445 数据库导论 Storage02 其他存储方式

    CMU15-445 数据库导论 Storage02 其他存储方式 1. 参考资料: [1] CMU15-445:Database Systems [Andy Pavlo] http…

    Linux 2023年6月6日
    0115
  • python学习

    目录: 1、课程推荐以及书籍推荐 2、学习记录 2.1:无 1. 实践过程 廖雪峰的官方网站 2. 学习记录 2.1 无: posted @2022-02-12 19:44 风御之…

    Linux 2023年6月13日
    0108
  • SQLI-LABS(Less-6)

    Less-6(GET-Double injection-Double Quotes-String) 打开 Less-6页面,可以看到页面中间有一句 Please input the…

    Linux 2023年6月6日
    092
  • python小技巧

    关于 ipython 1 Tab补全 从外观上,IPython shell和标准的Python解释器只是看起来不同。IPython shell的 进步之一是具备其它IDE和交互计算…

    Linux 2023年6月8日
    0108
  • 为知笔记迁移到印象笔记-从入门到放弃

    最新进展 已经放弃了,目前正在逐步把笔记迁移到本地,用icloud来同步。 为什么放弃迁移? 没有找到好的迁移方案,迁移过去文档不方便查找和使用 为什么放弃印象笔记? 1.主要使用…

    Linux 2023年6月14日
    092
  • 面试题:Java中为什么只有值传递?

    作者:小牛呼噜噜 | https://xiaoniuhululu.com计算机内功、JAVA底层、面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」 经典的问题 形参&实参…

    Linux 2023年6月6日
    0138
  • C++的回调函数

    一、简介 本文主要介绍C++中如何使用回调函数。 二、回调函数介绍 回调函数主要在”回”字,和正常的函数调用方式不太一样。正常的函数由开发者自己定义返回类型…

    Linux 2023年6月7日
    0106
  • 【socket】基于poll和epoll通信温度上报

    网络socket通信 * – poll函数 – epoll函数 – poll代码实现 – epoll代码实现 poll函数 poll…

    Linux 2023年6月13日
    0107
  • cmd学习笔记

    for %var in (set) do commond for %one in (1,2,3,4,5) do echo –>1 –>2 –>3 –&gt…

    Linux 2023年6月7日
    0121
  • redis

    redis 慢 开启 AOF 1、多加服务器 2、增加写的能力 +ssdb Original: https://www.cnblogs.com/y896926473/p/96929…

    Linux 2023年5月28日
    081
  • 【XML】学习笔记第四章-schema

    Schema 概述 作用 与DTD相比Schema的优势 基础命名空间: 模式 引用方法 通过xsi:noNamespaceSchemaLocation引入 通过xsi:shema…

    Linux 2023年6月14日
    095
  • keepalived+nginx高可用集群配置(centos)

    1、简介 Keepalived是一个免费开源的,用C编写的类似于layer3, 4 & 7交换机制软件,具备我们平时说的第3层、第4层和第7层交换机的功能。主要提供l oa…

    Linux 2023年6月6日
    0108
  • SQL44 将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005

    本题链接表结构如下所示。 +—-+——–+—————–+————+————+ | id | emp_no | t…

    Linux 2023年6月13日
    0109
  • [ Tcl ] 非阻塞模式启动外部程序,并接收返回值的方法

    https://www.cnblogs.com/yeungchie/ Callback 函数 proc Callback { handle } { variable line if…

    Linux 2023年6月7日
    0102
  • Mybatis源码解读-插件

    注册 xml方式的注册,是在XMLConfigBuilder#pluginElement完成的。 不明觉厉的同学,请参考上一篇文章:Mybatis源码解读-配置加载和Mapper的…

    Linux 2023年6月7日
    0103
  • PHP array_values()

    array_values array_values() 函数返回一个包含给定数组中所有键值的数组,但不保留键名。 示例: function arrayValues() { $dat…

    Linux 2023年6月7日
    0110
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球