【Linux进程的状态】

目录

看Linux源码中的说法

如何查看进程状态?

各个状态的关系

僵尸进程

举个栗子

现象

僵尸进程的危害

孤儿进程

举个栗子

现象

进程的优先级

基本概念

为什么要有进程优先级?

查看系统进程

进程的大致属性

进程优先级vs进程的权限

Linux进程的优先级范围

查看进程优先级的命令

有关进程的其他概念


看Linux源码中的说法

  • 为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};
  • R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。

  • S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。

  • D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。

  • T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。

  • X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

如何查看进程状态?

各个状态的关系

  • 使用下面的命令

ps aux|ps axj
  • 我们让一个test程序一直执行,然后通过上面的命令进行查看,可以看见此时进程的状态是R+

僵尸进程

  • 僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程

  • 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。

  • 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态

举个栗子

  • 我们人为地创建一个僵尸进程

#include <stdio.h>
#include <stdlib.h>
int main()
{pid_t id = fork();if(id < 0){perror("fork");return 1;}else if(id > 0){ //parentprintf("parent[%d] is sleeping...\n", getpid());sleep(30);}else{printf("child[%d] is begin Z...\n", getpid());sleep(5);exit(EXIT_SUCCESS);}return 0;
}

现象

我们使用自动监视脚本来监视进程的状态,随后启动上面的程序,可以发现过来一会有一个进程变成Z状态了

while :; do ps aux |grep test; sleep 1; echo "==================";done 

僵尸进程的危害

  • 进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!

  • 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护?是的!

  • 那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!

  • 内存泄漏?是的!

  • 如何避免?后面会讲

孤儿进程

  • 父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?

  • 父进程先退出,子进程就称之为“孤儿进程”

  • 孤儿进程被1号init进程领养,当然要有init进程回收喽。

举个栗子

  • 同样的,我们人为制造出孤儿进程的情况

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{pid_t id = fork();if(id < 0){perror("fork");return 1;}else if(id == 0){//childprintf("I am child, pid : %d\n", getpid());sleep(10);}else{//parentprintf("I am parent, pid: %d\n", getpid());sleep(3);exit(0);}return 0;
}

现象

  • 同样使用监视脚本来监视进程状态,然后运行上面的程序,可以发现子进程在父进程退出后并没有立即退出,而是继续运行,且此时子进程的ppid从原父进程的ppid变成了1,这其实是bash的pid,这就是被“领养了”

进程的优先级

基本概念

  • cpu资源分配的先后顺序,就是指进程的优先权(priority)。

  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。

  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能

为什么要有进程优先级?

  • 因为操作系统的资源是有限的,所以必须将进程分为三六九等,保证很重要的进程能够优先获得资源

查看系统进程

  • 使用下面的命令

ps -l

进程的大致属性

  • UID : 代表执行者的身份

  • PID : 代表这个进程的代号

  • PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号

  • PRI :代表这个进程可被执行的优先级,其值越小越早被执行

  • NI :代表这个进程的nice值

进程优先级vs进程的权限

  • 进程的优先级保证进程的到资源,只不过得到资源的时间不同

  • 进程的权限是决定进程能还是不能的到某种资源

Linux进程的优先级范围

  • Linux采用两种不同的优先级范围,一种是nice值,另一种是实时优先级。

  1. nice值:nice值得范围是-20~19,默认值是0。越大的nice值意味着更低的优先级,也就是说nice值为-20的优先级最高。

  2. 实时优先级:实时优先级的范围是0~99,其值得意义与nice值相反。即:越高的实时优先级数值意味着进程优先级越高。Linux的进程可分为普通进程和实时进程,实时进程都是一些对响应时间要求比较高的进程,因此实时进程的优先级比普通进程的优先级要高。

  • Linux中进程默认的实时优先级为80

  • Linux支持动态优先级调整

  • pri(新) = pri(旧)+nice

  • 用户创建的进程的优先级范围一般是60~99,因为操作系统自己也会启动一些进程,要保证这些进程的优先级高于用户创建的进程的优先级

查看进程优先级的命令

  • top

  • 进入top后按“r”–>输入进程PID–>输入nice值

有关进程的其他概念

  • 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级

  • 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰

  • 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行

  • 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

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

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

相关文章

[Semi-笔记] 2023_TIP

目录 概要一&#xff1a;Conservative-Progressive Collaborative Learning&#xff08;保守渐进式协作学习&#xff09;挑战&#xff1a;解决&#xff1a; 二&#xff1a;Pseudo Label Determination for Disagreement&#xff08;伪标签分歧判定&#xff09;挑战&#xff1a;…

利用python进行接口测试及类型介绍

前言 其实我觉得接口测试很简单&#xff0c;比一般的功能测试还简单&#xff08;这话我先这样说&#xff0c;以后可能会删O(∩_∩)O哈&#xff01;&#xff09;&#xff0c;现在找工作好多公司都要求有接口测试经验&#xff0c;也有好多人问我&#xff08;也就两三个人&#x…

python离线安装依赖库 依赖库版本

问题&#xff1a;python开发过程中&#xff0c;下载安装某一功能模块&#xff0c;常常需要各种依赖库支持。如果在线安装&#xff0c;则非常方便简单&#xff0c;但往往需要离线下载所需的依赖库。但各种依赖库存在许多版本&#xff0c;如何准确快速知道我们所需要的依赖库呢&a…

解决微信小程序代码包大小限制方法

1 为什么微信小程序单个包的大小限制为 2MB 微信小程序单个包的大小限制为 2MB 是出于以下几个考虑&#xff1a; 保证小程序的启动速度&#xff1a;小程序的启动速度是影响用户体验的关键因素之一。如果包太大&#xff0c;会导致小程序启动时间过长&#xff0c;从而影响用户体…

node安装

这里写目录标题 https://nodejs.cn/ https://registry.npmmirror.com/binary.html?pathnode/ https://registry.npmmirror.com/binary.html?pathnode/v11.0.0/

初识CSS样式 与 文本背景样式

目录 前言: 1.什么是CSS: 2.关于css的主要特性: 2.1层叠性&#xff1a; 2.2继承性&#xff1a; 2.3优先级&#xff1a; 2.4.CSS的组成结构: 3.css样式的三种写法: 3.1内联样式&#xff1a; 3.1.2存在的优点和缺点: 3.2内部样式表&#xff1a; 3.2.2存在的优点和缺点:…

JAVA 100道题(11)

11.使用ArrayList存储一组整数&#xff0c;并编写一个方法打印所有偶数。 它使用ArrayList来存储一组整数&#xff0c;并编写一个方法来打印所有的偶数。 java复制代码 import java.util.ArrayList; public class Main { public static void main(String[] args) { // 创建一个…

[蓝桥杯 2019 省 A] 修改数组

题目链接 [蓝桥杯 2019 省 A] 修改数组 题目描述 给定一个长度为 N N N 的数组 A [ A 1 , A 2 , A 3 , . . . , A N ] A [A_1, A_2, A_3, ...,A_N] A[A1​,A2​,A3​,...,AN​]&#xff0c;数组中有可能有重复出现的整数。 现在小明要按以下方法将其修改为没有重复整数的…

Java实现Cache Aside Pattern 例子

简单的Java实现Cache Aside pattern &#xff1a; import java.util.HashMap; import java.util.Map;public class CacheAsidePattern {// 模拟数据库或其他数据源static class Database {private static Map<String, String> data new HashMap<>();static {data…

CAN总线Stuff Error

CAN总线Stuff Error&#xff0c;即填充错误&#xff0c;指的是在使用位填充编码的位流中&#xff0c;出现了第六个连续相同的位电平。这种错误通常发生在位填充机制被用于CAN总线通信中&#xff0c;以确保数据传输的正确性和稳定性。以下是一些可能导致Stuff Error的原因&#…

每日三个JAVA经典面试题(十九)

1.Java Concurrency API 中的 Lock 接口(Lock interface)是什么&#xff1f;对比同步它有什么优势&#xff1f;Java并发API中的Lock接口提供了一种比传统synchronized块或方法更灵活、更强大的线程同步机制。Lock接口允许更细粒度的锁控制&#xff0c;通过它可以实现更复杂的线…

一、rv1126开发之视频输入和视频编码

RV1126 H264/HEVC编码流程 一、RV1126编码的流程图&#xff1a; 二、每个代码模块详细讲解 2.1. VI模块的创建 VI模块的初始化&#xff1a;关键在于VI_CHN_ATTR_S结构体&#xff0c;这个结构体是VI设置的结构体。这个结构体的成员变量包括&#xff1a;pcVideoNode&#xff0…

php实现二进制权限控制示例,二进制权限控制实现思路,二进制权限控制逻辑,二进制权限控制好处,二进制权限控制弊端,二进制权限控制存权限查权限

背景:在群里看到大佬们分享这个知识点自己实操了一下做了个总结 1.二进制权限控制实现原理思路及逻辑 对于二进制权限控制,一个常见的做法是将权限用一个整数表示,然后将这个整数转换为二进制进行存储和查找。以下是一种简单的实现思路: 存储权限信息: 将权限信息转换为…

震惊!!!原来这就是操作系统

震惊!!!原来这就是操作系统 一:什么是操作系统1:管理2:操作系统的组成 二:进程:1:概念2:进程的管理方式2.1:描述2.2:组织 一:什么是操作系统 CPU,内存,硬盘…这些都是硬件,而操作系统就是软件,可以让计算机按照一定的规则进行执行. 软件是一组指令的集合, 1:管理 **操作系统…

flask之请求钩子

请求钩子是通过装饰器的形式实现&#xff0c;Flask支持如下四种请求钩子&#xff1a; 1、before_first_request: 在第一次请求处理之前先被执行 2、before_request: 在每次请求前执行 3、after_request: 在每次请求处理之后被执行 接受一个参数&#xff1a;视图函数的响应在…

[力扣 129]求根节点到叶节点之和

题目描述&#xff1a; 思路&#xff1a; 可以采用递归回溯。递归访问左->右->根节点并记录路径。到叶节点后&#xff0c;计算数字并相加。 代码&#xff1a; class Solution:def sumNumbers(self, root: TreeNode) -> int:res 0path []def backtrace(root):nonl…

Python如何行转列代码

在Python中&#xff0c;如果你想要对数据框&#xff08;DataFrame&#xff09;中的某一列进行操作&#xff0c;你可以使用Pandas库&#xff0c;这是处理数据时常用的一个库。以下是一个简单的例子&#xff0c;展示了如何对DataFrame中的某一列进行操作&#xff1a; 首先&#…

anuglar中获取iframe对象, 用iframe进行postMessage通信

如果你想在 Angular 中获取 iframe 对象并确保 iframe 加载完成后调用 postMessage 发送消息&#xff0c;可以按照以下步骤进行操作&#xff1a; 在 HTML 模板中&#xff0c;使用 ngIf 来控制 iframe 的显示与隐藏&#xff0c;并为 iframe 添加一个标识符&#xff08;例如 #my…

ISBN号码

题目描述 每一本正式出版的图书都有一个 ISBN 号码与之对应&#xff0c;ISBN 码包括 99 位数字、11 位识别码和 33 位分隔符&#xff0c;其规定格式如 x-xxx-xxxxx-x&#xff0c;其中符号 - 就是分隔符&#xff08;键盘上的减号&#xff09;&#xff0c;最后一位是识别码&…

Autosar Crypto Driver学习笔记(二)

文章目录 Crypto DriverFunction definitionsGeneral APICrypto_InitCrypto_GetVersionInfo Job Processing InterfaceCrypto_ProcessJob Job Cancellation InterfaceKey Management InterfaceKey Setting Interface密钥设置接口Crypto_KeyElementSetCrypto_KeySetValid Key Ex…