【Linux】进程切换与优先级

前言:

        上文我们讲到了操作系统与Linux中进程的状态【Linux】进程状态-CSDN博客

        本文我们来讲进程的优先级、以及进程的切换

进程优先级

什么是优先级? 

        CPU中资源是有限的,而进程的数量一定是远大于CPU资源的,所以优先级是进程得到CPU资源的先后顺序优先级也是进程的属性之一,保存在PCB中。

优先级的实现

优先级是进程的属性之一,保存在PCB中。

        优先级中PCB中用整型表示,其值越小表示优先级越高,反之优先级越低

        优先级是可以被修改。但考虑到时间片的分时操作系统,以及公平性,优先级不能出现大幅度的修改。

        如上图,我在Linux中使用执行查看当前正在运行的进程信息。可以看到红圈这两个值:

        PRI:表示进程的优先级,其默认值是80

        NI:表示进程优先级的修正数据,称为nice值

        优先级的修改:是通过nice值的修改实现的,既最终的优先级 = PRI + NI

        如图,通过renice指令来修改进程的优先级后,我们再次查看进程信息可以发现第一个被修改的进程NI变成了10最终的优先级变成了90。 说明默认值是不改变的,优先级修改是通过nice值的修改而实现的

       

补充:UID

        如上图,我们可以看到第三列有一个叫做UID的。那什么是UID呢?

        UID:user id,表示用户标识符 

        在linux中任何访问资源的操作都是进程实现的,进程代表当前的用户。那系统是如何判断当前进程访问的权限的呢?

        其实就是通过UID实现的:通过进程中的UID文件的UID相比较,就可以判断出这个进程的访问权限是拥有者、所属组还是other

优先级的极值

        如图可知,优先级的范围是[60 - 99],而nice值的范围是[-20 - 19]

        优先级范围设置的并不宽泛,因为优先级范围设置过大会导致,优先级低的进程长时间不能获得CPU资源,进而导致:进程饥饿

 

进程关系

竞争性:进程与进程之间是存在竞争关系的。CPU资源有限,为获得CPU资源,为了高效完成任务,更合理的竞争相关资源,便有了优先级。

独立性:多进程运行时,各个进程之间是独享资源的,互不干扰。

并行:多个进程在多个CPU下,同时运行。

并发:多个进程在一个CPU下不停的切换运行,在一段时间内,让多个进程不断推进。

进程切换

        进程的切换讨论范围在长代码与死循环代码,因为较短的代码一瞬间就执行完毕了,没有切换这一说法

死循环进程

        死循环进程一段占用CPU执行代码,会一直占用CPU吗?

        并不会,因为在计算机是分时操作系统,在进程执行的过程中存在“时间片”每个进程都有其适合的“时间片”(本质其实就是计数器),时间片达到时,进程就会从CPU上剥离下来

        所以死循环并不会一直占用CPU。

CPU中的寄存器

        CPU中存在各种各样的寄存器,用于保存当前正在运行进程的各种临时数据

        寄存器就是CPU内部的临时空间

        寄存器!=寄存器中的数据

如何切换

        A进程占用CPU执行完一个时间片后,要被剥离CPU,进而执行下一个进程。

        那么当再次执行A进程时,应该从上次执行位置开始继续向下执行。 这就意味着剥离时,需要当前进程把自己的上下文记录下来,以便于下一次继续执行。

        进程上下文保存到了哪里呢?保存到了进程task_struct的TSS中(TSS:任务状态段),下一次执行时,之间覆盖CPU中的寄存器内容即可

        对于以及执行过的进程才需要记录上下文,对于之前还没有执行过的继承无需记录,及其将寄存器内容初始化即可。

Linux中真实的调度算法:O(1)调度算法

        如上图,runqueue是一个运行队列,且一个CPU只有一个运行队列。

queue[140]

        我们先来介绍一下queue[140]:它的数据类型是 struct task_struct*

struct task_struct* queue[140]

        queue一共有140个元素,一个元素就是一个进程队列,其下标映射了优先级。前100个元素代表实时优先级(我们不关心)后40个代表我们上面所讲的普通优先级

        我们之前讲到优先级的范围是:60~99,那对应在queue中的下标表示就是:100~139(x - 60 +100)。比如优先级为64的进程就会链接至下标为104的节点下,多个优先级一样的进程都会被依次链接在同一个进程队列中

bitmap

        bitmap[5]用于在queue中快速查找进程

        bitmap的数据类型是 unsigned int,一个元素有32bit,一个有5个这样的元素。

        用bit位记录进程信息,0表示没有进程,1表示有进程。从下标0开查询,一次性查询32个位置,并从最后一个“1”开始调用进程(既优先级最高的进程位置)。

nr_active

        记录进程的个数,当进程个数为0时,不在使用bitmap查询进程。

过期队列与活跃队列

        在图中我们可以看到有两个一模一样的队列结构(蓝框与红框),并由两个指针分别指向:active(活跃)、expired(过期)。

        active指向的队列叫做活跃队列,反之另一个叫过期队列

        活跃队列上的进程是要占用CPU资源,执行代码的。当活跃队列上的进程执行完一个时间片后,会放到过期队列中的相应位置上(优先级对应的位置)。当活跃队列上的进程全部执行完时,active指针与expired指针交换:过期队列再次变为活跃队列,继续执行之前的进程

Linux中进程切换的整体过程

        1.由bitmap在活跃队列中查询进程位置(优先级最高进程的位置)       

        2.依次占用CPU资源,执行相关进程

        3.时间片耗尽,记录上下文后从CPU上剥离,并链接至过期队列中

        4.直到活跃队列中没有进程,指针交换,再次循环至第一步

补充:

        如果新建了一个进程,是插入活跃队列还是过期队列?

        :活跃队列,新创建的进程应该尽快获得执行机会,而不是放入已经执行过的过期队列中等待下一次的调度

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

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

相关文章

首发即开源!DAWorkBench数据可视化分析软件正式发布!(附源码下载网址)

1 系统介绍DAWorkBench是一款面向科研实验和工程测试场景的数据可视化分析开源软件,支持实现数据清洗、信号处理和交互式可视化等功能。系统集成文件IO、数据处理以及可视化交互三大模块,支持多维数据分析与高质量图表生成,助力用户高效完成从…

Android Studio历史版本快速下载(二次修改记录)

原版:Android Studio历史版本快速下载_android studio 历史版本下载-CSDN博客 一. 最新版本 https://developer.android.com/studio?hlzh-cn 二. 历史版本 中国官网的历史版本为何不能下载?(https://developer.android.com/studio/archi…

The Missing Semester of Your CS Education 学习笔记以及一些拓展知识(六)

文章目录The Missing Semester of Your CS Education 学习笔记以及一些拓展知识版本控制Git笔记部分Git的基本工作原理Git 的核心工作原理:快照而非差异Git 的三大工作区域Git的核心对象Git的四个对象对象之间的关系与工作流程:对象的引用Git的安装和基础…

嵌入式与 Linux 系统中的核心图形库全解析

嵌入式与 Linux 系统中的核心图形库全解析 图形库在嵌入式系统与 Linux 桌面系统中扮演着重要角色。从最底层的 GPU 驱动接口,到上层的图形渲染与 GUI 工具包,共同构成了完整的图形显示栈。本文将系统整理图形相关的核心组件,按功能分层分类&…

深度学习模块实践手册(第十二期)

56、Ghost 模块论文《GhostNet: More Features from Cheap Operations》1、作用: Ghost 模块是一种轻量级的特征提取模块,旨在通过廉价操作生成更多特征图,减少计算量的同时保持模型性能。传统卷积神经网络在生成特征图时存在大量冗余计算&am…

自己动手造轮子:如何创建JAR并通过Maven在Spring Boot中引用

让代码复用变得简单优雅——3分钟学会封装专属工具库作为Java开发者,你是否遇到过这些痛点?多个项目重复编写相同工具类工具代码分散难以统一维护团队协作缺乏标准化工具库本文将手把手教你创建自己的JAR包,并优雅地集成到Spring Boot项目中&…

使用dea工具 给vue 里面的ts打断点

在 Vue 项目中使用 TypeScript 时,我们通常会在 IDE(如 JetBrains 的 IntelliJ IDEA 或 WebStorm)中设置断点进行调试。以下是详细步骤: 准备工作 确保项目已配置 source maps(Vue CLI 创建的项目默认已配置&#xff0…

Zabbix 企业级分布式监控

目录 简介 一、监控系统基础 1.1 监控的价值 1.2 监控的 5 大类型与 5 大层次 1.3 监控系统的实现原理 二、Zabbix:企业级监控方案 2.1 Zabbix 简介 2.2 Zabbix 核心功能特性 2.3 Zabbix 角色与架构 三、Zabbix 部署案例 3.1 资源清单 3.2 基础环境配置…

SQL JOIN 全解析:用 `users` 与 `orders` 表彻底掌握内连接、左连接、右连接

SQL JOIN 全解析:用 users 与 orders 表彻底掌握内连接、左连接、右连接 在日常开发中,SQL 的连接(JOIN)语句是数据库查询的核心技能。尤其在多表联合查询时,不掌握好 INNER JOIN、LEFT JOIN、RIGHT JOIN,…

(一)从零搭建unity3d机械臂仿真-unity3d导入urdf模型

1.新建工程并加载模型 (1)unity中新建3d工程 (2)将机器人模型导入到unity3d中 导入开源Unity-Robotics-Hub的机械臂。 详细操作参考视频 ROS Unity URDF Import Testing Robot Motion 使用 URDF Importer工具 在 Unity 中&#x…

Linux之网络部分-应用层自定义协议与序列化

一、应用层 1.1、理解协议 协议是一种 "约定". socket api 的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接收的。如果我们要传输一些 "结构化的数据" 怎么办呢? 其实,协议就是双方约定好的结构化的数据。 1.2、网络版计…

机器学习week3-分类、正则化

1. 逻辑回归1.1. 线性回归 vs 逻辑回归对比维度线性回归逻辑回归任务类型回归(预测连续值)分类(预测离散类别)输出范围(−∞,∞)[0,1](概率值)损失函数均方误差(MSE)对数损失&#x…

FastAdmin 中生成插件

在 FastAdmin 中生成一个 OCR 发票识别插件,可以按照以下步骤进行开发。这里假设你已经熟悉 FastAdmin 插件开发的基本流程,并会使用 Composer 和 PHP 扩展。1. 创建插件骨架使用 FastAdmin 命令行工具生成插件基础结构:php think addon -a o…

DevExpress WinForms中文教程:Grouping(分组)- 如何自定义分组算法?

DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…

PHP 与 Vue.js 结合的前后端分离架构

PHP 与 Vue.js 结合是构建现代 Web 应用的流行技术栈,通常采用 前后端分离架构。以下是关键要点和推荐实现方案: 一、技术栈组合 角色技术选项后端 (PHP)Laravel (推荐)、Symfony、CodeIgniter前端 (Vue)Vue 2/3、Vue Router、Pinia/Vuex、Vite通信协议…

XML高效处理类 - 专为Office文档XML处理优化

/**** 提供XML读取、写入、修改、查询等高级功能,支持命名空间和复杂XML结构* * 主要功能:* 1. 复杂路径解析(支持属性筛选、索引、通配符)* 2. 完整节点类型支持(元素、文本、CDATA、注释、PI)* 3. 高效元…

星慈光编程虫2号小车讲解第一篇--向前向后

星慈光编程虫2号小车是一款基于微控制器(如Arduino)的编程教学小车,常用于学习机器人控制和编程基础。本讲解将重点介绍小车的基本运动:前进、后退、左转和右转。这些运动通过控制电机实现,通常涉及调整电机的方向和速…

iOS 加固工具有哪些?快速发布团队的实战方案

在当今快速迭代的 iOS 开发环境中,团队需要在高频上线与应用安全之间找到平衡。快速发布不应牺牲安全性,而安全加固也不应成为阻碍上线的瓶颈。这就要求开发者在加固工具的选型与流程设计上,做到既高效又可靠。 那么,iOS 加固工具…

结构型模式-架构解耦与扩展实践

结构型模式聚焦于对象间的组合关系,通过优化类与对象的装配方式,实现系统的灵活性与可扩展性。在分布式系统中,由于多节点协作、跨网络通信及异构环境集成等特性,传统结构型模式需进行适应性改造,以应对分布式特有的复…

scratch笔记和练习-第三课

角色的大小变化 亮度等特效设置 流程图图形符号 Figma攻略:26个流行流程图符号及其解释 练习 实现在闪动10次后角色缓缓变回原形