【Linux】探索进程优先级的奥秘,解锁进程的调度与切换

进程优先级:

1.2. 进程优先级的定义是什么?

进程优先级指的是CPU资源分配的先后顺序,即进程的优先权(priority)。

1.3. 为何存在进程优先级的概念?

根本原因在于资源的稀缺性。

在Linux环境中,默认优先级为80,且Linux的优先级是可调的,范围在【60,99】之间,共有40个级别。

Linux优先级的本质是数字,数字越小,优先级越高!

Linux系统允许用户调整优先级,但不能直接修改pri,而是通过修改nice值(不是优先级,而是进程优先级的修正数据)来实现。

pri = pri(old) + nice

1.4. 为什么Linux调整优先级需要受限制?

如果不加限制,用户可以将自己进程的优先级设得极高,而将他人的优先级设得极低,高优先级的进程会优先获得资源,导致后续产生的进程难以享受到CPU资源,从而引发进程饥饿问题。

1.5. PRI与NICE的区别需要特别强调的是什么?

进程的nice值不是进程的优先级,它们是不同的概念,但nice值会影响进程优先级的变化。可以将nice值理解为进程优先级的修正数据。

在Linux下,调整进程优先级就是调整进程的nice值,nice值的范围是-20至19,共有40个级别。

使用top命令更改已存在进程的nice值:进入top后按“r”->输入进程PID->输入nice值。

Linux的调度与切换:

2.1. 概念准备:

进程在运行时,是否必须在CPU上运行完整个代码?

不是!现代操作系统是基于时间片进行轮转执行的(时间片:给每个进程规定的最大运行时间)。

进程的竞争性、独立性、并行性和并发性:

竞争性:系统中进程数量众多,而CPU资源有限,进程之间具有竞争属性。为了高效完成任务和合理竞争资源,便有了优先级。

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

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

并发:多个进程在一个CPU下通过进程切换,在一段时间内让多个进程都得以推进,称之为并发。

2.2. 如何完成进程的调度和切换?

当一个进程的时间片到期后,如何保存进程以便下次调用?

豆包AI编程 豆包AI编程

豆包推出的AI编程助手

豆包AI编程 483 查看详情 豆包AI编程

CPU内部有许多寄存器,进程在运行过程中会产生大量临时数据,存放在CPU的寄存器中。这些CPU内部的临时数据称为进程的硬件上下文。通过硬件上下文的保存,进程可以被再次调度时恢复运行。

因此,当进程再次被调度时,将之前保存的硬件上下文恢复,使进程继续从上次运行的位置进行。

上下文并不是寄存器,而是寄存器的内容。CPU的寄存器只有一套,但寄存器内部保存的数据可以有多套。

所以,寄存器 ≠ 寄存器的内容。

虽然寄存器数据放在共享的CPU设备中,但所有数据实际上是进程私有的。

小结:所有的保存都是为了最终的恢复,所有的恢复都是为了继续上次的运行位置继续进行。

2.4 Linux实现进程调度的算法需要考虑哪些因素?

Linux实现进程调度的算法需要考虑优先级、进程饥饿问题和效率问题。

解决优先级问题:

普通优先级:100~139(对应nice值的取值范围)

实时优先级:0~99(不关心)

时间片未结束的所有进程都按优先级放在队列中。nr_active表示总共有多少个运行状态的进程,queue[140]表示一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,数组下标即优先级。

从0下标开始遍历queue[140],找到第一个非空队列,该队列必定是优先级最高的队列。选中队列的第一个进程开始运行,调度完成,优先级问题解决。

解决进程饥饿问题:

采用引入活动队列和过期队列来解决。

过期队列和活动队列结构相同,过期队列上放置的是时间片耗尽的进程。当活动队列上的进程都被处理完毕后,对过期队列的进程进行时间片重新计算。

我们先将活动队列中的进程都运行完毕,注意活动队列上的进程运行完毕后会减少,不会增加,而过期队列里的进程只会越来越多。此时需要将活动队列的内容与过期队列的内容进行交换。

交换方式:有两个指针分别指向活动队列和过期队列,active指针永远指向活动队列,expired指针永远指向过期队列。活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直存在。只要在合适的时候交换active指针和expired指针的内容,就相当于获得了一批新的活动进程。注意交换时只是交换指针的内容。

解决效率问题:

遍历queue[140]的时间复杂度是常数,但仍然不够高效。

于是采用位图方法解决:

bitmap[5]:一共140个优先级,一共140个进程队列。为了提高查找非空队列的效率,可以用5*32个比特位表示队列是否为空。我们每次可以先遍历一个整数,如果这个整数是0,就可以直接跳过,到下一个整数,直到发现不等于0,再遍历内部。

位图将对数组的遍历转化为对比特位的遍历,效率会高很多。

【Linux】探索进程优先级的奥秘,解锁进程的调度与切换

以上就是【Linux】探索进程优先级的奥秘,解锁进程的调度与切换的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/490114.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
java中常见的orm框架
上一篇 2025年11月8日 15:18:05
漫蛙Manwa2官网平台-漫蛙2APP安全下载通道
下一篇 2025年11月8日 15:19:04

相关推荐

  • 抖音飞鸽客服名称怎么改?抖店客服名称怎么改

    电商行业在我国经济中的地位日益凸显。为了满足消费者日益增长的服务需求,各大电商平台纷纷推出特色客服服务。抖音飞鸽客服作为抖音平台的官方客服,以其独特的服务模式和创新精神,赢得了广大用户的认可和好评。本文将从抖音飞鸽客服的名称改写、服务特色、行业影响等方面进行分析,以期为电商客服行业的发展提供借鉴。 …

    2026年9月22日
    000
  • Krita中如何导出AI生成的分层图片?保存多层图像的步骤

    .kra格式是保存AI分层图像的最佳选择,因其完整保留Krita特有的图层、蒙版、滤镜等编辑信息,确保后续修改不受限;若需跨软件协作,则应导出为PSD格式,尽管可能损失部分Krita专属功能,但兼容性最广;TIFF适合高质量印刷场景,但分层支持不稳定;OpenEXR适用于含深度、法线等通道的专业合成…

    2026年9月22日
    100
  • mysql怎么执行sql命令 mysql输入代码创建表详细步骤

    mysql怎么执行sql命令 mysql输入代码创建表详细步骤mysql怎么执行sql命令 mysql输入代码创建表详细步骤mysql怎么执行sql命令 mysql输入代码创建表详细步骤mysql怎么执行sql命令 mysql输入代码创建表详细步骤

    在mysql中执行sql并创建表的步骤如下:1.通过命令行或图形工具连接数据库,使用mysql -u 用户名 -p并输入密码登录;2.选择或创建数据库,用use database_name或create database语句;3.使用create table定义表结构,如字段名、数据类型、约束等,例…

    2026年9月22日 用户投稿
    100
  • LINUX怎么查看命令历史记录_Linux查看与清除历史命令的方法

    使用history命令查看历史记录,可通过history | grep搜索或上下箭头浏览,记录保存在~/.bash_history文件中;通过export HISTSIZE和HISTFILESIZE修改保存数量,并写入~/.bashrc永久生效;用history -c清空当前会话,> ~/.b…

    2026年9月22日
    000
  • 使用php连接mssql实现日志记录_通过php连接mssql完成日志管理

    使用PHP连接MSSQL可实现高效日志管理,首先需安装sqlsrv扩展并配置php.ini;接着通过sqlsrv_connect建立数据库连接,确保SQL Server启用TCP/IP协议;然后创建包含LogLevel、Message、Source等字段的AppLogs表;封装writeLog函数插…

    2026年9月22日
    000
  • Swift 3到5.1新特性整理

    tocSwift 5.1Swift 5.0Result类型Raw string自定义字符串插值动态可调用类型处理未来的枚举值从try?抹平嵌套可选检查整数是否为偶数字典compactMapValues()方法撤回的功能: 带条件的计数Swift 4.2CaseIterable协议警告和错误指令动态查…

    2026年9月22日
    000
  • AffinityDesigner如何导出AI生成的矢量图片?保存图像的步骤

    答案是选择合适的矢量格式并调整导出设置。在Affinity Designer中导出AI生成的矢量图时,应根据用途选择SVG(适用于Web)、PDF(适用于打印和跨平台分享)或EPS(适用于老旧系统);导出前需检查文本是否转曲、颜色模式是否正确,并优化路径与位图设置以平衡质量与文件大小;从其他AI工具…

    2026年9月22日
    000
  • MySQL安装后初始密码在哪里查看?

    MySQL安装后初始密码在哪里查看?MySQL安装后初始密码在哪里查看?MySQL安装后初始密码在哪里查看?MySQL安装后初始密码在哪里查看?

    mysql安装后的初始密码取决于安装方式和操作系统,通常可在错误日志中找到。1. 查看mysql错误日志:linux系统使用grep命令查找/var/log/mysqld.log或类似路径;windows系统在data目录下的hostname.err中搜索“temporary password”。2…

    2026年9月22日 用户投稿
    100
  • PHP日志记录怎么做_PHP中Monolog库实现灵活强大的日志系统

    Monolog是PHP中基于PSR-3标准的主流日志库,通过Composer安装后可轻松实现日志记录。使用Logger类创建实例并添加Handler(如StreamHandler写入文件、NativeMailerHandler邮件报警)来管理不同级别(debug、info、error等)日志输出,支…

    2026年9月22日
    200
  • mysql如何添加主键索引 mysql创建主键索引的步骤详解

    mysql如何添加主键索引 mysql创建主键索引的步骤详解mysql如何添加主键索引 mysql创建主键索引的步骤详解mysql如何添加主键索引 mysql创建主键索引的步骤详解mysql如何添加主键索引 mysql创建主键索引的步骤详解

    mysql中添加主键索引主要有三种方式:1. 创建新表时直接添加主键,可在列定义后使用primary key或在所有列定义后单独声明;2. 在已有表上通过alter table添加主键,需确保目标列非空且唯一,必要时先清洗数据;3. 添加复合主键,适用于多列组合才能唯一标识记录的情况。主键索引在in…

    2026年9月22日 用户投稿
    000
  • Winscp连接本地linux(centos7)

    要在本地linux系统(例如centos7)中查找ip地址,可以使用以下命令: ip addr show 或者更简洁的: ip a 这两个命令都会显示系统中所有网络接口的详细信息,包括IP地址。 如果你只想查看IPv4地址,可以使用以下命令: ip -4 addr show 或者使用ifconfig…

    2026年9月22日
    000
  • PHP数组如何定义和使用_PHP数组定义与使用详细教程

    PHP数组是存储和管理多个值的核心工具,支持索引、关联、混合及多维结构;通过方括号定义,可灵活访问、修改、添加或删除元素,并利用foreach高效遍历。 PHP数组是存储一系列值的强大工具,无论这些值是简单的数据项,还是更复杂的结构。它的核心思想就是把一堆相关的数据“打包”在一起,通过一个统一的名字…

    2026年9月22日
    000
  • VSCode 如何配置 Python 虚拟环境 VSCode 配置 Python 虚拟环境的步骤​

    VSCode 如何配置 Python 虚拟环境 VSCode 配置 Python 虚拟环境的步骤​VSCode 如何配置 Python 虚拟环境 VSCode 配置 Python 虚拟环境的步骤​VSCode 如何配置 Python 虚拟环境 VSCode 配置 Python 虚拟环境的步骤​VSCode 如何配置 Python 虚拟环境 VSCode 配置 Python 虚拟环境的步骤​

    在vscode中配置python虚拟环境的核心是选择正确的解释器,确保项目依赖隔离;2. 首先在项目根目录使用python -m venv .venv创建虚拟环境,或使用conda、pipenv等工具;3. 在vscode中打开项目文件夹,通过ctrl+shift+p输入“python: selec…

    2026年9月22日 用户投稿
    100
  • MySQL最新版本如何下载?官方下载指南

    MySQL最新版本如何下载?官方下载指南MySQL最新版本如何下载?官方下载指南MySQL最新版本如何下载?官方下载指南MySQL最新版本如何下载?官方下载指南

    要下载mysql,推荐从官网直接下载;选择社区版或商业版取决于用途;下载时需选对操作系统和版本;安装遇到问题可查错误提示并搜索解决方案;验证安装成功可用命令行登录。下载步骤包括访问官网、选择版本与操作系统、使用installer、注册账号、开始下载安装。安装后配置root密码、字符集等。验证方式为命…

    2026年9月22日 用户投稿
    100
  • VSCode如何集成RabbitMQ管理工具 VSCode消息队列插件的使用指南

    vscode可通过安装benoit zuger开发的rabbitmq插件实现对rabbitmq的连接、消息查看、队列管理等操作;2. 使用步骤包括安装插件、添加连接、配置name、host、port、username、password和vhost参数;3. 连接成功后可在vscode内查看队列、发布…

    2026年9月22日
    000
  • 百家号发文章有字数要求吗?百家号文章最少多少字

    数字时代已经来临。百家号作为一款内容创作平台,成为了众多创作者展示才华、传播思想的舞台。百家号对于文章的字数要求,成为了许多创作者关注的焦点。本文将围绕百家号文章的字数要求,探讨其背后的原因、影响及应对策略。 一、百家号文章字数要求的原因 1. 提升内容质量 百家号对文章字数的要求,旨在提升内容质量…

    2026年9月22日
    100
  • 华为:Pura 80 Ultra、Watch GT 6 Pro入选2025年度最佳发明

    10月25日消息,华为终端官微今日发布喜讯:pura 80 ultra与watch gt 6 pro成功入选《时代周刊》2025年度最佳发明榜单。 华为方面指出,Pura 80 Ultra凭借其在影像设计与技术创新方面的突破性表现,赢得权威认可。 WATCH GT 6 Pro则因出色的运动监测功能、…

    2026年9月22日
    000
  • Spring Boot自定义Kafka配置与动态Bean注册最佳实践

    本文探讨了在Spring Boot应用中通过自定义注解简化Kafka配置的挑战与解决方案。重点介绍了如何利用META-INF/spring.factories实现早期自动配置,并详细阐述了使用ImportBeanDefinitionRegistrar在应用上下文初始化早期动态注册Kafka生产者工厂…

    2026年9月22日
    100
  • iPhone 17邀请函暗藏玄机 博主:散热稳了

    8月27日消息,苹果新品发布会已确定于北京时间9月10日凌晨1点举行,有网友指出,苹果发布的宣传海报中,其logo呈现出类似热成像图的视觉效果,疑似暗示iphone 17系列将在散热方面迎来重大升级。 科技博主定焦数码分析称,发布会海报中橘红色的高温区域正逐步消散,这一视觉设计意在突出iPhone …

    2026年9月22日
    200
  • VSCode配合Vivado进行FPGA图像处理(算法加速与优化)

    答案:VSCode与Vivado结合可提升FPGA图像处理开发效率,前者用于代码编辑、版本控制和远程开发,后者负责综合、实现与调试,二者协同实现高效算法优化。 将VSCode与Vivado结合用于FPGA图像处理,本质上是利用VSCode作为高效的代码编辑、版本控制和辅助开发环境,来弥补Vivado…

    2026年9月22日
    200

发表回复

登录后才能评论
关注微信