第九章、程序和进程的关系

编程入门 行业动态 更新时间:2024-10-27 09:36:20

第九章、程序和进程的关系

文章目录

  • 第九章、程序和进程的关系
    • 一、程序和进程的关系
    • 二、查看进程和控制进程
      • 1、查看进程
        • ps -aux
        • **ps -elf**
        • **top命令**
          • total 总内存空间
          • **top常用命令∶**
        • pgrep查看进程信息
        • pstree查看进程树
      • 2、控制进程
        • 调度启动
        • 进程的前后台调度
          • 挂起当前的进程Ctrl+Z
          • jobs 命令
          • fg 命令
        • 终止进程的运行
          • 1) Ctrl + C 组合键
          • 2) Kill、Killall命令
          • 3) pkill命令
    • 三、计划任务管理at
    • 四、crontab周期性任务设置
        • 1、/etc/crontab——系统任务配置文件
        • 2、使用 crontab 命令管理用户的计划任务
    • 总结

一、程序和进程的关系

程序和进程的关系

什么是进程?我们先来了解一下进程的概念:我们知道操作系统最核心的概念就是进程。进程简单来说就是在操作系统中运行的程序,它是操作系统资源管理的最小单位。但是进程是一个动态的实体,它是程序的一次执行过程。进程和程序的区别在于:进程是动态的,程序是静态的,进程是运行中的程序,而程序是一些保存在硬盘上的可执行代码程序代码的一个或多个执行线程。

进程状态
程序:二进制文件,静态/bin/date,/usr/sbin/sshd
进程:是程序运行的过程,动态,有生命周期及运行状态。


程序进程理论
线程背包含在进程之中,是进程中的实际运作单位,也是操作系统中能够独立运行的基本单位,也称作轻量进程,一个进程中可以并发多个线程,每条线程可以并行执行不同的任务,而我们在任务管理器中看到的一个个进程则是由我们下载的的应用程序所产生的,当然一个应用程序也可以包含多个进程,就比如下方的百度网盘,就运行四个就绪状态的后台进程,一下便是他们的大致管关系

公司(程序)
-----》部门(进程)
------》员工(线程)
项目任务(我们执行一个小项目)
因此换一种说法就是我们打开应用程序后,在后台运行了相应的进程,然后我们点击了应用程序中的某个功能之后由对应进程中的线程,负责次功能的运行,这样就可以不用运行整个应用程序或者是进程,便可以完成操作者的命令了,即可节约了资源利用率,也增强了cpu的吞吐率。提高所有任务吞吐量的技术可以提高计算机的整体性能。


线程的运作原理
单核单线程的cpu运行多个包含多线程的应用程序能运行吗?

当应用的进程状态是Running时(使用系统命令top可以查看),调度器会让进程进行排队,然后进入就绪队列,通过分派器,进程控制块处理后,交给CPU,当CPU计算完后,移出队列。到此程序就完成了一次执行。

如果多个进程同时进来,那CPU时间片也是一个一个的运行。由于时间片的切换非常快,基本上都是在ms间完成的,所以进程的执行在宏观上是并发的,但是在微观上是串行的。

线程的三种状态

  • 就绪:在创建线程后存在等待cpu过来的执行的时间称为就绪状态
  • 运行:当cpu过来执行时就会转变成运行状态,而当cpu去执行别的线程时就会变回就绪状态
  • 阻塞:如果线程正在运行中而又发生了需要向硬盘发送访问请求等一系列需要耗时输入输出的操作时线程就会进入阻塞状态西就会转而执行其他线程,等到耗时操作结束后,之前阻塞状态的线程就会又变成就绪状态,而单核单线程cpu一次只能执行一个线程那就需要对每个线程轮流执行操作。


协程利用了线程等待的这个时间可以做别的事情了,协程要比线程节省资源的多。(协程切换任务源很小,效率高)

二、查看进程和控制进程

1、查看进程

ps -aux

查看静态的进程统计信息

a∶ 显示终端上的所有进程,包括其它用户的进程。
u∶ 表示列出进程的用户。
x∶ 显示所有终端的进程。

各列的解释∶

USER∶ 进程的用户。
PID∶ 进程的ID,在当前系统中是唯一的。
%CPU∶进程占用的CPU百分比。
%MEM∶占用内存的百分比。
VSZ∶ 该进程使用的虚拟内存量(KB)。
RSS∶ 该进程占用的物理内存量(KB)。
TTY∶启动进程的终端名。不是从终端启动的进程则显示为 ‘?’
STAT∶该进程的状态(D∶不可中断的休眠状态;R∶正在运行状态;S∶处于休眠状态,可被唤醒,就绪;T∶停止状态,可能是在后台暂停或进程处于跟踪调试状态; z∶ 僵尸进程,进程已经中止,但是部分程序还在内存当中)
······它们含意如下:
<:表示进程运行在高优先级上
N:表示进程运行在低优先级上
L:表示进程有页面锁定在内存中
s:表示进程是控制进程
1:表示进程是多线程的
+:表示当前进程运行在前台
D:系统守护进程
T:调式、程序执行一般停止
START∶ 该进程被触发启动时间。
TIME∶该进程实际使用CPU运行的时间。
COMMAND∶ 进程的启动命令。

记得:
D[aemon]:守护进程
R[unning]:正在运行
S[leep]:睡眠状态
Z[obie]:僵尸状态

优先级:
<:高优先级
N:低优先级
+:前台进程
1:该进程是多线程的

僵尸进程:

—个进程结束了, 但是如果该进程的父进程已经先结束了, 那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程, 如果是的话,就由Init来接管它,成为它的父进程,子进程退出后init会回收其占用的相关资源。

但是当子进程比父进程先结束,而父进程又没有回收子进程, 释放了进程占用的资源, 此时子进程将成为—个僵尸进程。

进程状态。常见的状态有以下几种:
-D:不可被唤醒的睡眠状态,通常用于I/0情况。
-R:该进程正在运行。
-S:该进程处于睡眠状态,可被唤醒
-T:停止状态,可能是在后台暂停或进程处于除错状态。
-W:内存交互状态(从2.6内核开始无效)
-X:死掉的进程(应该不会出现)。
☆-Z:僵尸进程。进程己经中止,但是部分程序还在内存当。
-<:高优先级(以下状态在BSD格式中出现)。
-N:低优先级。
-L:被锁入内存。
-S:包含子进程。
-l:多线程(小写工)
-+:位于后台。
-C:进程占用CPU的百分比

僵尸进程和孤儿进程怎么处理

我们也可以用ps -aux | grep pid 查看进程状态
1):一种比较暴力的做法是将其父进程杀死,那么它的子进程,即僵尸进程会变成孤儿进程,由系统来回收。但是这种做法在大多数情况下都是不可取的,如父进程是一个服务器程序,如果为了回收其子进程的资源,而杀死服务器程序,那么将导致整个服务器崩溃,得不偿失。显然这种回收进程的方式是不可取的,但其也有一定的存在意义。

2):SIGCHLD信号处理

我们都知道wait函数是用来处理僵尸进程的,但是进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。我们先来看看wait函数的定义

参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。但如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉,(事实上绝大多数情况下,我们都会这样想),我们就可以设定这个参数为NULL,就象下面这样:pid=wait(NULL);如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。

由于调用wait之后,就必须阻塞,直到有子进程结束,所以,这样来说是非常不高效的,我们的父进程难道要一直等待你子进程完成,最后才能执行自己的代码吗?难道就不能我父进程执行自己的代码,你子进程什么时候完成我就什么时候去处理你,不用一直等你?当然是有这种方式了。

实际上当子进程终止时,内核就会向它的父进程发送一个SIGCHLD信号,父进程可以选择忽略该信号,也可以提供一个接收到信号以后的处理函数。对于这种信号的系统默认动作是忽略它。我们不希望有过多的僵尸进程产生,所以当父进程接收到SIGCHLD信号后就应该调用 wait 或 waitpid 函数对子进程进行善后处理,释放子进程占用的资源。

怎么避免僵尸进程
(1)通过signal(SIGCHLD, SIG_IGN)通知内核对子进程的结束不关心,由内核回收。如果不想让父进程挂起,可以在父进程中加入一条语句:signal(SIGCHLD,SIG_IGN);表示父进程忽略SIGCHLD信号,该信号是子进程退出的时候向父进程发送的。
(2)父进程调用wait/waitpid等函数等待子进程结束,如果尚无子进程退出wait会导致父进程阻塞。waitpid可以通过传递WNOHANG使父进程不阻塞立即返回。
(3)如果父进程很忙可以用signal注册信号处理函数,在信号处理函数调用wait/waitpid等待子进程退出。
(4)通过两次调用fork。父进程首先调用fork创建一个子进程然后waitpid等待子进程退出,子进程再fork一个孙进程后退出。这样子进程退出后会被父进程等待回收,而对于孙子进程其父进程已经退出所以孙进程成为一个孤儿进程,孤儿进程由init进程接管,孙进程结束后,init会等待回收。
(5)杀死父进程。 如果僵尸进程的父进程还存在,找到这个父进程,kill掉它。这样就会变成2的情况,init会负责善后工作。

ps -elf

-e∶ 显示系统内的所有进程信息。
-l∶ 使用长格式显示进程信息。
-f∶ 使用完整的格式显示进程信息。
-a∶ 显示所有进程pid。
-T∶ 查看线程信息。

各列的解释∶

F∶ 内核分配给进程的系统标记。
S∶ 进程的状态。
**UID∶ 启动这些进程的用户。
**PID∶ 进程的进程ID。
**PPID∶父进程的进程号(如果该进程是由另一个进程启动的)。
**C∶进程生命周期中的CPU利用率。
PRI∶ 进程的优先级(越大的数字代表越低的优先级)。
NI∶谦让度值用来参与决定优先级。
ADDR∶进程的内存地址。
SZ∶ 假如进程被换出,所需交换空间的大致大小。
WCHAN∶ 若该进程在睡眠,则显示睡眠中的系统函数名。
STIME∶ 进程启动时的系统时间。
TTY∶ 进程启动时的终端设备。
**TIME∶ 运行进程需要的累计CPU时间。
**CMD∶ 进程的启动命令。

top命令

查看动态的进程统计信息

第一行 任务队列信息

11∶06∶48 系统时间

up 1∶22 系统已运行时长

1 user 当前登录用户数

load average: 0.06,0.60,0.48

系统负载,即单位时间内系统处理的任务数,后面三个数值分别为1分钟、5分钟、15分钟前到现在的平均值

第二行 进程信息

  • Tasks 总进程数
  • running 正在运行的进程数
  • sleeping 休眠的进程数
  • stopped 中止的进程数
  • zombie 僵死的进程数

第三行 CPU的信息

  • us——用户占用
  • sy——内核占用
  • ni——优先级调度占用
  • id——空闲CPU,要了解空闲的 CPU 百分比,主要看%id 部分
  • wa—— I/O 等待占用
  • hi——硬件中断占用
  • si——软件中断占用
  • st——虚拟化占用

第四行 内存信息

  • total 总内存空间
  • free 空闲内存

  • used 已用内存

  • buff/cache 物理内存和交换内存的缓冲区总和

第五行 交换空间的信息

  • total 总交换空间

  • free 空闲交换空间

  • used 已用交换空间

  • avail Mem 可用物理空间

进程信息区各列解释∶

  • PID 进程id
  • USER 进程所有者的用户名
  • PR 优先级
  • NI 谦让度值。负值表示高优先级,正值表示低优先级
  • VIRT 进程使用的虚拟内存总量,单位kb
  • RES 进程使用的物理内存大小,单位kb
  • SHR 共享内存大小,单位kb
  • S 进程状态
  • %CPU 上次更新到现在的CPU时间占用百分比
  • %MEM 进程使用的物理内存百分比
  • TIME+ 进程使用的CPU时间总计,单位1/100秒
  • COMMAND 命令名/命令行
top常用命令∶
  • P 键∶ 根据CPU使用百分比大小进行排序
  • M 键∶ 根据驻留内存大小进行排序
  • N 键∶ 根据启动时间进行排序
  • c 键∶ 切换显示命令名称和完整命令行
  • h 键∶ 可以获得 top程序的在线帮助信息
  • k 键∶根据提示输入指定进程的 PID 号并按 Enter 键终止对应的进程
  • q 键∶退出 top 程序
  • 数字1 键∶ 显示CPU个数和状态

pgrep查看进程信息

根据特定条件查询进程PID信息

pgrep -l "log"		#-l 显示进程名,缺省时只输出PID号  
pgrep -l -U         #指定特定用户 -t 指定终端 

pstree查看进程树

以树形结构列出进程信息
pstree命令默认情况下只显示各进程的名称,
结合以下常用的参数使用:

p:选项使用时可以同时列出对应的PID号
u:选项可以列出对应的用户名
a:选项可以列出完整的命令信息

执行如下的pstree-aup"命令可以查看当前系统的进程树,包括各进程对应的PID号、用户名、完整命令等信息。从输出结果中可以看出,systemd进程确实是Linux操作系统中所有进程的“始祖”

例1

pstree -apu 指定用户

2、控制进程

调度启动

在服务器维护工作中,经常需要执行一些比较费时而且较占用资源的任务(如数据备份),这些任务更适合在相对空闲的时候(如夜间)进行。这时就需要用户事先进行调度安排,指定任务运行的时间,当系统到达设定时间时会自动启动并完成指定的任务。调度启动的计划任务进程均在后台运行,不会占用用户的命令终端。
进程的调度启动可以通过at、crontab命令进行设置,其中at命令用于设置一次性(如12:15时重启网络服务)计划任务,crontab命令用于设置周期性运行(如每周五1广:30备份数据库)的计划任务。

使用at命令,设置一次性计划任务
使用crontab命令,设置周期性计划任务

• 前台启动: 用户输入命令,直接执行程序

• 后台启动: 在命令行尾加入“&”符号

进程的前后台调度

挂起当前的进程Ctrl+Z

当liunx操作系统中的命令正在前台执行时(运行尚未结束),按Ctrl+z组合键可以将当前进程挂起(调入后台并停止执行),这种操作在需要暂停当前进程并进行其他操作时特别有用。例如,打包usr并且调入后台,可以按Ctrl+Z组合键将该下载任务调入后台并暂停执行

tar zcvf usr.tar.gz /usr & 
nohup tar zcf usr.tar.gz /usr &
jobs 命令
查看处于后台的任务列表
jobs  -l

fg 命令

将后台进程恢复到前台运行,可指定任务序号

终止进程的运行

1) Ctrl + C 组合键

中断正在执行的命令

2) Kill、Killall命令
  • kill用于终止指定PID号的进程
  • killall用于终止指定名称相关的所有进程
  • -9选项用于强制终止

3) pkill命令

• 根据特定条件终止相应的进程

• 常用命令选项

  • -u: 根据进程所属的用户名终止相应进程
  • -t: 根据进程所在的终端终止相应进程
pgrep -l -U "指定用户” 输出进程和PID号
#查看
pkill -9 -U "指定用户”
#强杀

三、计划任务管理at

一次性计划任务
在 Linux 操作系统中,除了用户即时执行的命令操作以外,还可以配置在指定的时间、指定的日期执行预先计划的系统管理任务(如定期备份、定期采集监测数据)。CentOS 系统中默认已安装了 at、cronie 软件包,通过 atd 和 crond 这两个系统服务实现一次性、周期性计划任务的功能,并分别通过 at、crontab 命令进行计划任务设置

使用at命令设置的计划任务只在指定的时间点执行一次,前提是对应的系统服务atd必须已经运行。需要注意的是,计划执行任务的时间、日期必须安排在当前系统的时刻之后, 否则将无法正确设置计划任务。

设置一次性计划任务时,在 at 命令行中依次指定计划执行任务的时间、日期作为参数(若只指定时间则表示当天的该时间,若只指定日期则表示该日期的当前时间),确认后将进入带“at>”提示符的任务编辑界面,每行设置一条执行命令,可以依次设置多条语句,最后按 Ctrl+D 组合键提交任务。所设置的命令操作将在计划的时间点被依次执行。

例如,以下操作先通过 date 命令确认当前的系统时间,并设置在 2017 年 5 月 7 日的10:35 自动执行以下任务:统计该时间点系统中由 root 用户运行的进程的数量,并将该数值保存到**/tmp/ps.root** 文件中。

at [HH:MM] [yyyy-mm-dd]
任务设置完毕后按Ctrl+D组合键提交

例1
[root@kgc /]# date
2021年 08月 16日 星期一 16:20:58 +00
[root@kgc /]# at 16:23 2021-08-16
at> pgrep -U root | wc -l > /tmp/ps.root //过滤root下的所有进程,统计一共有多少进程(
at> 任务设置完毕后按Ctrl+D 组合键提交)
job 1 at Mon Aug 16 16:23:00 2021

[root@localhost ~]# cat /tmp/ps.root //等过了计划时间后验证命令结果202

例2

以下操作将设置一条计划任务,在当天的 21:30 自动关闭当前系统。

[root@localhost ~]# at 21:30
at> shutdown -h now
at>

对于已经设置但还未执行(未到时间点)的计划任务,可以通过 atq 命令进行查询。但已执行过的 at 任务将不会再出现在列表中。具体操作如下:

[root@localhost ~]# atq
2 Sun May 7 21:30:00 2017 a root

若要删除指定编号的 at 任务,可以使用 atrm 命令。删除后的 at 任务将不会被执行, 并且不会显示在 atq 命令的显示结果中,但已经执行过的任务无法删除。具体操作如下:

[root@localhost ~]# atrm 2 //删除第 2 条 at 计划任务
[root@localhost ~]# atq //确认第 2 条任务已被删除

四、crontab周期性任务设置

crontab 周期性任务设置
crond 通过多个目录和文件设置计划任务,不同类型的任务由不同的配置文件来设置。

1、/etc/crontab——系统任务配置文件

/etc/crontab 文件中设置的是维护 Linux 操作系统所需的任务,Linux 操作系统及相关程序在安装时可自动设置,不建议用户手动修改此文件。例如,该文件中包括设置 Shell 环境、可执行路径等变量的操作,以及每小时、每天、每周、每月需要执行的任务目录。执行如下的“cat /etc/crontab”命令可以查看/etc/crontab 文件的具体内容

周的数字为0或7时,都代表“星期天”的意思

时间数值的特殊表示方法
• * 表示该范围内的任意时间
• , 表示间隔的多个不连续时间点
• - 表示一个连续的时间范围
• / 指定间隔的时间频率

2、使用 crontab 命令管理用户的计划任务

设置用户的周期性计划任务列表主要通过 crontab 命令进行,结合不同的选项可以完成不同的计划任务管理操作。常用的选项如下。
-e:编辑计划任务列表。
-u:指定所管理的计划任务属于哪个用户,默认是针对当前用户(自己),一般只有 root 用户有权限使用此选项(用于编辑、删除其他用户的计划任务)。
-l:列表显示计划任务。
-r:删除计划任务列表。

总结

查看进程的命令(ps、 top、pgrep、 pstree)

进程控制:
启动进程、调度进程、终止进程

at命令 设置计划任务 (一次性任务)

crontab计划任务的配置字段 (周期性任务)

时间数值的特殊表示方法
• * 表示该范围内的任意时间
• , 表示间隔的多个不连续时间点
• - 表示一个连续的时间范围
• / 指定间隔的时间频率

[外链图片转存中…(img-Ptfjt3aS-1654510551357)]

更多推荐

第九章、程序和进程的关系

本文发布于:2023-06-13 16:55:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1385224.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:第九章   进程   关系   程序

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!