Linux之进程状态&&进程优先级详解

2025-02-08 04:50

本文主要是介绍Linux之进程状态&&进程优先级详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进...

一、操作系统的进程状态

1.1运行状态

  • 当一个进程准备就绪,获得了CPU资源,就会在CPU所维护的运行队列上等待CPU的调度
  • 一个进程在运行或者处于运行队列中,都叫做运行状态
  • 一个进程并不是一直在CPU上执行的,而是会以进程切换的方式,在一段时间内,使多个进程同时被推进---并发
  • CPU对进程的调度是基于进程切换和时间片轮转的调度算法

1.2阻塞状态

  • 当一个进程正在等待某种IO事件的完成,实际上就是在等待获取某种资源,那么该进程就处于一种阻塞状态
  • 操作系统对软硬件资源进行管理,都要遵循“先描述再组织”的原则,操作系统对外设的管理就是在内存中创建一个个的外设数据结构对象,再用链表的方式组织起来
  • 每一个外设的pcb数据结构对象都会包含一个等待队China编程列,当一个进程在获取某种外设资源时(比如scanf),外设资源还未准备好,该进程就会链入该外设的pcb等待队列进行等待,此时进程就处于阻塞状态,直到资源准备就绪,才会被链入运行队列等待CPU调度,将状态S改为R

1.3挂起

  • 当进程在队列中排队,操作系统的资源严重不足或者操作系统需要给新加入的进程提供空间,那么此时操作系统就会将正在等待排队的进程所对应的数据和代码换出到外设分区中,等到该进程被调度了再换入给该进程
  • 从换出到换出的过android程,进程处于挂起状态

二、Linux下具体的状态

static conswww.chinasem.cnt 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就是操作系统中进程的运行状态:并不意味着该进程一定在运行中,它表明该进程要么在运行要么在运行队列中
  • S和D状态都对应操作系统中的阻塞状态:S是一种浅度睡眠,可以被唤醒;D是一种深度睡眠,不会响应任何请求
  • 当一个进程正在进行某种IO事件,比如在向磁盘写入重要数据的时候,它必须等待磁盘写入完毕将写入结果反python馈给进程,再反馈给上层用户,但如果这时候操作系统的资源严重不足,进程挂起已经没办法解决问题了,操作系统就会选择杀掉进程,如果一个进程在等待磁盘写入完毕的期间被杀掉,那么就会导致数据的丢失!为了防止这种情况,必须给该进程一个标识符--D,告诉操作系统我这个进程在等待磁盘写入完毕的期间是不能被杀掉的
  • T停止状态:可以通过发送SIGSTOP来停止进程,可以发送SIGCONT来让进程继续运行,当一个进程想要获取某种资源或者被其他进程控制(如gdb),就可能会出现T状态

Linux之进程状态&&进程优先级详解

  • R就是操作系统中进程的运行状态:并不意味着该进程一定在运行中,它表明该进程要么在运行要么在运行队列中
  • S和D状态都对应操作系统中的阻塞状态:S是一种浅度睡眠,可以被唤醒;D是一种深度睡眠,不会响应任何请求
  • 当一个进程正在进行某种IO事件,比如在向磁盘写入重要数据的时候,它必须等待磁盘写入完毕将写入结果反馈给进程,再反馈给上层用户,但如果这时候操作系统的资源严重不足,进程挂起已经没办法解决问题了,操作系统就会选择杀掉进程,如果一个进程在等待磁盘写入完毕的期间被杀掉,那么就会导致数据的丢失!为了防止这种情况,必须给该进程一个标识符--D,告诉操作系统我这个进程在等待磁盘写入完毕的期间是不能被杀掉的
  • T停止状态:可以通过发送SIGSTOP来停止进程,可以发送SIGCONT来让进程继续运行,当一个进程想要获取某种资源或者被其他进程控制(如gdb),就可能会出现T状态

Linux之进程状态&&进程优先级详解

子进程退出,父进程没有退出并且没有回收子进程的退出信息,就会使子进程进入僵尸进程

Linux之进程状态&&进程优先级详解

  • 孤儿进程:当子进程还没退出,父进程就已经推出了,那么该子进程就会被1号进程(操作系统)领养,此时的子进程就叫做孤儿进程。
  • 为什么要被1号进程领养?
  • 为了让子进程在退出的时候可以被回收退出信息。此时退出进程不能再用Ctrl C 而应该使用kill -9 杀掉进程

Linux之进程状态&&进程优先级详解

Linux之进程状态&&进程优先级详解

三、进程的优先级

3.1基本概念

  • CPU的资源是有限的,但是进程是多个的,这就注定了进程之间存在竞争关系
  • 为了保证进程被CPU调度的公平和良性竞争,就必须引入进程优先级的概念
  • 进程优先级是指CPU分配资源的先后顺序(访问资源的先后顺序)
  • 如果一个进程长时间无法访问到资源,代码无法被推进,就会导致该进程的饥饿问题
  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可能改善系统性能
  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整 体性能

3.2查看进程优先级的命令

  • 使用 ps -al

Linux之进程状态&&进程优先级详解

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

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

进程的优先级别越高(默认80)

NI就是nice值,其表示进程可被执行的优先级的修正数值

PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice

这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行

所以,调整进程优先级,在Linux下,就是调整进程nice值 ,Linux为了保证优先级的调整范围,nice其取值范围是-20至19,一共40个级别

3.3修改进程优先级的命令

  • 使用top r + 进程pid + 修正的nice值

Linux之进程状态&&进程优先级详解

操作系统是如何根据优先级展开调度的呢?

CPU会维护一个runqueue,runqueue中有两个调度队列,他们本质上是两个指针数组,存储40个优先级所一一对应的40个队列的指针,再结合位图的思想(调度完毕的队列为0,未调度完毕的队列为1),针对不同的优先级对进程进行调度!

新加入的进程或者被进程切换下来的进程会链接到另外一个调度队列的对应的优先级的队列当中去,直到前一个调度队列全部调度完后,swap交换两个队列的指针,对另外一个未调度的队列进行调度,以此循环往复,也叫Linux内核的O(1)调度算法

3.4其他概念

  • 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
  • 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
  • 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
  • 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

3.5并发

  • 函数的返回值是如何被外部拿到的?----通过CPU寄存器
  • 系统如何得知我们当前进程执行到哪一行代码?----通过pc(eip)程序计数器,记录当前进程执行的指令的下一条指令的地址
  • CPU中的寄存器很多!将进程中的高频数据放入到CPU的寄存器中可以提高效率
  • 问题是,我们在进行进程切换到时候,如果不把属于当前进程的存储在寄存器中的数据带走,那么下一个来的进程在把数据放入寄存器的时候就会将上一个进程的数据覆盖,等到该进程重新被CPU调度,就无法从上一次执行的位置继续往下执行
  • CPU的寄存器中保存的是进程的临时数据,也叫进程的上下文
  • 一个进程在被CPU高频调度的时候,必须经历调度----排队,在这个过程中,进程离开CPU必须自己保存上下文带走,再被调度时恢复上下文
  • 总之,进程切换涉及到保存上下文和恢复上下文,寄存器中的数据在被保存时实际上是以结构体的形式被保存在内存中,进程的pcb数据结构对象中存在一个指向该结构体的指针

总结

以上为个人经验js希望能给大家一个参考,也希望大家多多支持编程China编程(www.chinasem.cn)。

这篇关于Linux之进程状态&&进程优先级详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153337

相关文章

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v