【Linux】进程状态和进程优先级

news2024/11/18 7:28:26

文章目录

  • 1. 进程状态
  • 2. Linux的进程状态
  • 3. 僵尸进程
  • 4. 孤儿进程
  • 5. 进程优先级


1. 进程状态

为了更深入地了解进程,我们需要知道进程的不同状态。

不同的操作系统,对于进程状态有着不同的说法,如:运行、阻塞、挂起、新建、就绪、等待、死亡等。进程的多种状态,本质上是为了满足不同的应用场景。这里我们了解几种普遍的状态:

  • 运行状态
    每个CPU都只有一个运行队列,进程的执行需要入队,而让进程入队的本质是将该进程的task_struct结构体对象放入运行队列中。在CPU的运行队列中的进程,其状态称为运行状态。

在这里插入图片描述

  • 阻塞状态
    进程在运行过程中会占用CPU和其他硬件(如外设)资源,CPU与其他硬件相比,二者处理进程请求的速度相差甚远,如果等待其他硬件处理完毕,CPU再执行下一个进程,那么系统的整体速度会大幅降低;
    所以:当CPU发现运行队列中进程需要占用其他硬件资源时,会将该进程移至被占用硬件的等待队列(wait_queue)中进行排队,这种进程的状态称为阻塞状态。

在这里插入图片描述

  • 挂起状态
    我们知道进程 = 进程的数据结构 + 磁盘上的代码和数据,而进程执行时会将磁盘上对应的代码和数据加载到内存;硬件响应速度慢,当有大量进程访问硬件时会产生较多的阻塞进程,这些进程的代码和数据在短期内不会被使用,如果一直在内存会占用很多内存资源。此时操作系统会将其代码和数据移至磁盘,仅保留PCB,以节省空间,这种进程的状态称为挂起状态。
    在这里插入图片描述

挂起状态也可以叫做阻塞挂起状态,所以阻塞状态不一定是挂起状态,挂起状态一定是阻塞状态。

总结:

  1. 状态是进程的内部属性,具体地说,状态是PCB中的一个整数值。
  2. 进程的状态,本质是进程在不同的队列中,等待某种资源
  3. 进程的PCB在运行队列(run_queue)中,其状态就是运行状态(R),不是进程正在运行才是运行状态
  4. 进程既占用CPU资源又占用其他硬件(如外设)资源

2. Linux的进程状态

在Linux内核里,进程有时候也叫做任务(task)。

下面是状态在kernel源代码里的定义:

在这里插入图片描述

  • R运行状态(running):
    进程的状态为R,并不意味着进程一定在运行中,它表明进程要么是在运行中要么是在运行队列里。

test.c

#include <stdio.h>
int main()                                                                                        
{
  while (1);
  return 0;
}

+表示前台进程,没有+表示后台进程。前台进程运行时,无法输入指令,Ctrl + C可以终止进程;后台进程运行时,可以输入指令但Ctrl + C不能终止进程,可以使用kill -9 PID杀死进程。

在这里插入图片描述

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

mytest.c

#include <stdio.h>                                                                                
int main()
{
  int cnt = 0;
  while (1)
  {
    printf("%d\n",cnt++);
  }
  return 0;
}

在这里插入图片描述

S状态是浅度睡眠状态,是阻塞状态的一种,是可以被终止的进程状态。虽然数字一直在打印,但大部分时间在等显示器IO就绪,只有小部分时间在执行打印代码。所以查询该进程的状态大概率是S状态,上图碰巧查询到了R状态。

  • D磁盘休眠状态(Disk sleep):
    有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
    D状态一般在高IO的情况下才会发生,此状态下的进程处于深度睡眠,无法被杀死,只有通过断电或等待进程自己”醒来“的方式才能中断D状态。
  • T停止状态(stopped):
    T状态是阻塞状态的一种。可以通过发送 SIGSTOP 信号kill -19 PID给进程来停止进程。这个被暂停的进程可 以通过发送 SIGCONT 信号kill -18 PID让进程继续运行。

在这里插入图片描述

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

3. 僵尸进程

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

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

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

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
 
int main()  
{  
 pid_t id = fork();  
 if (id == 0)  
 {  
   while (1)  
   {  
     printf("子进程:PID: %d PPID: %d\n", getpid(), getppid());  
     sleep(1);  
     exit(1);                                                                                    
   }  
 }  
 else if (id > 0)  
 {  
   while (1)  
   {  
     printf("父进程:PID: %d PPID: %d\n", getpid(), getppid());  
     sleep(1);  
   }  
 }  
 else {  
   perror("fork失败");  
   exit(-1);  
 }  
 return 0;  
}

下面这行脚本可以实时监控进程:

while :; do ps ajx | head -1 && ps ajx | grep mytest | grep -v grep; sleep 1;done

在这里插入图片描述

  • 僵尸进程危害
    • 进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程)你交给我的任务,我办的怎么样了。如果父进程一直不读取,那子进程就一直处于Z状态
    • 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护
    • 一个父进程创建了很多子进程,就是不回收,就会造成内存资源的浪费。因为数据结构对象本身就要占用内存,类比C中定义一个结构体变量,是要在内存的某个位置开辟空间
    • 僵尸进程会导致内存泄漏

4. 孤儿进程

父进程先退出,子进程就称为孤儿进程

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

此时孤儿进程会被1号init进程领养,子进程的资源由init进程回收

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
 
int main()  
{  
 pid_t id = fork();  
 if (id == 0)  
 {  
   while (1)  
   {  
     printf("子进程:PID: %d PPID: %d\n", getpid(), getppid());  
     sleep(1);                                                                                      
   }  
 }  
 else if (id > 0)  
 {  
   while (1)  
   {  
     printf("父进程:PID: %d PPID: %d\n", getpid(), getppid());  
     sleep(1); 
     exit(1); 
   }  
 }  
 else {  
   perror("fork失败");  
   exit(-1);  
 }  
 return 0;  
}

在这里插入图片描述


5. 进程优先级

  • 基本概念

    1. cpu资源分配的先后顺序,就是指进程的优先权(priority)
    2. 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能
  • 查看进程优先级
    在linux或者unix系统中,用ps -al命令则会类似输出以下几个内容
    在这里插入图片描述

几个重要信息:
UID : 代表执行者的身份
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
PRI(默认80) :代表这个进程可被执行的优先级,其值越小越早被执行
NI (默认0):代表这个进程的nice值

  • PRI和NI

PRI是进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高

NI就是nice值,其表示进程可被执行的优先级的修正数值
PRI值越小越快被执行,加入nice值后,会使得PRI变为:新的PRI = 默认PRI + nice

这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行。 在Linux下,调整进程优先级,就是调整进程nice值。 nice的取值范围是-20至19,一共40个级别

  • 修改nice值

执行sudo top进入top后按“r” -> 输入进程PID -> 输入nice值

在这里插入图片描述


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

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

相关文章

SIoU Loss

1、论文 题目&#xff1a;《SIoU Loss: More Powerful Learning for Bounding Box Regression》 参考博客&#xff1a; https://blog.csdn.net/qq_56749449/article/details/125753992 2、原理 有关IoU损失函数&#xff0c;像GIoU、DIoU、CIoU都没有考虑真实框与预测框之间的…

关于zookeeper和kafka不得不说的秘密

zookeeper简介1. zookeeper的概述ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a…

【四】Netty 分隔符和定长解码器的应用

Netty 分隔符和定长解码器的应用理论说明LineBasedFrameDecoder 开发大概流程代码展示netty 依赖EchoServer 服务端启动类EchoServerHandlerEchoClientEchoClientHandler结果打印客户端打印服务端打印FixedLengthFrameDecoder 开发代码展示EchoServer 服务端启动类EchoFixServe…

【云原生】k8s之pod控制器

内容预知 前言 1.pod控制器的相关知识 1.1 pod控制器的作用 1.2 pod控制器的多种类型 1.3 pod容器中的有状态和无状态的对比 &#xff08;1&#xff09;有状态实例 &#xff08;2&#xff09;无状态实例 2.Deployment控制器 2.1 SatefulSet 控制器的运用 2.1 Sateful…

从0到1完成一个Vue后台管理项目(六、404页)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

[LeetCode周赛复盘] 第 95 场周赛20230107

[LeetCode周赛复盘] 第 95 场周赛20230107 一、本周周赛总结二、 [Easy] 2525. 根据规则将箱子分类1. 题目描述2. 思路分析3. 代码实现三、[Medium] 2526. 找到数据流中的连续整数![在这里插入图片描述](https://img-blog.csdnimg.cn/237210adb20e457aaf2671e6e8f9e43b.png)2. …

Linux系统中C++多态和数据封装的基本方法

大家好&#xff0c;今天主要和大家分享一下&#xff0c;多态&#xff0c;数据封装的使用方法。 目录 第一&#xff1a;C中的多态 第二&#xff1a;C中数据封装方法 第一&#xff1a;C中的多态 C多态意味着调用成员函数时&#xff0c;会根据调用函数的对象的类型来执行不同的函…

将内核加载到内存

文章目录前言前置知识代码实验操作前言 本博客记录《操作系统真象还原》第五章第3个实验的操作~ 实验环境&#xff1a;ubuntu18.04VMware &#xff0c; Bochs下载安装 实验内容&#xff1a;将内核载入内存,初始化内核代码 实验原理 编写内核程序。将内核程序用dd命令复制到…

Odoo 16 企业版手册 - 库存管理之存储类别

存储类别 Odoo中的存储类别功能将允许您将许多存储位置分组到一个类别下。您可以在Odoo 库存管理模块中创建许多此类类别&#xff0c;这将有助于执行更智能的放置操作。在配置存储类别之前&#xff0c;您必须配置库存中可用的存储位置。然后&#xff0c;您可以将它们分组到一个…

LeetCode刷题模版:31 - 40

目录 简介31. 下一个排列32. 最长有效括号33. 搜索旋转排序数组34. 在排序数组中查找元素的第一个和最后一个位置35. 搜索插入位置36. 有效的数独37. 解数独38. 外观数列39. 组合总和40. 组合总和 II结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指…

电影解说开头怎么写吸引人?

电影解说开头怎么写吸引人&#xff1f;很多电影解说创作者文采不够好&#xff0c;开头不知道怎么写&#xff1f;毕竟想留住用户继续观看视频&#xff0c;开头是至关重要的&#xff0c;今天笔者就分享电影解说文案万能公式模板&#xff0c;让大家创作更简单&#xff01;一个好的…

feature engnineering 特征工程

特征工程数值型变量standardizationlog_transformation(使其符合正态分布)polynomial features分类型变量orinigalencoderonehot encoder分类创造下的数值以下代码根据Abhishek Thakur在kaggle上的机器学习30天 &#xff08;b站&#xff09; (kaggle)可惜的是&#xff0c;我没有…

Oracle 19c VLDB and Partitioning Guide 第5章:管理和维护基于时间的信息 读书笔记

本文为Oracle 19c VLDB and Partitioning Guide第5章Managing and Maintaining Time-Based Information的读书笔记。 Oracle 数据库提供了基于时间管理和维护数据的策略。 本章讨论 Oracle 数据库中的组件&#xff0c;这些组件可以构建基于时间管理和维护数据的策略。 尽管大…

计算机网络复习之网络层

文章目录数据报与虚电路服务的对比IP 协议IP数据报格式IP地址NAT&#xff08;网络地址转换&#xff09;子网划分和子网掩码在支持子网划分的因特网中&#xff0c;路由器如何转发IP数据报无分类编制CIDR构成超网RIP协议OSPF协议ARP协议ICMP协议Ping和Traceroute参考路由选择是网…

Eclipse安装教程

Eclipse安装教程 目录一&#xff0e; 概述二&#xff0e; 下载eclipse三&#xff0e; 安装eclipse四&#xff0e; 使用eclipse。一&#xff0e; 概述 eclipse是针对java编程的集成开发环境&#xff0c;其设计思想是“一切皆插件”。就其本身而言&#xff0c;eclipse只是一个框架…

Hive表的创建,删除,修改

TBLPROPERTIES的主要作用是按键-值对的格式为表增加额外的文档说明。Hive会自动增加两个表属性:一个是last_modified_by&#xff0c;其保存着最后修改这个表的用户的用户名﹔另一个是 last_modified_time&#xff0c;其保存着最后一次修改的新纪元时间秒。用户还可以拷贝一张已…

数据的合并和分组聚合

一&#xff1a;字符串离散化的案列 对于这一组电影数据&#xff0c;如果我们希望统计电影分类(genre)的情况&#xff0c;应该如何处理数据&#xff1f; 思路&#xff1a;重新构造一个全为0的数组&#xff0c;列名为分类&#xff0c;如果某一条数据中分类出现过&#xff0c;就让…

Java之class类

Class类 1.类图 2.Class类对象 系统创建 该class对象是通过类加载器ClassLoader的loadClass()方法生成对应类对应的class对象 通过debug可以追到该方法 3.对于某个类的class类对象 只加载一次 因为类值加载一次 类加载的时机 //1.创建对象实例的时候&#xff08;new&#xf…

7-10 列车调度

火车站的列车调度铁轨的结构如下图所示。 两端分别是一条入口&#xff08;Entrance&#xff09;轨道和一条出口&#xff08;Exit&#xff09;轨道&#xff0c;它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入&#xff0c;最后从出口离开。在图中有9趟列车&am…

联合证券|道指狂拉700点!八大科技巨头市值暴涨1.3万亿!

本周最终一个交易日&#xff0c;美股三大指数收盘团体大涨。道指涨2.13%&#xff0c;标普500指数涨2.28%&#xff0c;纳斯达克指数涨2.56%。 大型科技股遍及走强&#xff0c;苹果、亚马逊涨超3%。特斯拉经历惊险一夜&#xff0c;股价盘初跌近8%后反弹&#xff0c;收盘涨幅超2%。…