Linux进程--进程的调度和切换

news2024/11/13 9:18:09

文章目录

  • 一、进程优先级
    • 1.优先级的概念
    • 2.优先级的实现
  • 二、进程的调度和切换
    • 1.Linux的进程调度概念
    • 2.进程的切换
      • 1.硬件上下文
      • 2.Linux调度实现

一、进程优先级

1.优先级的概念

进程要访问某种资源,要进行进程上的排队,来确认享受资源的前后顺序。
在这里插入图片描述
在xshell中我们可以通过ps -la指令对所有进程进行信息查询,其中PRI那一列显示的就是进程的优先级序号。

2.优先级的实现

通过上面的查询界面我们可以看到,进程的优先级是通过一个整形变量来表示的,这个整形在存储上属于pcb的范畴。所以我们调整优先级也是通过调整pri最终的值来实现的。
pri值是有范围限定的最小是小于等于60,最大是99,系统默认的pri值是80。而为什么要对优先级的数值进行限制呢?因为我们如果不加限制的话,就有有人使用更小或者更大的数打破这个平衡,导致一些常规进程很难能够得到资源。

二、进程的调度和切换

1.Linux的进程调度概念

我们先来熟悉几个概念:
1.进程在调度的时候不是一个程序执行完之后才能执行下一个,而是通过时间片进行轮转。
2.竞争性:系统要运行的进程数目众多,而CPU只有一个,所以各个进程之间是具有竞争性的,为了更高效的完成任务,所以才有了优先级的存在。
3.独立性:各个进程之间是独享资源的,进程之间的工作是互不干扰的
4.并行:多个进程在多个CPU之下进行执行。
5.并发:多个进程在一个CPU之下进行执行。通过进程切换的方式让多个进程近似于同时推进。

2.进程的切换

1.硬件上下文

要了解进程的切换,第一步就是要了解内部的数据是怎么进行切换和保存的。
在CPU的内部,其实存有大量的寄存器,比如eax,ebx…是用来保存变量的,eip是程序计数器,用来保存程序进度的,eds是衡量代码区域的等等。这些寄存器就是存储围绕在CPU上运行的程序产生的临时变量,当程序运行结束之后返回内存。而从寄存器中转移出来的关于进程的数据就是这个进程的硬件上下文在进程结束之后,上下文数据被保存在pcb中,用来保护上下文数据。下一个进程切换上来之后,直接用pcb中的上下文数据进行覆盖即可。

2.Linux调度实现

在这里插入图片描述
如图所示,是Linux内核中进程排列的数据结构,CPU进行进程调度也是通过这个数据结构进行。我们可以看到,关于进程的排序队列有两个,一个是array[0]活跃进程一个是array[1]过期进程,正是通过这两个结构体来控制所有等待运行的进程。接下来,我们来详细看一下这个结构体中的三个成员变量到底是有什么含义。
在这里插入图片描述
首先我们先看最后一个成员变量,是一个变量为pcb指针类型的对列,其中有140个对象,这140个对象可不是正在等待运行的进程,而是分别对应140个不同优先级的对象队列,这些队列中间会有很多相同优先级的队列。也就是说CPU并不是简单的在管理一个队列,而是在管理140个队列!队列的序号是按优先级的序号进行排序的,但是在我们第一个内容讲的优先级顺序不是只有40个吗,为什么这里可以安排140个指针呢?
因为这里有两种优先级,前100个都是实时操作优先级,只有后40才是分时操作优先级,前100个优先级不在本文的讨论范围内。每个队列的所有进程优先级相等,按照顺序即可。
然后我们来看第二个成员变量,第二个是一个int类型的数组,一共有160个比特位的大小,该数组就是使用这160个比特位的内容进行表示队列是否为空,通过位运算来检测所有队列是否为空,这样可以大大提高检测的效率。
最上面的变量也是一个int类型的变量,是表示目前有多少个运行状态的进程
就是这三个变量相互配合,才能让操作系统在对进程进行调度的时候高效。大致配合是,先由nr_active确定队列中是否有运行状态的进程,一共有多少个,其次在通过bitmap[5]的位运算来对每个优先级的队列进行判断,是否为空。最后,找到每个相同优先级的队列,进行调用即可

最后我们来区分一下这两个结构体的不同。首先我们注意到,在这两个结构体的上方,有两个指针。
在这里插入图片描述
这两个指针分别指向活跃和过期进程的结构体,其中过期队列中存储的是当CPU在调用活跃进程时,新加入进来的进程以及在进程调用时超出时间片范围的进程。但是随着时间的逐渐执行,活跃队列中的进程会逐渐减少,过期队列中的进程会逐渐增加。当活跃进程中的进程减少为0的时候,上方的两个指针就是发生互换,对于CPU来说,其实就是两种队列的内容发生了互换,因为CPU就是通过这两个指针来调用运行队列中的进程的

创作不易,感谢阅读。

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

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

相关文章

基于phpstudy对cmseasy5.5进行漏洞复现

目录: 漏洞复现的cmseasy5.5百度网盘链接 安装cmseasy: 1.在phpstudy上安装cmseasy 2.设置mysql密码为phpstudy内置mysql的密码并检查安装环境 3.安装后查看mysql内cmseasy是否有内容 获取用户名和密码过程: 1.查看源码发现有个remotelo…

字符串 - 反转字符串 II

541. 反转字符串 II 方法一&#xff1a;模拟&#xff08;reverse方法分开写&#xff09; /*** param {string} s* param {number} k* return {string}*/ var reverseStr function(s, k) {const n s.length;const arr Array.from(s);for (let i 0; i < n; i 2 * k) {re…

uniCloud服务空间选择支付宝云后,使用uni-file-picker扩展组件不回显的bug处理

问题概述 开发uniappunicloud项目&#xff0c;DCloud官方给出了很多好用的扩展组件&#xff0c;其中uni-file-picker图片上传组件非常好用&#xff0c;不用编写代码&#xff0c;即可将本地图片上传到云存储中。 原来云开发一直选择的是阿里云服务空间&#xff0c;官方一直推支…

汇编:基本指令及格式

汇编不区分大小写 寄存器只有名字&#xff0c;没有地址 Nop 栈先初始化 import引用外部函数 export外部可用声明 函数传参&#xff08;默认先使用寄存器R0~R3&#xff09;: 1.四个以内的参数使用 R0~R3 2.超过四个的参数使用栈传递 返回值: 返回值存放在R0中 立即数&…

还不会部署本地AI大模型?LangChat带你快速接入并部署本地大模型

LangChat是Java生态下企业级AIGC项目解决方案&#xff0c;在RBAC权限体系的基础上&#xff0c;集成AIGC大模型功能&#xff0c;帮助企业快速定制知识库、企业机器人。 产品官网&#xff1a;LangChat – LangChat LangChat源码&#xff1a;https://github.com/tycoding/langcha…

【机器学习】神经网络通过梯度下降学习的步骤以及前向传播的详细步骤

引言 神经网络中的梯度下降是一种优化算法&#xff0c;用于训练网络&#xff0c;即调整网络的权重和偏置&#xff0c;以最小化损失函数 文章目录 引言一、神经网络通过梯度下降学习的步骤1.1 初始化网络参数1.2 前向传播&#xff08;Forward Propagation&#xff09;1.3 计算损…

优化大量数据导出到Excel的内存消耗(二):如果数据超出Excel单表上限,则进行分表

优化前&#xff1a;优化大量数据导出到Excel的内存消耗_大文件异步导出 内存占用高-CSDN博客 写Excel文件报错&#xff1a;Invalid row number (1048576) outside allowable range (0..1048575) 写入Excel时遇到IllegalArgumentException&#xff0c;原因是超出允许的最大行数…

哪些岗位在拿着年薪百万?

​根据脉脉数据研究院 2020 年 8 月 2 日最新发布的《中国高端人才透视2020》(以下简称“报告”)&#xff0c;高端人才占比的最多的行业&#xff0c;其实不是互联网。 报告显示&#xff0c;以高薪金领人才相比于该行业的整体人才数量的占比来计算&#xff0c;排名前三的是金融、…

【分割大模型】SAM2(Segment Anything2)新的分割一切大模型(原理+安装+代码)

文章目录 前言1.特点2.结构3.应用场景 一、原理1.1 引言1.2 任务&#xff1a;可提示的视觉分割1.3 模型1.4 数据引擎 与 SA-V数据集 二、安装与使用 项目地址&#xff1a;https://github.com/facebookresearch/segment-anything-2 前言 Segment Anything Model 2&#xff08;S…

使用SSL认证访问操作手册

完整版 【金山文档 | WPS云文档】 使用SSL认证访问操作手册 https://kdocs.cn/l/cuxGfHD17eEw

vue2.0和vue3.0区别

vue2.0和vue3.0区别 双向数据绑定的原理改变&#xff1a;‌ Vue2使用Object.defineProperty对数据进行劫持&#xff0c;‌结合发布订阅模式实现双向数据绑定&#xff0c;‌而Vue3则采用了ES6的Proxy API对数据进行代理&#xff0c;‌提供了更多的拦截操作&#xff0c;‌能够监…

KBL406-ASEMI、AI智能专用整流桥KBL406

编辑&#xff1a;ll KBL406-ASEMI、AI智能专用整流桥KBL406 型号&#xff1a;KBL406 品牌&#xff1a;ASEMI 封装&#xff1a;KBL-4 批号&#xff1a;2024 现货&#xff1a;50000 正向电流&#xff08;Id&#xff09;&#xff1a;4A 反向耐压&#xff08;VRRM&#xff…

【智能流体力学】ANSYS Fluent流体仿真基础深度学习驱动的前期准备:CAX计算机辅助集成技术

目录 一、CAX计算机辅助集成技术二、计算机辅助工程(CAE)三、SCDM (Species Concentration Display Model) 显示和分析物质浓度分布的模型1. **SCDM概述**2. **主要功能**3. **功能特点**4. **使用步骤**5. **应用实例**6. **优点与限制**四、行业应用五、Fluent 软件功能1. …

net.sf.jsqlparser.statement.select.SelectItem

今天一启动项目&#xff0c;出现了这个错误&#xff0c;仔细想了想&#xff0c;应该是昨天合并代码&#xff0c;导致的mybatis-plus版本冲突&#xff0c;以及分页PageHelper版本不兼容 可以看见这个我是最下边的 Caused by 报错信息&#xff0c;这个地方提示我 net .s…

Java面试题--JVM大厂篇之实战解析:如何通过CMS GC优化大规模Java应用的响应时间

引言&#xff1a; 下午好&#xff0c;各位Java开发者&#xff01;在实际项目中&#xff0c;性能优化一直是我们关注的重点&#xff0c;特别是在面对大规模Java应用时&#xff0c;响应时间的优化更是至关重要。今天&#xff0c;我们将通过实战案例&#xff0c;深入解析如何利用C…

【JAVA多线程】JDK线程同步工具类:Semaphore、CountDownLatch、CyclicBarrier

目录 1.可能会遇到的线程协作场景 2.Semaphore 3.CountDownLatch 4.CyclicBarrier 1.可能会遇到的线程协作场景 在并发编程中&#xff0c;线程除了独自向前运行&#xff0c;还可能相互之间要进行协作&#xff0c;以保证完成最终总的目标。可能会遇到的几种任务之间的协作&…

『 C++ 』单例模式与IO流

文章目录 单例模式饿汉加载的单例模式实现懒汉加载的单例模式实现 IO流类型之间的转换 单例模式 单例模式是一种创建型设计模式; 确保一个类在应用程序的生命周期内仅有一个实例并提供一个全局访问点来访问该实例; 单例模式主要目的是为了控制某些类的实例化以避免产生多个实例…

Java面试--框架--Spring MVC

Spring MVC 目录 Spring MVC1.spring mvc简介2.spring mvc实现原理2.1核心组件2.2工作流程 3.RESTful 风格4.拦截器4.1过滤器、监听器、拦截器的对比4.2 拦截器基本概念4.3 拦截器的实现 1.spring mvc简介 Spring MVC是一款由Spring Framework 提供的 web组件&#xff0c;实现…

MySQL-MVCC举例说明

在数据库系统中&#xff0c;多版本并发控制&#xff08;MVCC, Multi-Version Concurrency Control&#xff09; 是一种用于提高并发性能的机制&#xff0c;它允许多个事务同时读取和写入数据&#xff0c;而不会产生锁等待和阻塞的问题。MySQL 的 InnoDB 存储引擎广泛使用了 MVC…

C#MVC返回DataTable到前端展示。

很久没写博客了&#xff0c;闭关太久&#xff0c;失踪人口回归&#xff0c;给诸位道友整点绝活。 交代下背景&#xff1a;要做一个行转列的汇总统计&#xff0c;而且&#xff0c;由于是行转列&#xff0c;列的数量不固定&#xff0c;所以&#xff0c;没法使用正常的SqlSugar框…