Linux下的进程切换与调度

目录

1.进程的优先级

优先级是什么

Linux下优先级的具体做法

优先级的调整为什么要受限

2.Linux下的进程切换

3.Linux下进程的调度


1.进程的优先级

我们在使用计算机的时候,通常会启动多个程序,这些程序最后都会变成进程,但是我们的硬件设备都只有一套,当多个进程需要使用同一个硬件设备的时候,就必须进行排队,那进程按照什么来排队呢?就是按照优先级来排队的。也就是说,Linux系统是通过优先级的方式来决定进程享受资源的先后顺序的。

优先级是什么

优先级和标识符一样,也是进程的属性,进程的属性包含在task_struct结构体中,所以,进程的优先级其实就是task_struct结构体中的一个变量。

Linux下优先级的具体做法

Linux系统通过 PRI 和 NI 共同决定优先级的大小:

  • PRI 表示进程的优先级,PRI的初始值为80。
  • NI表示进程优先级的修正数据,NI的初始值为0。
  • PRI = PRI(old)+ NI。

我们可以通过 ps -l 命令查看进程的优先级:

  • 注意:PRI的值越小,优先级越高。

如果我们想调整进程的优先级,我们只能通过修改nice值NI来修改,而不能直接修改PRI,修改优先级的步骤如下:

  • 输入top命令并回车
  • 输入r并回车
  • 输入要修改进程的pid并回车
  • 输入nice值并回车

Linux的优先级是有范围的,从60到99,一共40个优先级;NI的取值范围就是[-20, 19]。NI 更像是进程优先级的修正数据。

优先级的调整为什么要受限

如果优先级的调整不加限制,用户就可能会将自己进程的优先级调整的非常高,把别人的进程的优先级调整的非常低,优先级较高的进程优先得到资源,后续还有源源不断的进程产生,常规进程就很难享受到资源,这样一来就会造成一些进程饥饿

2.Linux下的进程切换

当程序加载到内存形成进程之后,会以双链表的形式组织起来,CPU的运行队列的指针会指向其中一个task_struct,CPU就会从运行队列中拿进程去执行,当代计算机系统都有一个时间片,也就是进程占有CPU的最大时间,当时间片结束之后,就需要把当前正在执行的进程从CPU上剥离下来,换另一个进程去占有CPU,但是进程在运行过程中,会产生大量的临时数据,这些临时数据存放在CPU上的寄存器中,CPU内部所有的临时数据,我们称之为进程的上下文,剥离当前进程的时候,我们需要对进程的上下文进行保存,保存在task_struct结构体中的一个结构体变量中,保存好当前进程的上下文之后,操作系统才能够选择一个新的进程放在CPU上执行,当再次执行到保存好上下文的进程的时候,操作系统会先将该进程的上下文恢复,然后从上一次执行的结束位置开始执行。

  • 进程的切换始终遵守上述过程。

3.Linux下进程的调度

在CPU的运行队列中,有一个struct q array[2],array[0]是活动队列,array[1]是过期队列,struct q 类型的结构如下:

  • task_struct queue[140]:表示存放 task_struct 的数组,一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以,数组下标就是优先级,但是[0,99]号下标我们不用,我们只使用[100,139]下标,一共40个,和进程的优先级对应起来了
  • nr_active:表示总共有多少个运行状态的进程。
  • bitmap[5]:一共140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个比特位表示队列是否为空,这样,便可以大大提高查找效率。

运行队列中的 *active = &array[0], *expired = &array[1] 。

操作系统每次调度的时候,只会检查活动队列中的内容,先看nr_active是否为0,不为0的话,表示有运行的进程,然后通过bitmap按顺序判断进程在queue中所处的下标,通过下标直接找到当前优先级的所有进程的PCB,然后依次将当前优先级的所有进程运行一定的时间后,继续寻找下一个优先级的所有进程。

所有运行之后的进程会按照优先级以及先后顺序放到过期队列中,此时可能还会有新的进程到来,当活动队列中的进程全部运行结束之后,交换*active和*expired中的内容,这样一来,过期队列中的内容就到活动队列中去了,然后操作系统继续调度活动队列中的内容,这就是Linux操作系统中关于进程调度的O(1)调度算法。

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

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

相关文章

使用 EMQX 接入 LwM2M 协议设备

LwM2M 协议介绍 LwM2M 是一种轻量级的物联网设备管理协议,由 OMA(Open Mobile Alliance)组织制定。它基于 CoAP (Constrained Application Protocol)协议,专门针对资源受限的物联网设备设计,例…

【Java 面试 八股文】Redis篇

Redis 1. 什么是缓存穿透?怎么解决?2. 你能介绍一下布隆过滤器吗?3. 什么是缓存击穿?怎么解决?4. 什么是缓存雪崩?怎么解决?5. redis做为缓存,mysql的数据如何与redis进行同步呢&…

第二天:工具的使用

每天上午9点左右更新一到两篇文章到专栏《Python爬虫训练营》中,对于爬虫有兴趣的伙伴可以订阅专栏一起学习,完全免费。 键盘为桨,代码作帆。这趟为期30天左右的Python爬虫特训即将启航,每日解锁新海域:从Requests库的…

MySQL8.0 innodb Cluster 高可用集群部署(MySQL、MySQL Shell、MySQL Router安装)

简介 MySQL InnoDB集群(Cluster)提供了一个集成的,本地的,HA解决方案。Mysq Innodb Cluster是利用组复制的 pxos 协议,保障数据一致性,组复制支持单主模式和多主模式。 InnoDB Cluster组件: …

Unity-Mirror网络框架-从入门到精通之LagCompensation示例

文章目录 前言什么是滞后补偿Lag Compensation示例延迟补偿原理ServerCubeClientCubeCapture2DSnapshot3D补充LagCompensation.cs 独立算法滞后补偿器组件注意:算法最小示例前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mir…

初窥强大,AI识别技术实现图像转文字(OCR技术)

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据、人工智能领域创作者。目前从事python全栈、爬虫和人工智能等相关工作,主要擅长领域有:python…

不小心删除服务[null]后,git bash出现错误

不小心删除服务[null]后,git bash出现错误,如何解决? 错误描述:打开 git bash、msys2都会出现错误「bash: /dev/null: No such device or address」 问题定位: 1.使用搜索引擎搜索「bash: /dev/null: No such device o…

k8s部署logstash

1. 编写logstash.yaml配置文件 --- apiVersion: v1 kind: Service metadata:name: logstash spec:type: ClusterIPclusterIP: Noneports:- name: logstash-tcpport: 5000targetPort: 5000- name: logstash-beatsport: 5044targetPort: 5044- name: logstash-apiport: 9600targ…

【JVM详解一】类加载过程与内存区域划分

一、简介 1.1 概述 JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关…

25考研电子信息复试面试常见核心问题真题汇总,电子信息考研复试没有项目怎么办?电子信息考研复试到底该如何准备?

你是不是在为电子信息考研复试焦虑?害怕被老师问到刁钻问题、担心专业面答不上来?别慌!作为复试面试92分逆袭上岸的学姐,今天手把手教你拆解电子信息类复试通关密码!看完这篇,让你面试现场直接开大&#xf…

【leetcode 32】1047. 删除字符串中的所有相邻重复项

Java中的queue、deque、ArrayDeque的区别 使用 Deque 作为堆栈(ArrayDeque是双端队列,当仅使用栈操作时push/pop,就是栈) class Solution {public String removeDuplicates(String s) {//使用 Deque 作为堆栈(ArrayDeque是双端队列,当仅使用栈…

redis项目

短信登录 这一块我们会使用redis共享session来实现 商户查询缓存 通过本章节,我们会理解缓存击穿,缓存穿透,缓存雪崩等问题,让小伙伴的对于这些概念的理解不仅仅是停留在概念上,更是能在代码中看到对应的内容 优惠…

Ubuntu 多版本 gcc 配置常用命令备忘

用的频率不高,总忘记具体参数 1,安装多版本 gcc 以 gcc-11 和12 为例: sudo apt-get install gcc-11 gcc-12 sudo apt-get install gcc-11 gcc-12 2,配置多版本 gcc gcc 与 g 一起配置进数据库中: sudo update-a…

【kubernetes组件合集】深入解析Kubernetes组件之三:client-go

深入解析Kubernetes组件之三:client-go 目录 深入解析Kubernetes组件之三:client-go 引言 1. client-go简介 2. client-go的功能 2.1 资源操作 2.2 资源监听 2.3 认证和授权 2.4 错误处理和重试 2.5 扩展性和定制化 3. 使用client-go与Kubern…

多项式插值(数值计算方法)Matlab实现

多项式插值(数值计算方法)Matlab实现 一. 原理介绍二. 程序设计1. 构建矩阵2. 求解矩阵方程3. 作出多项式函数4. 绘制插值曲线5. 完整代码 三. 图例 一. 原理介绍 关于插值的定义及基本原理可以参照如下索引 插值原理(数值计算方法&#xff…

vite + axios 代理不起作用 404 无效

vite axios 代理不起作用 先看官方示例 export default defineConfig({server: {proxy: {// 字符串简写写法/foo: http://localhost:4567,// 选项写法/api: {target: http://jsonplaceholder.typicode.com,changeOrigin: true,rewrite: (path) > path.replace(/^\/api/, )…

国产编辑器EverEdit - 编辑辅助功能介绍

1 编辑辅助功能 1.1 各编辑辅助选项说明 1.1.1 行号 打开该选项时,在编辑器主窗口左侧显示行号,如下图所示: 1.1.2 文档地图 打开该选项时,在编辑器主窗口右侧靠近垂直滚动条的地方显示代码的缩略图,如下图所示&…

深入理解Java对接DeepSeek

其实,整个对接过程很简单,就四步,获取key,找到接口文档,接口测试,代码对接。 1.获取 KEY https://platform.deepseek.com/transactions 直接付款就是了(现在官网暂停充值2025年2月7日&#xf…

调用DeepSeek官方的API接口

效果 前端样式体验链接:https://livequeen.top/deepseekshow 准备工作 1、注册deepseek官网账号 地址:DeepSeek 点击进入右上角【API开放平台】,并进行账号注册。 2、注册完成后,依次点击【API keys】-【生成API key】&#x…

香港中文大学 Adobe 推出 MotionCanvas:开启用户掌控的电影级图像视频创意之旅。

简介: 亮点直击 将电影镜头设计引入图像到视频的合成过程中。 推出了MotionCanvas,这是一种简化的视频合成系统,用于电影镜头设计,提供整体运动控制,以场景感知的方式联合操控相机和对象的运动。 设计了专门的运动条…