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的调度队列,可以当做自己对进程调度时运行队列的理解逻辑

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

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

相关文章

java 提示 避免用Apache Beanutils进行属性的copy。

避免用Apache Beanutils进行属性的copy。 Inspection info: 避免用Apache Beanutils进行属性的copy。 说明:Apache BeanUtils性能较差,可以使用其他方案比如Spring BeanUtils, Cglib BeanCopier。 TestObject a new TestObject(); TestObject b new Te…

2024 最新 frida技术栈 第一部分

目录 1.下载 2. 安装 2.1. 命令 3.基本使用 3.1 列出运行的APP 3.2 列出所有APP 3.3 杀死进程 4. frida hook 方法 4.1 frida客户端命令行的参数 4.2. Frida两种操作模式 4.3. Frida操作APP的两种方式 4.3.1. attach模式 4.3.2. spawn模式 4.3.3 转发端口启…

RabbitMQ的Overview Totals是空

一、问题描述 RabbitMQ 版本:4.0.2,Erlang 版本:26.2.5.4。 RabbitMQ 页面管理(rabbitmq_management)的 Overview > Totals 是空: 二、原因分析 RabbitMQ 的配置: management_agent.disable_metrics_collector…

Hive的数据存储格式

目录 一、前言 二、存储格式 2.1、文本格式(TextFile) 2.1.1、定义与特点 2.1.2、存储与压缩 2. 1.3、使用场景 2.2、行列式文件(ORCFile) 2.2.1、ORC的结构 2.2.2、ORC的数据类型 2.2.3、ORC的压缩格式 2.2.3、ORC存储…

LVGL移植教程(超详细)——基于GD32F303X系列MCU

版本:LVGL Kernel V8.3.0,运行压力测试Demo Stress首先放一张最终Stress Demo 运行图: 一、准备 1. GD32 Keil工程 准备任意一个屏幕可以正常显示的GD32工程: 2. LVGL源码 最新版现在已经是V9.2了,这里我选择了…

XQT_UI 组件|03 |加载组件 XQtLoading

XQtLoading 使用文档 简介 XQtLoading 是一个自定义的加载动画组件,旨在为用户提供可配置的旋转花瓣动画效果。它可以在应用程序中用于指示加载状态,提升用户体验。 特征 可配置性:用户可以根据需求调整旋转周期、缩放周期、最大/最小缩放…

Bi-LSTM-CRF实现中文命名实体识别工具(TensorFlow)

项目源码获取方式见文章末尾! 回复暗号:13,免费获取600多个深度学习项目资料,快来加入社群一起学习吧。 **《------往期经典推荐------》**项目名称 1.【MobileNetV2实现实时口罩检测tensorflow】 2.【卫星图像道路检测DeepLabV3P…

关于嵌入式学习的一些短浅经验

一、写在前面 感谢在 10.23,各位大佬对我进行的模拟面试,我也发现了我对知识的不熟练的部分,比如 IPC 方法和线程同步方法的知识。模拟面试第四期-已经拿到大厂 OFFER 的研究生大佬-LINUX 卷到飞起_哔哩哔哩_bilibili 然后,沈阳…

uniapp+uniCloud前端独立开发全栈项目Vue3版本学习路线,轻松开发H5、微信小程序、APP

概述 嗨,大家好,我是爱搞知识的咸虾米,这个学习路线是uniappuniCloud生态开发微信小程序、H5、APP等实战项目,从零基础开始到各种类型的项目案例,使用比较新的vue3语法糖版本,通过前端的技术可以轻松开发上…

微信小程序——消息订阅

首先用到的就是wx.requestSubscribeMessage接口。 注意:用户发生点击行为或者发起支付回调后,才可以调起订阅消息界面 requestSubscribeMessage() {uni.requestSubscribeMessage({tmplIds: [],//需要订阅的消息模板的id的集合,一次调用最多可…

Docker 常用命令全解析:提升对雷池社区版的使用经验

Docker 常用命令解析 Docker 是一个开源的容器化平台,允许开发者将应用及其依赖打包到一个可移植的容器中。以下是一些常用的 Docker 命令及其解析,帮助您更好地使用 Docker。 1. Docker 基础命令 查看 Docker 版本 docker --version查看 Docker 运行…

向量检索学习记录

1、Faiss Faiss是一个用于高效相似搜索和密集向量聚类的库;(支持单个/多个GPU)官方文档:Home facebookresearch/faiss Wiki GitHub 安装(如果编译有问题,有些选项需要关下,比如GPU, Python&a…

从 Hadoop 迁移到数据 Lakehouse 的架构师指南

从 Hadoop 到数据湖仓一体架构的演变代表了数据基础架构的重大飞跃。虽然 Hadoop 曾经以其强大的批处理能力统治着大数据领域,但如今的组织正在寻求更敏捷、更具成本效益和现代化的解决方案。尤其是当他们越来越多地开始实施 AI 计划时。根本没有办法让 Hadoop 为 A…

【福建医科大学附属第一医院-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …

微信机器人自动回复了解下

现在使用微信来做私域营销和维护客户的非常多,在工作上会频繁地遭遇客户提出的相同问题,当我们的好友数量众多时,手动逐个回复可能会耗费大量的时间。 幸运的是,多微管理系统的自动回复功能为我们带来了福音。帮助咱们解决这一难…

原创作品——GIS和监控软件设计

这套数据可视化大屏软件UI设计旨在提供一个直观、高​‌‌效且易于理解的界面,用于展示和分析大量的能源数据和信息。以下是关于该系统UI设计的详细介绍: 整体布局与设计风格: 界面以蓝色调为主,代表冷静、专业和科技的氛围。 布…

VisualStudio2022配置2D图形库SFML

文章目录 1. 下载安装SFML库2. 创建C项目并配置SFML配置include目录和库目录链接SFML库配置动态链接库 3. 测试 1. 下载安装SFML库 SFML(Simple and Fast Multimedia Library)C库,适合2D游戏和图形界面,提供了以下模块&#xff1…

通过conda install -c nvidia cuda=“11.3.0“ 安装低版本的cuda,但是却安装了高版本的12.4.0

问题 直接通过 conda install -c nvidia cuda"11.3.0"安装得到的却是高版本的 不清楚原理 解决方法 不过我们可以分个安装 runtime toolkit 和 nvcc 安装指定版本的 cudatoolkit 和 nvcc conda install -c nvidia cuda-cudart"11.3.58" conda instal…

电机学习-SVPWM合成原理

一、核心理论 SVPWM 算法的理论基础是平均值等效原理 ,即在一个开关周 T s T_s Ts​内通过对基本电压矢量加以组合,使其平均值与给定电压矢量相等。 引用于《现代永磁同步电机控制原理及MATLAB仿真》 二、合成原理 在扇区 I 为例: 矢量 U o…

【实用知识】Spring Boot 优雅捕捉异常的几种姿势

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…