十、进程管理

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

大家都在看

  • Java基础系列–09_集合2

    昨天介绍了集合的主要架构体系,今天主要的目的是学习集合的迭代器的遍历和List的特有功能。 迭代器:概述: 由于多种集合的数据结构不同,所以存储方式不同,取出方式也不同。但是他们都…

    Linux 2023年6月7日
    068
  • Linux系统下安装tomcat步骤

    说明:jdk自动安装后路径是/usr/lib/jvm 在”vim /etc/profile”修改profile文件尾部 unset -f pathmunge…

    Linux 2023年6月6日
    077
  • 【转载】人才成长攻略

    本文转载自知乎《前些天在知乎回复了一个帖子:怎么劝大四室友不要考计算机研?- 曹政的回答》,原作者曹政 评论里有一堆阴阳怪气的说法,什么没天赋怎么办,程序员也不是终身可靠的职业云云…

    Linux 2023年6月13日
    081
  • JAVA实现微信小程序支付退款功能

    JAVA实现微信小程序支付退款功能 本如亲测有效(代码复制直接可以用的),退款的前提是必须有小程序的appid、商户号、商户密匙、和证书、 这个是微信小程序退款的官网大家可以去看看…

    Linux 2023年6月7日
    0208
  • Linux编译安装、压缩打包与定时任务服务

    一、编译安装 即使用源代码编译安装的方式,编译打包软件。特点: 可以自定制软件; 可以按需构建软件; 编译安装案例 1、下载源代码包(这里以Nginx软件包源代码为例) wget …

    Linux 2023年5月27日
    087
  • 循环通过逗号分隔的shell变量

    假设我有一个Unix shell变量,如下所示 variable=abc,def,ghij 我想使用for循环提取所有值(abc,def和ghij),并将每个值传递给一个过程。 脚…

    Linux 2023年5月28日
    079
  • gerrit系统如何配置访问控制

    .版本:v0.3作者:河东西望日期:2022-7-13. gerrit系统的上手使用有两个难点: 想要上手使用gerrit的同仁们,搭建部署好gerrit系统之后,会发现gerri…

    Linux 2023年6月7日
    089
  • 五分钟搭建博客系统 OK?

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 概要: 通过 Docker Compose 在使用 Docker容器构建的隔离环境中轻松运行 WordPress。…

    Linux 2023年6月14日
    0127
  • QNAP container station安装 redis

    打开container station,即docker,安装Redis 选择最新的即可 命令处请务必在尾部添加语句: –requirepass “yourpasswor…

    Linux 2023年5月28日
    071
  • 如何利用XShell隧道通过跳板机连接内网机器

    在服务器众多的企业里,通常运维会把某台机器开放外网访问权限,其他服务器通过该机器进行访问,该机器通常称之为跳板机。开发人员可以通过SSH工具访问服务器,进行日志查看、问题排查等等。…

    Linux 2023年5月28日
    0110
  • Docker清理日志脚本

    Docker清理日志脚本 #!/bin/sh 此脚本为日常清理docker日志 docker 容器的路劲日志为 /var/lib/docker/containers/ 下-json…

    Linux 2023年6月8日
    084
  • Redis-实现SpringBoot集成Redis多数据源

    背景​ 有些时候在一个项目里,由于业务问题,可能仅仅操作一个Redis数据源已经不能满足,比如某个运营系统,对接着多个不同的服务,处理数据时又不想通过远程调用,那只能增加一个数据源…

    Linux 2023年5月28日
    073
  • Linux高可用之Keepalived

    注意: 各节点时间必须同步 确保各节点的用于集群服务的接口支持MULTICAST通信(组播); 安装 从CentOS 6.4开始keepalived随系统base仓库提供,可以使用…

    Linux 2023年5月27日
    0131
  • 大数库GMP测试

    任务详情 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务 用自己8位学号建两个文件夹xxxxxxxxsrc,xxxxxxxx,到GMP官网htt…

    Linux 2023年6月8日
    095
  • shell中的段落注释

    摘自: 感叹号可以用任意的串和字符替代,比如 注意!和BLOCK之前不能有空格,但是可以用Tab Original: https://www.cnblogs.com/LiuYanY…

    Linux 2023年5月28日
    076
  • 抓到 Netty 一个隐藏很深的内存泄露 Bug | 详解 Recycler 对象池的精妙设计与实现

    欢迎关注公众号:bin的技术小屋,如果大家在看文章的时候发现图片加载不了,可以到公众号查看原文 本系列Netty源码解析文章基于 4.1.56.Final版本 最近在 Review…

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