进程状态和优先级【Linux】

news2025/1/18 2:06:54

1.进程状态的分类

在Linux内核中,进程状态分为七大类,不同的状态有不同的含义。
下面的状态在kernel中定义:

/*
* 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 */
};

在下面的状态讲解中是概念定义加实操的方式,感兴趣的老铁可以边看边做。

1.1.R运行状态

R运行状态:处在运行状态的进程不一定正在运行,运行状态的定义是进程在运行队列中的进程就是运行状态。

//测试代码
#include <stdio.h>
#include <unistd.h>

int main()
{
	while()
	{}
	return 0;
}

在这里插入图片描述

1.2. S睡眠状态

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

//测试代码
#include <stdio.h>
#include <unistd.h>

int main()
{
	while()
	{
		printf("hello bit\n");
	}
	return 0;
}
//注:问:为什么这里加个printf进程状态就变成S状态了?
//答:printf是一个需要访问硬件(显示器)的库函数,由于硬件相比于CPU速度相对较慢,而CPU不可能安安静静的等待进程访问硬件,所以OS把这个进程状态设置为S,让进程自己慢慢的等待硬件,CPU继续执行运行队列下一个进程。

在这里插入图片描述

1.3.D磁盘休眠状态

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

这个状态的场景比较难以实现,只有系统在高IO的时候,系统才能出现这个状态。当一个机器中这个状态大面积出现的时候,离机器挂掉也不远了。这里我们也不在实现了。

1.4.T停止状态

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

1.4.1.kill -l指令

指令:kill -l
作用:查看系统中的信号
在这里插入图片描述

//此处的测试用例和睡眠状态的测试用例一样,我们需要在睡眠状态的时候给它发送一个暂停信号
#include <stdio.h>
#include <unistd.h>

int main()
{
	while()
	{
		sleep(1);
	}
	return 0;
}

给S+状态的进程发送一个19号信号
在这里插入图片描述
如果在给T状态的进程发送18号信号,它会变成一个后台进程(s+代表前台进程,s代表后台进程)
在这里插入图片描述

1.4.2.前台进程和后台进程

前台进程:是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随之消失。
后台进程:也叫守护进程(Daemon),是运行在后台的一种特殊进程,不受终端控制,它不需要终端的交互;Linux的大多数服务器就是使用守护进程实现的。比如Web服务器的httpd等。

1.5.X死亡状态

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

2.进程状态查看

指令:ps aux / ps axj命令
作用:查看系统中的所有进程
在这里插入图片描述

3.Z(zombie)僵尸进程

  • 僵尸进程是一个比较特殊的状态,当子进程退出,但是父进程没有回收子进程,就会产生僵尸状态
  • 僵尸进程会以终止状态保持在进程表中,并且会一直等待父进程读取退出码。
  • 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程会进入Z状态。

测试代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
    pid_t id = fork();
    if(id == 0)
    {                                                                                                                  
        //child
        int cnt = 5;
        while(cnt--)
        {
            printf("I am child process:pid = %d,ppid = %d\n",getpid(),getppid());
            sleep(1);
        }
        //子进程循环五次变会退出
        exit(-1);
    }
    else if(id > 0)
    {
    	//让父进程一直循环,但并没有回收子进程的资源
        while(1)
        {
            printf("I am parent process:pid = %d,ppid = %d\n",getpid(),getppid());
            sleep(1);
        }
    }

    return 0;
}

在这里插入图片描述

3.1.僵尸进程的危害

  • 进程退出状态必须被维持下去,因为它要告诉它的进程(父进程)你交给我的任务,我办得怎么样。可是,如何父进程一直不读取,那子进程一直处于Z状态?对的。
  • 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在tast_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直要维护吗?是的。
  • 那一个父进程创建了许多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构对象本身就要占用内存。
  • 会造成内存泄漏?是的。

4.孤儿进程

孤儿进程:如果父进程先退出,子进程被1号Init进程领养,这时子进程就称为孤儿进程

//测试代码,让父进程循环10,退出程序,子进程一直跑
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        //child 
        while(1)
        {
            printf("I am child process:pid = %d,ppid = %d",getpid(),getppid());  
            sleep(1);                   
        }  
    }                                   
                                        
    if(id > 0)                                                                                                         
    {                                   
        //parent                        
        int cnt = 10;                   
        while(cnt--)                    
        {                                                                         
            printf("I am parent process:pid = %d,ppid = %d",getpid(),getppid());  
            sleep(1);                   
        }                               
        exit(-1);                                                                                        
    }                                                                                                    
                                                                                                         
    return 0;    
}

在这里插入图片描述

注意:孤儿进程并不会造成内存泄漏,因为子进程被1号进程领养了,1号进程会读取子进程的返回信息。

5.进程优先级

5.1.基本概念

  • CPU资源分配先后顺序,就是指进程的优先权
  • 优先权高的进程有优先执行权力,配置进程的优先级对多任务环境很有用,可以改善系统性能。
  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU上,可以大大改善系统整体性能。

5.2.查看系统进程

指令:ps -l
作用:查看系统性能
在这里插入图片描述

  • UID:代表执行者的身份。
  • PID:代表这个进程的代号。
  • PPID:代表这个进程是由那个进程发展而衍生而来,亦即父进程的代号。
  • PRI:代表这个进程可执行的优先级,其值越小越早执行。
  • 代表这个进程的nice值。

5.3.PRI and NI

进程优先级 = 老的优先级 + nice值(其中老的优先级恒等于80,nice值的范围是-20到19,通过改变nice的大小,更改进程的优先级)。

  • PRI越小,进程优先级越高
  • NI(nice)表示进程可执行优先级的修正数据
  • 通过调整nice的值,来改变优先级,但本身nice值不是进程的优先级,只是nice值会影响到优先级

5.4.用top命令更改已存在进程的nice值

步骤:进入top后按“r”->输入进程的PID->输入nice值 ->q退出
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

深度学习笔记--Transformer中position encoding的源码理解与实现

1--源码 import torch import math import numpy as np import torch.nn as nnclass Pos_Embed(nn.Module):def __init__(self, channels, num_frames, num_joints):super().__init__()# 根据帧序和节点序生成位置向量pos_list [] for tk in range(num_frames):for st in ran…

感知机的认识和简单的实现

一、感知机perceptron 1.1 感知机的信号 只有0和1两种取值 1.2 神经元会计算传递过来的信号总和 只有当信号总和超过某个界限的时候&#xff0c;神经元才会被激活 1.3 信号权重 不同的权重对应的信号的重要性越高 二、常见的逻辑电路 与门与非门或门 2.1 思考 使用感…

@Scope与@RefreshScope注解

在SpringIOC中&#xff0c;我们熟知的BeanScope有单例&#xff08;singleton&#xff09;、原型&#xff08;prototype&#xff09;&#xff0c; Bean的Scope影响了Bean的管理方式&#xff0c;例如创建Scopesingleton的Bean时&#xff0c;IOC会保存实例在一个Map中&#xff0c;…

nest.js创建以及error相关问题

开始之前&#xff0c;你可以使用 Nest CLI 创建项目&#xff0c;也可以克隆一个 starter project&#xff08;两者的结果是一样的&#xff09;。 若要使用 Nest CLI 构建项目&#xff0c;请运行以下命令。这将创建一个新的项目目录&#xff0c;并使用核心的 Nest 文件和支撑模…

我把 CPU 三级缓存的秘密,藏在这 8 张图里

本文已收录到 GitHub AndroidFamily&#xff0c;有 Android 进阶知识体系&#xff0c;欢迎 Star。技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 进 Android 面试交流群。 前言 大家好&#xff0c;我是小彭。 在上一篇文章里&#xff0c;我们聊到了计算机存储器系统的金…

盘点机PDA搭配蓝牙便携打印机,条码标签打印,超市仓库条码管理,条码标签纸

null使用盘点机PDA&#xff0c;搭配蓝牙便携打印机&#xff0c;移动打印条码标签的操作和设置。对于商品本身没有条码的商品&#xff0c;比如&#xff1a;外购回来无条码的商品&#xff0c;工厂自己生产出来的成品&#xff0c;那么这种就需要打印商品条码进行粘贴&#xff0c;即…

Spring Security认证之登录表单配置

本文内容来自王松老师的《深入浅出Spring Security》&#xff0c;自己在学习的时候为了加深理解顺手抄录的&#xff0c;有时候还会写一些自己的想法。 自定义登录页面 文接上篇&#xff0c;这一篇学习如何自定义登录表单。我们创建一个Spring Boot项目之后&#xff0c;还是一样…

windows docker 及 k8s 环境搭建

docker 环境搭建 下载 docker 下载 docker for desktop&#xff0c; , 配置 镜像源 开通 kubenates 功能 注册一个 docker hub 账号 记住账号密码&#xff0c; 将来拉取镜像要用到&#xff0c; 在 docker for desktop 中登录该账号 kubenates 环境搭建 docker 中开通 k8…

nginx服务器

一、介绍 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第一个公开版本0.1.0发布于2…

用户管理系统(2)

2.实现添加功能:有两个和后端交互的接口 根据用户的身份显示登陆界面: 进行插入操作: 1)在我们的前端直接获取到用户名&#xff0c;密码&#xff0c;确认密码&#xff0c;年龄&#xff0c;QQ&#xff0c;邮箱&#xff0c;判断他们是否为空&#xff0c;检测密码和确认密码是否一…

docker 第二次学习笔记

一、dockers简介 docker官网&#xff1a;https://www.docker.com 1.1 docker定义 docker是一种容器化技术&#xff0c;用来更好的构建和发布应用。 二、docker安装 2.1 方法1 centos7.x系统的安装 官网安装步骤&#xff1a;https://docs.docker.com/engine/install/cento…

IDEA中,maven项目下,lombok插件 ,添加lombok.jar, Maven项目下lombok依赖配置

IDEA中&#xff0c;maven项目下&#xff0c;lombok插件 &#xff0c;添加lombok.jar, Maven项目下lombok依赖配置 Maven 项目的创建 在IDEA 21版中&#xff0c;Maven项目无需下载其他版本&#xff0c;查看有无Maven&#xff0c;如果没有下载 安装 首先打开IDEA &#xff0c;点…

​ 详解Linux内核通信-proc文件系统

使用 /proc 文件系统来访问 Linux 内核的内容&#xff0c;这个虚拟文件系统 在内核空间和用户空间之间打开了一个通信窗口&#xff1a; /proc 文件系统是一个虚拟文件系统&#xff0c;通过它可以使用一种新的方法在 Linux内核空间和用户间之间进行通信。在 /proc 文件系统中&…

MySQL事务和索引

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;MySQL &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录索引概念使用索引在MySQL中的数据结构事务概念mysql的隔离级别索引 概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所…

一图看懂,阿里云飞天企业版如何支持政企数智创新

杭州&#xff0c;2022年11月5日 – 今日&#xff0c;在云栖大会专有云技术和应用实践论坛&#xff0c;阿里云重磅发布飞天企业版在建云、管云、用云方面的全面升级&#xff0c;并邀请行业专家、政企客户代表和合作伙伴面向未来十年共话新一代政企IT发展趋势&#xff0c;分享阿里…

行业洞察 | AI贩卖的焦虑,我们该买单吗?

图片来源Midjourney Showcase 在过去的几个月里&#xff0c;人工智能生成的艺术在受欢迎程度和可访问性方面都经历了快速增长。随着DALL-E、Midjourney和Stable Diffusion等引擎刺激了 AI 生成的艺术品在在线平台上的大量涌入。 此前&#xff0c;一位美国39岁游戏设计师&#…

测试行业3年经验,面试想拿 15K,HR说你只值 7K,该如何回答或者反驳?

面试最尴尬的不是被拒绝&#xff0c;而是直接说你不值那个价格... 最近朋友在面试的时候&#xff0c;HR 突然来了句&#xff1a;你只值 7K。朋友后面和我说了这个事。我想如果是我处在这种情况下&#xff0c;自己并不能很好地回答或者反驳。不知道大家会怎么回答或者反驳&…

深入浅出了解MYSQL8特性注入是什么

前言 今天给大家带来的是MYSQL8版本的特性注入&#xff0c;说起SQL注入大家一定不陌生&#xff0c;可是你有没有想过&#xff0c;当SQL注入中最关键的函数SELECT被过滤后&#xff0c;我们要如何去执行SQL语句呢&#xff0c;这就是本文要讲的内容&#xff0c;即利用MYSQL8版本的…

智慧人社解决方案-最新全套文件

智慧人社解决方案-最新全套文件一、建设背景二、思路架构三、建设方案1、全局性数据整合2、综合数据分析平台3、一体化数据管控四、获取 - 智慧人社全套最新解决方案合集一、建设背景 智慧人社平台以建设智慧大社保服务体系为目标&#xff0c;全面践行“互联网&#xff0b;人社…

python基于PHP+MySQL的大学生交友社交网站

近年来,大学生的数量在逐步的增加,为了能够让这些大学生有一个更好的交友环境,需要创建一个基于大学生的社交交友网站。这样可以拉近彼此大学生之间的感情,让他们可以更好的进行学习和交流。 PHP大学生交友社交网站通过PHP&#xff1a;MySQL进行开发,分为前台和后台两部分,通过…