首页 > 系统相关 >进程状态|进程优先级

进程状态|进程优先级

时间:2024-10-11 19:18:17浏览次数:9  
标签:状态 优先级 pid sleep 进程 nice

目录

一、进程状态

1.什么是进程状态

2.进程状态都包含什么?

3.进程状态的查看

4.进程退出

(1)进程退出的步骤

(2)僵尸进程

(3)孤儿进程

二、进程优先级

1.进程优先级是什么?

2.为什么要有进程优先级?

3.查看进程优先级

4.进程优先级的修改

(1)为什么nice值范围只有[-20,19]?

(2)进程优先级由什么元素构成?

(3)修改进程优先级的指令


一、进程状态

1.什么是进程状态

  • 进程状态是指进程在执行过程中的不同情况或阶段,这些状态反映了进程的生命周期和当前的活动情况。进程状态可以随着进程的执行和外界条件的变化而转换。

2.进程状态都包含什么?

  • 进程状态在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 */
};
  • R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里
  • S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠 (interruptible sleep))
  • D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束
  • T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行
  • X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态

3.进程状态的查看

4.进程退出

(1)进程退出的步骤

  • 进程=内部数据结构(task_struct)+代码数据
  1. 进程不再执行后,首先释放代码和数据
  2. 进程退出,退出信息(退出码)保存在task_struct中
  3. 管理结构task_struct必须被OS维护,方便用户来获取

(2)僵尸进程

  • 子进程退出,父进程不作操作
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
	pid_t id = fork();
	if(id < 0)
	{
		perror("fork");
		exit(1);
	}
	if(id > 0)
	{
		printf("parent[%d]is sleeping...\n",getpid());
		sleep(30);
	}
	else
	{
		printf("child[%d]is begin Z...\n",getpid());
		sleep(5);
		exit(EXIT_SUCCESS);
	}
	return 0;
}

循环查看进程的指令

 while :; do ps axj | head -1; ps axj | grep [僵尸进程];sleep 1;done

结果展示

  • 由上图可以看到,父进程的pid为2911783,子进程的pid为2911784
  • 由下图可以看到,父进程休眠30秒进入S+的睡眠状态,子进程休眠5秒后退出进程,则子进程状态是Z+的僵尸状态,并带上了<defunct>后缀

(3)孤儿进程

  • 父进程退出,bash维护退出信息,子进程被系统自动领养
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
        pid_t id = fork();
        if(id < 0)
        {
                perror("fork");
                exit(1);
        }
        if(id > 0)
        {
                printf("parent[%d]is sleeping...\n",getpid());
                sleep(30);
        }
        else
        {
                printf("child[%d]is begin Z...\n",getpid());
                sleep(5);
                exit(EXIT_SUCCESS);
        }
        return 0;
}

 结果展示

  • 这里可以看到,父进程pid为2927931,子进程pid为2927932,当父进程退出后,子进程的ppid由原来的2927931变为1,即子进程被系统自动领养(system)

二、进程优先级

1.进程优先级是什么?

  • 进程优先级(Process Priority)是操作系统用来决定哪个进程应该优先获得CPU资源的一种机制。操作系统通过分配不同的优先级给进程,以优化系统性能和响应速度。高优先级的进程通常会被操作系统更频繁地调度执行,而低优先级的进程则可能等待更长的时间

2.为什么要有进程优先级?

  • CPU目标资源有限,进程之间需要竞争CPU资源(僧多粥少),程优先级的存在是为了优化操作系统的资源分配,提高系统的响应速度、稳定性和资源利用率,同时实现任务之间的公平性和防止资源饥饿

3.查看进程优先级

  • 查看进程优先级的指令
    ps -al

其中:

UID是指用户ID(可使用ls -ln查看)

PID是指用户进程pid

PPID是指用户父进程id

PRI是指进程最终优先级,PRI=pir + nice值

NI是指进程nice值

4.进程优先级的修改

(1)为什么nice值范围只有[-20,19]?

  • 将nice值设定在一个有限的范围内[-20到19],可以确保优先级的划分既足够细致以满足不同任务的需求,又不会过于复杂以至于难以管理。通过限制nice值的范围,操作系统可以更好地平衡各个进程对资源的需求,确保系统能够稳定运行。将nice值范围设定为-20到19,可以为系统管理员提供一个明确的界限,以便他们更好地控制和管理用户对进程优先级的调整。

(2)进程优先级由什么元素构成?

  • 在用户空间中,进程优先级通常通过nice值或scheduling priority来表示。nice值是一个用户可调整的参数,用于改变进程获取CPU资源的比例。而scheduling priority则用于实时进程,表示其相对于其他进程的优先级

最终优先级=pri+nice

(3)修改进程优先级的指令

top/r/[PID]/[改nice值]    [-20,19]

标签:状态,优先级,pid,sleep,进程,nice
From: https://blog.csdn.net/2301_80239034/article/details/142767672

相关文章

  • Python多进程中并行编程与进程池
    Python的并行编程可以采用multiprocessing或mpi4py模块来完成。multiprocessing是Python标准库中的模块,实现了共享内存机制,也就是说,可以让运行在不同处理器核心的进程能读取共享内存。在基于共享内存通信的多进程编程中,常常通过加锁或类似机制来实现互斥。mpi4py库实现了消息传......
  • 在Vue3中如何实现四种全局状态数据的统一管理?HB
    四种全局状态数据在实际开发当中,会遇到四种全局状态数据:异步数据(一般来自服务端)、同步数据。同步数据又分为三种:localstorage、cookie、内存。在传统的Vue3当中,分别采用不同的机制来处理这些状态数据,而在Zova中只需要采用统一的Model机制状态数据传统的Vue3Zova异......
  • 【状态估计】非线性受控动力系统的线性预测器——Koopman模型预测MPC(Matlab代码实现)
     ......
  • 运行使用Electron-forge打包的electron package时遇到在js文件中执行的exec命令和在渲
    js文件中执行的exec命令出错很可能是项目中使用了一些非html,css,js的源文件,比如用了Makefile来编译了cpp代码,或者执行的exec命令为cpdir/something.cpp之类的文件操作命令。可以使用修改forge.config.js文件配置的方式,使得npmrunmake的时候自动把Makefile等exec命令中用到......
  • Python 从入门到实战35(进程-multiprocessing模块)
            我们的目标是:通过这一套资料学习下来,可以熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。        上篇文章我们讨论了turtle库绘制图画操作的相关知识。今天学习一下进程的概念和创建方法。1、......
  • Python 从入门到实战36(进程-Process、Pool类)
            我们的目标是:通过这一套资料学习下来,可以熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。        上篇文章我们讨论了通过multiprocessing模块创建进程操作的相关知识。今天学习一下Process、Po......
  • 在Vue3中如何实现四种全局状态数据的统一管理?
    四种全局状态数据在实际开发当中,会遇到四种全局状态数据:异步数据(一般来自服务端)、同步数据。同步数据又分为三种:localstorage、cookie、内存。在传统的Vue3当中,分别采用不同的机制来处理这些状态数据,而在Zova中只需要采用统一的Model机制状态数据传统的Vue3Zova异......
  • 检查Capital许可状态
    在企业的日常运营中,软件扮演着至关重要的角色,而Capital许可的合规性则是确保软件正常、合法使用的关键。因此,定期检查Capital许可状态成为了一项不可或缺的任务。本文将阐述检查Capital许可状态的重要性,并提供实用的指导,助您轻松确保合规,保障业务顺畅运行。一、Capital许可状态检......
  • 【状态估计】基于FOMIAUKF、分数阶模块、模型估计、多新息系数的电池SOC估计研究(Matla
    目录......
  • prometheus学习笔记之进程监控process_exporter
    项目地址:https://github.com/ncabatoff/process-exporter一、安装process-exporterhttps://github.com/ncabatoff/process-exporter/releases/download/v0.8.3/process-exporter-0.8.3.linux-amd64.tar.gztarxfprocess-exporter-0.8.3.linux-amd64.tar.gzmvprocess-expo......