第五篇:Linux进程的相关知识总结(1)

news2024/11/14 7:09:27

目录

第四章:进程

4.1进程管理

4.1.1进程管理需要的学习目标

4.1.1.1了解进程的相关信息

4.1.1.2僵尸进程的概念和处理方法:

4.1.1.3PID、PPID的概念以及特性:

4.1.1.4进程状态

4.1.2进程管理PS

4.1.2.1静态查看进程

4.1.2.1.1自定义查看进程的列信息

4.1.2.1.2进程排序(默认为升序排序)

4.1.2.1.3进程的父子关系

4.1.2.2动态查看进程

4.1.2.2.1top的选项


第四章:进程

4.1进程管理

4.1.1进程管理需要的学习目标

4.1.1.1了解进程的相关信息

        进程的概念:进程:进程是已启动的可执行程序的运行,实例echo、read带有这种单词的就是一个程序,进程存储在内存中,内存速度很快。

        进程的组成:进程标识符(PID):每个进程都有一个唯一的数字标识符,用于区分系统中的不同进程。

  1. 程序计数器(Program Counter, PC):指示了进程将要执行的下一条指令的地址。
  2. 寄存器集合:包括但不限于:
  1. 内存映像:进程的内存空间,包括:
  1. 文件描述符表:包含进程打开的所有文件和设备的引用。
  2. 环境变量:定义了进程执行时所需的环境信息。
  3. 当前工作目录:进程的当前目录,用于解析相对路径。
  4. 信号处理:定义了进程如何响应各种信号。
  5. 进程状态:如运行中(Running)、等待(Waiting)、停止(Stopped)或僵尸(Zombie)状态。
  6. 进程优先级:影响进程获得CPU时间片的频率。

程序与进程的区别:

        程序:通常是通过某种语言编写的文本文件,一旦我们把程序执行起来了就是进程,Linux中./+文件名就是运行的意思,程序存储在外存中,但是外存很慢

        程序编程进程之后的变化:简单来说程序就是还没被运行的计算机指令的集合,进程是计算机中当前正在前端或者后端运行的程序。程序变成进程之后会拥有一些东西

程序变成进程之后会拥有:

1.内存资源,程序在硬盘中,进程在内存中

2.CPU资源,CPU的1s 被分成了1000份(分片),有一个或者多个片来处理进程,占有CPU的0.2%的时间来处理。

3.网络资源,程序运行的时候可能会占用网络资源

4.名字PID(process Identify)

5.权限、自我复制等等。。。。。。

        图解如下(最左侧alice为未被执行的初始程序):

进程的生命周期:

        系统引导:计算机启动时,BIOS或UEFI固件首先执行,它会找到启动设备(如硬盘),并加载引导加载程序(Bootloader)。

  1. 加载操作系统:引导加载程序加载操作系统内核到内存中,并将其执行。操作系统内核是操作系统的核心部分,负责管理系统资源和控制硬件。
  2. 初始化进程创建:操作系统内核初始化后,会创建第一个用户空间的进程,通常这个进程的进程ID(PID)是1。在Linux系统中,这个进程是init,在Windows系统中,是smss.exe(Session Manager Subsystem)。由init生成的进程我们也叫它孩子进程,当CPU执行孩子进程的时候父进程是休眠的,因为CPU没有更多的算力投入到Process父进程的计算中了。
  3. 读取启动配置:第一个进程会根据操作系统的配置文件(如/etc/inittab在某些Linux发行版中,或注册表中的启动项在Windows中)来确定需要启动哪些服务和应用程序。
  4. 创建子进程
  1. 进程间通信:新创建的进程可能会需要与其他进程通信,操作系统提供了多种进程间通信(IPC)机制,如管道、消息队列、共享内存、套接字等。
  2. 用户登录:在多用户系统中,第一个进程或其子进程之一会负责启动登录管理器,允许用户登录系统。
  3. 桌面环境和会话管理:在用户登录后,会话管理器或类似的进程会启动桌面环境和用户的个人应用程序。
  4. 持续管理:第一个进程或其子进程可能还负责持续监控和管理系统的运行状态,包括处理系统日志、资源监控等。
  5. 正常结束的进程会重新返回到父级进程Process中,非正常结束的进程会变成Zombie僵尸进程。

4.1.1.2僵尸进程的概念和处理方法:

        僵尸进程(Zombie Process)是一个已经完成执行但尚未被其父进程回收其进程描述符(即调用wait()或waitpid()系统调用)的进程。在Linux和其他类Unix操作系统中,僵尸进程占用系统资源,特别是进程表项,但不会消耗CPU时间。僵尸进程的进程描述符在进程终止后仍然保留在系统中,直到父进程调用了wait()或waitpid()来显式地回收它。

僵尸进程通常出现在以下情况:

  • 子进程已经完成其执行并退出。
  • 父进程没有调用wait()或waitpid()来读取子进程的退出状态。

僵尸进程的特征

  • 它在进程列表中显示为“Z”状态。
  • 它占用进程ID(PID)但不占用其他资源。
  • 如果父进程没有正确处理,僵尸进程会一直存在。

解决方法

  1. 显式回收:
            父进程应该调用wait()或waitpid()来显式地回收子进程的资源。这会读取子进程的退出状态,并释放其进程描述符。
  2. 使用wait()的循环:
            在某些情况下,父进程可能不知道何时子进程会退出。在这种情况下,可以在父进程中使用一个循环来调用wait(),这样可以回收所有已经终止的子进程。
  3. 设置忽略子进程退出信号:
            在某些编程实践中,可以通过设置子进程的信号处理函数来忽略SIGCHLD信号,然后周期性地调用waitpid(),传递-1作为第一个参数,这样会回收任何状态改变的子进程。
  4. 使用waitpid():
            使用waitpid()可以指定等待特定PID的子进程,或者使用-1来等待任何子进程。
  5. 避免创建僵尸进程:
             

            在程序设计时,确保每个子进程都有一个父进程来管理它。

            使用守护进程(Daemon)来管理子进程,确保它们被适当地回收

  6. 使用ps命令检查:
            使用ps命令加上适当的选项(如-e或-a)来检查系统中的僵尸进程。
  7. 重启系统:
            如果僵尸进程过多,影响系统性能,重启系统可以清除所有进程,包括僵尸进程。
  8. 使用脚本或工具:
            可以编写脚本或使用系统管理工具来监控和清理僵尸进程。

        僵尸进程本身不会对系统造成直接的损害,但过多的僵尸进程可能会耗尽系统资源,导致新进程无法启动。因此,正确管理子进程的生命周期是避免僵尸进程问题的关键。

4.1.1.3PID、PPID的概念以及特性:

        PID:当一个操作系统运行进程时,系统会自动为其分配一个唯一的标识符,这个标识符就是PID。PID是一个非零整数,具有唯一性,用于标识一个进程。PID一旦被分配给一个进程,就会伴随该进程的整个生命周期,直到进程结束。PID的目的是为了便于操作系统管理和标记进程。当进程的生命周期终止时,其PID会被释放,之后的进程可以再次使用这个PID。

PID(进程标识符)的特性

  • 唯一性:PID是一个整数,用于唯一地标识系统中的每个进程。
  • 范围:PID的范围通常从1到32767,但这个范围可以根据系统配置进行调整。
  • 生命周期:PID在进程的整个生命周期内保持不变,直到进程终止。
  • 特殊值:PID 1通常被分配给系统中的第一个用户级进程,即init进程,它是所有其他用户级进程的祖先。

        PPID:在Linux系统中,PPID代表的是父进程的PID,即父进程的进程号。当一个进程被创建时,创建它的那个进程被称为父进程,而子进程通过PPID指出其父进程。PPID也是一个非零整数,与PID一样,用于标识进程之间的关系。通过编程调用getpid函数可以获取自身的进程标识符,而getppid函数则用于获取父进程的进程标识符。

PPID(父进程标识符)

  • 关系:PPID是一个整数,表示创建当前进程的父进程的PID。
  • 继承:当一个新进程被创建时,它会从其父进程那里继承PPID的值。
  • 用途:PPID用于追踪进程的家族树,即进程之间的父子关系。
  • 特殊值:如果一个进程的PPID为0,这通常意味着它是一个守护进程(Daemon),或者是由于某些原因父进程已经终止,而子进程变成了孤儿进程,随后被init进程收养。

处理孤儿进程

  • 当一个父进程终止时,它的子进程如果没有被其他进程收养,就会变成孤儿进程。操作系统通常会将孤儿进程的PPID设置为1,即init进程,这样init进程就会在孤儿进程终止时回收其资源。
4.1.1.4进程状态

        进程的状态共分为四类:R(运行中的进程)、S(睡眠的进程)、T(停止的进程)、Z(僵尸进程)

如果出现R+、S+等命令说明优先级比较高,如果有需要CPU会优先处理它。

4.1.2进程管理PS

4.1.2.1静态查看进程

        在Linux中我们一般使用PS命令来完成对命令的静态查看。

ps aux

        ps aux表示打开进程管理器,也可以使用ps a、ps u、ps x分别进行进程信息的查看,只不过它们略有不同,a选项表示显示所有终端的进程,包括其他用户的进程。u选项表示以用户友好的方式显示进程信息,包括用户、PID、CPU使用率、内存使用率、命令等。x选项表示显示没有控制终端的进程,即那些与终端无关的进程(下图则展示了a、u、x的三种不同的查看方式)。

配合管道(后期会讲)我们可以完成对进程更多的操作

例如:

ps aux | head -1

表示查看进程的表头,输出字段的含义

静态查看进程所显示的信息(如下图所示):

USER:运行进程的用户名。

PID:进程的ID。我们通过PID来杀死进程

%CPU:进程占用的CPU百分比。占了cpu百分之多少的资源,也称CPU占用率

1以下消耗不大,1以上消耗过大

%MEM:进程占用的内存百分比。

VSZ:虚拟内存大小(Virtual Size),进程使用的虚拟内存总量。

硬盘中我们拿出一部分当假内存使用,就叫做虚拟内存

RSS:实际内存大小(Resident Set Size),进程实际占用的物理内存量。

TTY:进程所在的终端类型,比如 pts/0 表示一个伪终端,只有自己一个窗口,本机打开。

pts/1表示文件在1号窗口远程打开,我们也可以通过控制终端名称杀死进程

STAT:进程的状态,例如 R 表示运行,S 表示睡眠。Z表示卡了,僵尸程序需要重启一下

START:进程的启动时间。

TIME:进程占用CPU的总时间。单位为秒,CPU处理文件的时间

COMMAND:启动进程的命令

4.1.2.1.1自定义查看进程的列信息

        如果我们不想一次性查看进程的那么多的信息,假设我们只想查看进程的创建者、进程号、父级进程号、内存占用我们也可以使用PS命令,只不过选项不同

ps axo user,pid,ppid,%mem

        注意事项:我们使用自定义查看进程信息的命令是axo不是aux,其次,属性列之间使用逗号进行分隔

4.1.2.1.2进程排序(默认为升序排序)

        我们学会了使用自定义查看命令之后,假设我们还是想要user,pid,ppid,%mem查看这些自定义进程信息,但是在这些信息中有一个内存占用较高的前四项我要进行删除,我们可以将自定义进程属性列和排序功能进行结合。

ps axo user,pid,ppid,%mem --sort=-%-mem

排序的语法是--sort = 按照什么进行排序(如下图所示)

        如果想要从小到大进行排序则要将“按照什么进行排序"的前面的‘-’删除

ps axo user,pid,ppid,%mem --sort=-%mem

        我们发现计算机中会存在很多进行我们输入一遍命令之后会弹出很多行,但是我们又想进行排序又不想数据那么长,我们只想查看内存占用最高的那前几个,我们可以将自定义进程属性列、排序命令与管道相结合,创造出既可以自定义查看内容又可以进行排序还不会显得数据冗余过长,快速的找出我们想要的数据(如下图,我们找出了内存占比最高的两个进程)

ps axo user,pid,ppid,%mem --sort=-%mem | head -3

        耗费cpu最多的程序是gnome-shell,gnome-shell:Windows的图形程序。PID为2160,kill之后桌面会崩溃,CPU占用率0.7,内存占用率10.7%(具体数值分情况讨论)

利用上述命令我们对就可以查看到内存排序的进程了,删除进程我们后期再讲。

4.1.2.1.3进程的父子关系

        通过上述的基础理论知识学习,我们已经搞明白了何为父进程,何为子进程,而且明白了PID和PPID的概念以及父子进程的相互关系,那么我们在计算机中是如何查看哪些进程的父进程是谁呢?Linux中给我们提供了ps -ef命令。

ps -ef命令是一个常用的命令行工具,用于显示系统中所有进程的详细信息。这个命令的参数组合如下:

  • -e:显示所有进程。
  • -f:以完整格式显示进程列表,包括更多的信息,例如用户、终端、CPU和内存使用率等。

执行ps -ef后,你将获得一个包含许多列的长列表,显示了所有进程的详细信息。

ps -ef弹出的属性列为:

1.UID:用户ID

2.PID:程序ID(1号进程名称为system,操作系统本身的进程就是这个)

3.PPID:父系程序ID,PPID不为零说明有亲爹,PPID定位到PID就是那个进程的爹

4.C:CPU使用率的百分比(CPU usage),表示进程占用的CPU资源比例。

5.STIME:启动时间(start time)

6.TTY:终端

7.TIME:运行时间

8.CMD:程序名称

示例:ps -ef

假设A的PID是2 PPID是0

假设B的PID是0 PPID是2

那么B的爹就是A

PPID->PID

PPID映射PID

4.1.2.2动态查看进程top

        PS静态查看进程的优点是不会过多的占用系统资源,但是如果我们想要实时查看进程信息的话用什么命令来实现呢?我们可以使用top命令完成对进程的实时查看

top

使用top 显示的信息一般有五行12列

五行(如下)

第一行:

top - 18:15:32 up 1 day ,12:18, 5 users, load average:0.00,0.06,0.06

程序名 - 系统时间 运行时间 登录用户数 cpu平局在5、10、15分钟内负载均衡的值

第二行(关于进程的汇总信息):

Tasks:361 total, 1running,360 sleeping, 0 stopped, 0 zombie

任务总数,正在运行的任务数,睡眠数、停止数、僵尸数

第三行(Cpu占用率):

%cpu(s)13.4us,5.7sy,0.0ni,80.8id,0.0wa,0.0hi,0.0si,0.0st

us表示由人执行的程序占用了多少cpu(%)

sy则表示系统

ni表示设置优先级的程序运算占用Cpu多少

id表示空闲Windows中的 Sysytem Idle进程代表了cpu还剩多少进程可用,不是占领了高的cpu占用率

wa表示等待

hi表示硬件

st表示虚拟机

第四行:

KiB MeM:2027936 total,80160 free, 1557772 used, 390004 buff/cache

物理内存总大小 闲置的物理内存大小 已经使用的物理内存 cache缓存的大小

第五行(虚拟内存,交换空间):

KiB Swap:2097148total,1199612 free, 897536 used。182468 avail Mem

虚拟内存总大小 空闲 已经使用的虚拟内存

十二列(如下)有

PID:进程编号

USER:谁启动的该进程

PR:系统优先级

NI:用户自定义优先级

VIRT

RES

SHR

这三个字母表示内存

S:状态

%CPU:CPU占用率

%MEM

TIME+:运行耗时

COMMAND:程序名

4.1.2.2.1top的选项

        我们在输入top命令(如上)实时显示出进程信息的时候,top窗口会实时监听用户键盘的输入,当我们输入固定的指令的时候计算机才会执行相应的步骤

具体的指令如下:

h:获取帮助

M:按内存占比对进程进行排序

P:按CPU的占比进行排序

N:按PID的大小进行排序

< :向前翻页(需要按住SHIFT)

>:向后翻页(需要按住SHIFT) Z:设置字体为彩色

top的其他操作:

1.当我们想要将top的更新时间调整的更加频繁或者更加平缓,我们可以使用

top -d n (n为用户输入的数字,单位为秒)

来定义top命令的刷新时间

top每n秒刷新一次

例如:

top -d 0.2

top动态进程查看每0.2秒刷新一次

2.结束top窗口

我们可以输入ctrl + cESCQ键来退出top窗口

        当然,进程仍涉及到像优先级、进程信号、如何查看内存、如何查看磁盘空间、作业控制Jobs、虚拟文件系统等知识,大家不要急,我们马上就会讲到~

        还是那句话,如果文章中哪些地方有问题或者不明白评论发即可~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2161740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建EMQX MQTT服务器并接入Home Assistant和.NET程序

本文主要介绍如何使用Docker搭建EMQX MQTT服务器&#xff0c;并将其接入到Home Assistant中&#xff0c;最后演示如何使用.NET接入MQTT。 1. 背景 在智能家居系统中&#xff0c;MQTT&#xff08;消息队列遥测传输协议&#xff09;是一种轻量级的消息传输协议&#xff0c;特别适…

《深度学习》—— 神经网络中的数据增强

文章目录 一、为什么要进行数据增强&#xff1f;二、常见的数据增强方法1. 几何变换2. 颜色变换3. 尺寸变换4. 填充5. 噪声添加6. 组合变换 三、代码实现四、注意事项五、总结 一、为什么要进行数据增强&#xff1f; 神经网络中的数据增强是一种通过增加训练数据的多样性和数量…

动态规划11,完全背包模板

NC309 完全背包 问题一&#xff1a;求这个背包至多能装多大价值的物品&#xff1f; 状态表示&#xff1a;经验题目要求 dp[i][j] 表示 从前i个物品中挑选&#xff0c;总体积不超过j&#xff0c;所有选法中&#xff0c;能选出来的最大价值。 状态转移方程 根据最后一步的状态&a…

vue2 搜索高亮关键字

界面&#xff1a; 搜索 “成功” 附上代码&#xff08;开箱即用&#xff09; <template><div class"box"><input class"input-box" v-model"searchKeyword" placeholder"输入搜索关键字" /><div class"r…

【深度】边缘计算神器之数据网关

分布式计算、云边协同、互联互通是边缘计算设备的三项重要特征。 边缘计算设备通过分布式计算模式&#xff0c;将数据处理和分析任务从中心化的云平台下放到设备网关&#xff0c;即更接近数据源的地方&#xff0c;从而显著降低了数据传输的延迟&#xff0c;提高了响应速度和处…

OpenCV normalize() 函数详解及用法示例

OpenCV的normalize函数用于对数组&#xff08;图像&#xff09;进行归一化处理&#xff0c;即将数组中的元素缩放到一个指定的范围或具有一个特定的标准&#xff08;如均值和标准差&#xff09;。它有两个原型函数, 如下: Normalize()规范化数组的范数或值范围。当normTypeNORM…

拾色器的取色的演示

前言 今天&#xff0c;有一个新新的程序员问我&#xff0c;如何确定图片中我们需要选定的颜色范围。一开始&#xff0c;我感到对这个问题很不屑。后来&#xff0c;想了想&#xff0c;还是对她说&#xff0c;你可以参考一下“拾色器”。 后来&#xff0c;我想关于拾色器&#…

C++ std::any升级为SafeAny

std::any测试 #include <any>class A { public:int8_t a; };int main(int argc, char* argv[]) {std::any num((int8_t)42);auto a std::any_cast<A>(num);return 0; }异常&#xff1a; 0x00007FFA9385CD29 处(位于 test.exe 中)有未经处理的异常: Microsoft C 异…

通信工程学习:什么是NFVO网络功能虚拟化编排器

NFVO&#xff1a;网络功能虚拟化编排器 NFVO&#xff08;Network Functions Virtualization Orchestrator&#xff09;&#xff0c;即网络功能虚拟化编排器&#xff0c;是网络功能虚拟化&#xff08;NFV&#xff09;架构中的核心组件之一。NFV是一种将传统电信网络中的网络节点…

Health Check

强大的自愈能力是Kubernetes这类容器编排引擎的一个重要特性&#xff0c;自愈的默认实现方式是自动重启发生故障的容器&#xff0c;除此之外&#xff0c;用户还可以利用Liveness和Readiness探测机制设置更精细的健康检查&#xff0c;进而实现如下需求&#xff1a; 零停机部署避…

c++优先队列priority_queue(自定义比较函数)

c优先队列priority_queue&#xff08;自定义比较函数&#xff09;_c优先队列自定义比较-CSDN博客 373. 查找和最小的 K 对数字 - 力扣&#xff08;LeetCode&#xff09; 官方题解&#xff1a; class Solution { public:vector<vector<int>> kSmallestPairs(vecto…

开源UNI-SOP云统一认证平台

今天给大家分享一款开源的商用级别认证平台UNI-SOP&#xff0c;这块软件分为开源版本和专业版本&#xff0c;由于专业版涉及到一些代码授权问题&#xff0c;暂时未开源&#xff0c;不过&#xff0c;一般应用开源版本足够了。 先来看看系统管理平台界面&#xff0c;然后我们再来…

[OPEN SQL] SELECT语句

本次操作使用的数据库表为SCUSTOM&#xff0c;其字段内容如下所示 航班用户(SCUSTOM) 1.SELECT语句 SELECT语句从数据库表中读取必要的数据 1.1 读取一行数据 语法格式 SELECT SINGLE <cols>... WHERE cols&#xff1a;数据库表的字段 从数据库表中读取一条数据可使…

[数据结构]动态顺序表的实现与应用

文章目录 一、引言二、动态顺序表的基本概念三、动态顺序表的实现1、结构体定义2、初始化3、销毁4、扩容5、缩容5、打印6、增删查改 四、分析动态顺序表1、存储方式2、优点3、缺点 五、总结1、练习题2、源代码 一、引言 想象一下&#xff0c;你有一个箱子&#xff08;静态顺序…

武汉大学首个人形机器人来了!

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 AI圈又发生了哪些新鲜事&#xff1f; 武汉大学展示首个人形机器人“天问”&#xff1a;1.7米高&#xff0c;65公斤重&#xff0c;36个自由度 武汉大学近日展示了其首个人形机器人“天问”&#xff0…

屏幕演示工具 | 水豚鼠标助手 v1.0.7

水豚鼠标助手是一款功能强大的屏幕演示工具&#xff0c;专为Windows 10及以上系统设计。这款软件提供了多种实用功能&#xff0c;旨在增强用户的屏幕演示体验&#xff0c;特别适合教师、讲师和需要进行屏幕演示的用户。鼠标换肤&#xff1a;软件提供多种鼠标光标样式&#xff0…

国庆出行新宠:南卡Pro5骨传导耳机,让旅途不再孤单

国庆长假即将来临&#xff0c;对于热爱旅行和户外运动的朋友们来说&#xff0c;一款适合旅行使用的耳机无疑是提升旅途体验的神器。今天&#xff0c;我要向大家推荐一款特别适合国庆出行的耳机——南卡Runner Pro5骨传导耳机。作为一名热爱旅游的体验者&#xff0c;我强烈推荐南…

2024年主流前端框架的比较和选择指南

在选择前端框架时&#xff0c;开发者通常会考虑多个因素&#xff0c;包括框架的功能、性能、易用性、社区支持和学习曲线等。以下是一些主流前端框架的比较和选择指南。 1. 主流前端框架简介 React 优点: 组件化开发&#xff0c;易于复用和维护。虚拟DOM提高了性能。强大的生…

Java 中创建线程几种方式

目录 概述 一. 继承Thread类 1. 特点 2. 注意事项 3. 代码示例 二. 实现Runnable接口 1. 特点 2. 注意事项 3. 代码示例 三. 实现Callable接口 1. 特点 2. 注意事项 3. 代码示例 概述 在Java中&#xff0c;线程&#xff08;Thread&#xff09;是程序执行的最小单…

Java面试篇基础部分-Synchronized关键字详解

Synchronized关键字用于对Java对象、方法、代码块等提供线程安全操作。Synchronized属于独占式的悲观锁机制,同时也是可重入锁。我们在使用Synchronized关键字的时候,可以保证同一时刻只有一个线程对该对象进行访问;也就是说它在同一个JVM中是线程安全的。   Java中的每个…