Linux 进程优先级 进程切换

目录

优先级

概念

为什么优先级要限制在一定范围内

进程切换

方式

EIP寄存器(程序计数器)

进程在运行时会使用寄存器来保存临时数据

进程的上下文是什么?

进程的上下文保存到哪?

内核栈或专门的上下文结构也在内核空间?那为什么不直接放在task_struct里?

内核栈拓展

Linux2.6.11下进程的调度队列

运行队列

调度队列概念

字段

prio_array结构

调度的做法

问为什么要两个prio_array?

重点


优先级

概念

  • 进程在竞争系统资源时的执行顺序
  • 优先级的范围60-99,默认为80;这里60最大
  • 进程PCB中存在nice值,通过修改nice值来修改优先级
  • PRI = pri + NI;pri为确定的起点即80;加减nice值得到最终值
  • 改nice值:top;r;pid;nice     不能用小键盘,Backspace也不可以;这通常是因为 top 命令的输入模式或终端设置的问题

为什么优先级要限制在一定范围内

  1. 较为均衡的让每一个进程都要得到调度,不然容易导致优先级较低的进程无法得到CPU资源,出现进程饥饿
  2. 补充:这种限制能够帮助操作系统更好地管理资源分配,使所有进程都有机会得到调度,进而确保系统的整体性能和响应性。

进程切换

方式

  • 在 Linux 中,进程的调度和切换主要是基于 时间片轮转抢占式调度 的组合方式

EIP寄存器(程序计数器)

  • 保存着当前进程正在执行的指令的地址;当进程切换时,操作系统会保存当前进程的 EIP 值,这样当该进程再次获得 CPU 资源时,可以从正确的位置继续执行

进程在运行时会使用寄存器来保存临时数据

  • CPU 寄存器用于存放临时数据、操作数、地址以及其他关键信息
  • 每个进程都有其自己的寄存器内容,寄存器中存储的数据对不同的进程来说是不同的

进程的上下文是什么?

  • 上下文 是指进程在 CPU 上执行时的所有状态信息,这包括程序计数器(EIP)、通用寄存器、标志寄存器、状态寄存器、栈指针以及其它状态信息

进程的上下文保存到哪?

  • 老系统会将当前进程的上下文保存到PCB
  • 现代操作系统,特别是在 Linux 中,由于内核的演变和复杂性增加,PCB 结构变得越来越大进程的上下文并不总是直接保存在 PCB,而是在保存到其内核栈或专门的上下文结构并通过 PCB 中的指针引用这些信息

内核栈或专门的上下文结构也在内核空间?那为什么不直接放在task_struct里?

  • 一个较小的 task_struct 更容易管理,尤其是在频繁的进程调度和上下文切换中,减少 task_struct 的大小,使得调度器在进行进程切换时能够更快地访问和操作这些数据
  • 灵活性和扩展性

内核栈拓展

  • 作用:内核栈是每个进程在内核态时使用的一块内存区域(位于内核空间),通常用于存储函数调用的返回地址、局部变量、函数参数以及进程在进入内核态时的上下文信息(如寄存器的内容)
  • 每个进程在进入内核态时都会使用自己独立的内核栈(例如 8 KB 或 16 KB),以确保足够的空间存储局部变量和上下文信息
  • 使用自己独立的内核栈用于与CPU寄存器内容和内核栈内容的“切换”(赋值操作)

Linux2.6.11下进程的调度队列

这是一个调度器使用的运行队列数据结构 

运行队列

  • 是一种特定的调度队列,专门用于管理和调度那些已经准备好运行的进程

调度队列概念

  • 调度队列是一个泛指的概念,用来描述系统中所有等待被调度的进程的集合,它涵盖了操作系统中用于管理不同状态和不同需求的各种队列
  • 就绪队列
  • 等待队列
  • 阻塞队列

字段

  • active:active 是一个指针,它指向 prio_array 结构;prio_array 结构中包含了实际的队列数据(即不同优先级的进程链表)包含所有当前正在运行或准备运行的进程。这些进程有剩余的时间片,且调度器会优先从这个队列中选择进程进行调度
  • expired:包含那些已经用完时间片的进程。进程在用完分配的时间片后会被移动到 expired 队列中,等待下一轮调度周期

prio_array结构

  • nr_active:当前活跃的进程数量(一共有多少个进程)
  • bitmap[5]:用于标识哪些优先级队列非空的位图(32 * 5 个0,用其中的0-139位来表示queue指针数组中下标对应的元素是否为空)
  • queue:这是一个链表数组,包含了所有不同优先级的进程队列

调度的做法

  • 新的进程链入expired的进程链表中
  • 通过swap(avtive,  expired)即可交换

问为什么要两个prio_array?

  • 防止一直插入优先级高的进程,导致优先级低的进程一直得不到调度出现进程饥饿

重点

  1. 优先级概念怎么修改作用
  2. 进程切换中,EIP寄存器上下文内核栈是需要 理解记忆 的
  3. Linux2.6.11的调度队列,可以当做自己对进程调度时运行队列的理解逻辑

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Visual Studio Code

代码自动保存 打开设置搜索auto save,设置为afterDelay 设置延迟时间,单位是毫秒 启用Ctrl鼠标滚轮对字体进行缩放 搜索Mouse Wheel Zoom,把该选项勾选上即可 Python插件 运行和调试Python

在zabbix5.0中监控hpe 3par8440存储

前言 通常在3par ssmc或者命令行才能完全查看各项数据,比如硬件状态,在zabbix中如何详细并集中监控查看3par的各项系统软硬件数据或者状态呢?3par 利用snmp协议搜集数据貌似不可行,但是在zabbix官网推出了一个基于SMI-S接口结合p…

软件测试学习笔记丨Selenium学习笔记:css定位

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/22511 本文为霍格沃兹测试开发学社的学习经历分享,写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~ 说明:本篇博客基于sel…

即插即用篇 | YOLOv8 引入 空间自适应特征调制模块 SAFM

代码地址: https://github.com/sunny2109/SAFMN 论文地址:https://arxiv.org/pdf/2302.13800 虽然已经提出了许多图像超分辨率的解决方案,但它们通常与许多计算和内存限制的低功耗设备不兼容。本文通过提出一个简单而有效的深度网络来高效地解决图像超分辨率问题。具体来说,…

layui扩展组件之----右键菜单

源码:rightmenu.js layui.define([element], function (exports) {let element layui.element;const $ layui.jquery;let MOD_NAME rightmenu;let RIGHTMENUMOD function () {this.v 1.0.0;this.author raowenjing;};String.prototype.format function () {…

本质矩阵分解计算Rt

1 本质矩阵的计算 上一文章中描述了本质矩阵的计算,计算机视觉-对极几何-CSDN博客,那么计算得到本质矩阵有什么用?其中一个应用是通过本质矩阵计算得到2D-2D的相对变换。 在相关矩阵计算时,一般会在两幅图像中,根据特征…

谷歌云GCP基础概念讲解

概览 云的基础是虚拟化:服务器,存储,网络。服务器是远程计算机的逻辑分区。存储是物理硬盘的逻辑划分。网络则是虚拟私有云。 谷歌是唯一一个拥有全球私有基础设施的公司;他们的谷歌云基础设施没有任何一部分通过公共互联网。换句…

HarmonyOS 组件样式@Style 、 @Extend、自定义扩展(AttributeModifier、AttributeUpdater)

1. HarmonyOS Style 、 Extend、自定义扩展(AttributeModifier、AttributeUpdater) Styles装饰器:定义组件重用样式   ;Extend装饰器:定义扩展组件样式   自定义扩展:AttributeModifier、AttributeUpdater 1.1. 区…

排序(一)插入排序,希尔排序,选择排序,堆排序,冒泡排序

目录 一.排序 1.插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 二.整体代码 1.Sort.h 2.Sort.c 3.test.c 一.排序 1.插入排序 插入排序基本思想:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止…

【UE5.3 Cesium for Unreal】编译GlobePawn

目录 前言 效果 步骤 一、下载所需文件 二、下载CesiumForUnreal插件 三、处理下载的文件 四、修改代码 “CesiumForUnreal.uplugin”部分 “CesiumEditor.cpp”部分 “CesiumEditor.h”部分 “CesiumPanel.cpp”部分 “IonQuickAddPanel.cpp”部分 “IonQuickAd…

线程的理解及基本操作

目录 一、线程的理解 (1)什么是线程呢? (2)线程的优缺点及异常 二、线程的基本操作 (1)创建一个新的进程 (2)获取线程id (3)线程终止 &…

SpringBoot 集成RabbitMQ 实现钉钉日报定时发送功能

文章目录 一、RabbitMq 下载安装二、开发步骤:1.MAVEN 配置2. RabbitMqConfig 配置3. RabbitMqUtil 工具类4. DailyDelaySendConsumer 消费者监听5. 测试延迟发送 一、RabbitMq 下载安装 官网:https://www.rabbitmq.com/docs 二、开发步骤:…

AC的旁挂和直连的方式的使用场景

AC组网架构 AC中文含义为无线接入控制器,主要功能是可以批量配置和管理无线AP。经常工作在大中型园区网络、企业办公网络等应用场景。 下面来介绍一下无线AC的几种经典架构。 一1旁挂式组网 旁挂式组网顾名思义,就是旁挂在网络中,对AP来进行…

view design之table自定义单元格模版

View Design之table自定义单元格模版 在 columns 的某列声明 slot 后&#xff0c;就可以在 Table 的 slot 中使用参数。 slot 的参数有 3 个&#xff1a;当前行数据 row&#xff0c;当前列数据 column&#xff0c;当前行序号 index。 完整示例 <template><Table …

乘云而上,OceanBase再越山峰

一座山峰都是一个挑战&#xff0c;每一次攀登都是一次超越。 商业数据库时代&#xff0c;面对国外数据库巨头这座大山&#xff0c;实现市场突破一直都是中国数据库产业多年夙愿&#xff0c;而OceanBase在金融核心系统等领域的攻坚克难&#xff0c;为产业突破交出一副令人信服的…

在Ubuntu(Linux)系统下安装Anaconda3

1、到官网下载Linux版本的包&#xff1a;https://www.anaconda.com/download/success 2、到所在目录中&#xff0c;运行下方命令&#xff0c;Anaconda3-2024.06-1-Linux-x86_64.sh是下载包的名字 bash Anaconda3-2024.06-1-Linux-x86_64.sh输入yes确定 3、输入~/anaconda3/b…

MySQL数据库集群-PXC方案视频教程下载 MySQL架构设计及常见业务处理

MySQL数据库集群-PXC方案视频教程下载 MySQL架构设计及常见业务处理30套数据库系列Mysql/SQLServer/Redis/Mongodb/Nosql精讲训练营项目实战&#xff0c;数据库设计&#xff0c;架构设计&#xff0c;性能管理&#xff0c;集群搭建&#xff0c;查询优化&#xff0c;索引优化&…

Spring Boot植物健康系统:智慧农业的新趋势

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

经常聊架构模式,设计模式,编程模式,也谈谈“反模式”

在软件工程中&#xff0c;反模式&#xff08;Anti-Pattern&#xff09;是指那些表面上看起来是一个解决方案&#xff0c;但实际上会导致更多问题或者效果不佳的常见实践。它们可能在某些情况下被广泛使用&#xff0c;但实际上是无效甚至产生反效果的。 文档中并没有详细描述具…

四、Prompt工程——简单应用

Prompt工程——简单应用 一、提示工程&#xff08;Prompt Engineering&#xff09;二、Prompt基本法则三、Prompt 调优四、简单的例子文本总结文本判断文本提取文本转化——翻译文本转化——语气 更多结语 一、提示工程&#xff08;Prompt Engineering&#xff09; 提示工程也…