Linux:进程调度算法和进程地址空间

✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

文章目录

目录

文章目录

前言

一  进程调度算法

1.1  进程队列数据结构 

1.2  优先级

​编辑

1.3  活动队列

​编辑 1.4  过期队列

1.5  active指针和expired指针 

1.6  进程连接 

二  进程地址空间

2.1  程序地址空间回顾

2.2  进程地址空间

2.2.1 简单了解 

2.2.2  区域划分 

​编辑 2.2.3  理解地址空间上的地址

​编辑 2.2.4  总结

2.3  页表 

2.4  关于地址空间mm_struct

 2.5  为什么要有进程地址空间

​编辑 2.6  怎么维护进程地址空间

总结


前言

本篇详细介绍了进一步介绍进程调度算法和虚拟地址空间,让使用者有更加深刻的认知,而不是仅仅停留在表面,更好的模拟,为了更好的使用. 文章可能出现错误,如有请在评论区指正,让我们一起交流,共同进步!


一  进程调度算法

1.1  进程队列数据结构 

 

上图是Linux2.6内核中进程队列的数据结构,之间关系也已经给大家画出来,方便大家理解 

一个CPU拥有一个runqueue 

如果有多个CPU就要考虑进程个数的负载均衡问题 

1.2  优先级

●  普通优先级:100~139(我们都是普通的优先级,想想nice值的取值范围,可与之对应!)

●  实时优先级:0~99(不关心) ——实时操作系统使用

 设计一个结构体queue,设计存放队列的数组

1.3  活动队列

●  时间片还没有结束的所有进程都按照优先级放在该队列 

●  nr_active: 总共有多少个运行状态的进程

●  queue[140]: 一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以,数组下 标就是优先级!

●  从该结构中,选择一个最合适的进程,过程是怎么的呢?

        1. 从0下表开始遍历queue[140]

        2. 找到第一个非空队列,该队列必定为优先级最高的队列

        3. 拿到选中队列的第一个进程,开始运行,调度完成!

        4. 遍历queue[140]时间复杂度是常数!但还是太低效了!

●  bitmap[5]:一共140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个 比特位表示队列是否为空,这样,便可以大大提高查找效率!

 1.4  过期队列

●  过期队列和活动队列结构一模一样

●  过期队列上放置的进程,都是时间片耗尽的进程(以及新进程的加入)

●  当活动队列上的进程都被处理完毕之后,对过期队列的进程进行时间片重新计算

1.5  active指针和expired指针 

●  active指针永远指向活动队列 

●  expired指针永远指向过期队列

●  可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直都存在的。

●  没关系,在合适的时候,只要能够交换active指针和expired指针的内容,就相当于有具有了一批新的活动进程!

在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增 加,我们称之为进程调度O(1)算法! 

1.6  进程连接 

 我们知道,所有的进程都被链表连接,进程可以在运行队列,在阻塞队列,还要在受操作系统管辖的全局队列里,它是怎么做到的呢?

 

二  进程地址空间

2.1  程序地址空间回顾

我们在讲C语言的时候,老师给大家画过这样的空间布局图

我们写一段代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{pid_t id = fork();if (id < 0) {perror("fork");return 0;}else if (id == 0) { //child,子进程肯定先跑完,也就是子进程先修改,完成之后,父进程再读取g_val = 100;printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);}else { //parentsleep(3);printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);}sleep(1);return 0;
}

我们发现,父子进程,输出地址是一致的,但是变量内容不一样!能得出如下结论: 

●  变量内容不一样,所以父子进程输出的变量绝对不是同一个变量 

●  但地址值是一样的,说明,该地址绝对不是物理地址!

●  在Linux地址下,这种地址叫做 虚拟地址

●  我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理

OS必须负责将 虚拟地址 转化成 物理地址 。 

2.2  进程地址空间

2.2.1 简单了解 

所以之前说‘程序的地址空间’是不准确的,准确的应该说成 进程地址空间 ,那该如何理解呢? 

讲一个简单的故事 

 一个大富翁(操作系统)有10亿美金,而他有四个私生子,但是四个私生子(进程)都并不知道对方的存在,所以他们都认为大富翁只有他唯一一个儿子,而大富翁告诉他们一旦自己去世了,就把所有的家产留给他,所以每个儿子也都信了,所以大富翁其实给每个私生子都画了一个大饼(进程地址空间)。每个人都认为自己有十亿家产。 但实际上是这些私生子要多少才会给多少(进程需要多少空间操作系统就给多少空间) 

也就是说,对每一个进程,都有一份属于自己的虚拟地址空间(本质是一个内核数据结构对象) 

2.2.2  区域划分 

 2.2.3  理解地址空间上的地址

 内存的最小寻址单位是1字节

首先,我们要明白,指针就是地址,地址就是指针。 而地址是内存单元的编号。所以,一个指针占几个字节,等于是一个地址的内存单元编号有多长。

 2.2.4  总结

2.3  页表 

对于页表来说,不止有虚拟地址和物理地址进行映射,还有页表标记位和读写缺陷等

 

常量被放在区域,这段区域的权限只读

这段代码编译器是能编译过的,所以不是编译器的问题,是操作系统在运行时发现的问题

操作系统是进程的管理者,进程挂了,一定和操作系统有关系 

读写权限就可以帮助我们做检查,比方说当前是常量字符区但是你却想修改,就会被操作系统拦截,该非法请求就不会被发送到物理内存。

标志位就是帮助们判断进程的代码和数据是否被加载到内存中,因为我们知道我们的进程对应的代码和数据是有可能处于挂起状态的(还没加载到内存)。 

惰性加载:其实就是需要多少就加载多少。操作系统对大文件是可以实现分批加载,也就是说当前的进程可能只有PCB在内存中,但是代码和数据可能还没马上加载进来。  

2.4  关于地址空间mm_struct

我们可以用readelf -S 程序名 显示可执行程序的分段

 

 程序编译的时候不存在这种数据

动态开辟,函数栈帧等操作栈区不断进行扩大释放操作

 2.5  为什么要有进程地址空间

 2.6  怎么维护进程地址空间


总结

✨✨✨各位读友,本篇分享到内容是否更好的让你理解,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!

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

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

相关文章

HCIP--以太网交换安全(二)

端口安全 一、端口安全概述 1.1、端口安全概述&#xff1a;端口安全是一种网络设备防护措施&#xff0c;通过将接口学习的MAC地址设为安全地址防止非法用户通信。 1.2、端口安全原理&#xff1a; 类型 定义 特点 安全动态MAC地址 使能端口而未是能Stichy MAC功能是转换的…

Day8:返回倒数第k个节点

题目&#xff1a; 实现一种算法&#xff0c;找出单向链表中倒数第k个节点。返回该结点的值。 示例&#xff1a; 输入&#xff1a;1->2->3->4->5和k2 输出&#xff1a;4 说明&#xff1a; 给定的k保证是有效的。 public int kthToLast(ListNode head,int k){…

【STM32-HAL库】AHT10温湿度传感器使用(STM32F407ZGT6配置i2c)(附带工程下载连接)

一、温湿度传感器&#xff1a; 温湿度传感器是一种能够检测环境中的温度和湿度&#xff0c;并将其转化为电信号输出的装置。它在智能家居、工业自动化、气象监测、农业等领域有着广泛的应用。 原理&#xff1a; 温湿度传感器通常基于不同的物理原理&#xff0c;以下是一些常见…

前端vue-配置基地址并发送请求

1.首先&#xff0c;在HBuilder的终端下载安装luch-request 2.创建一个目录utils&#xff0c;以及下面的http.js文件&#xff0c;导入安装包&#xff0c;在new一下request&#xff0c;配置接口的基地址 3.在测试文件目录里面进行测试&#xff0c;看看请求能否发送成功&#xff…

Activity

文章目录 1.启停活动页面1.Activity启动和结束2.Activity生命周期3. Activity启动模式 2.在活动之间传递信息1.显示Intent和隐式Intent显示Intent隐式Intent 2.向下一个Activity发送数据3.向上一个Activity返回数据 3.为活动补充附加信息1.利用资源文件配置字符串2.利用元数据传…

零基础入门AI大模型应用开发,你需要一个系统的学习路径!

前言 随着人工智能技术的迅猛发展&#xff0c;特别是在大型语言模型&#xff08;LLMs&#xff09;领域的突破&#xff0c;AI大模型已经成为当今科技领域的热门话题。不论是对于希望转型进入AI行业的职场人士&#xff0c;还是对未来充满憧憬的学生&#xff0c;掌握AI大模型的应…

在java中使用redis

Redis Java使⽤ 引入依赖 Java 操作redis的客⼾端有很多.其中最知名的是jedis. 创建maven项⽬,把jedis的依赖拷⻉到pom.xml中 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency><groupId>redis.clients</groupId><…

基于SpringBoot的音乐网站系统

本地测试环境&#xff1a;eclipse或idea&#xff0c;数据库MySQL5.7&#xff0c; jdk1.8 使用技术&#xff1a;SpringBootMyBatis 主要功能&#xff1a;分类管理、音乐管理、系统管理等

ASR的King:我又回来了,更小,且更快——openai/whisper-large-v3-turbo

Whisper 是用于自动语音识别&#xff08;ASR&#xff09;和语音翻译的最先进模型&#xff0c;由来自 OpenAI 的 Alec Radford 等人在论文《通过大规模弱监督实现鲁棒语音识别》中提出。 Whisper 在超过 500 万小时的标注数据上进行了训练&#xff0c;证明了其在零点场景下对许多…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07目录1. Evaluation of Large Language Models for Summarization Tasks in the Medical Domain: A Narrative Review摘要研究…

【大语言模型-论文精读】谷歌-BERT:用于语言理解的预训练深度双向Transformers

【大语言模型-论文精读】谷歌-BERT&#xff1a;用于语言理解的预训练深度双向Transformers 目录 文章目录 【大语言模型-论文精读】谷歌-BERT&#xff1a;用于语言理解的预训练深度双向Transformers目录0. 引言1. 简介2 相关工作2.1 基于特征的无监督方法2.2 无监督微调方法2.3…

基于深度学习的多焦点图像融合系统【数据集+深度学习模型+源码+PyQt5界面】

深度学习多焦点聚焦图像融合 文章目录 研究背景代码下载链接一、效果演示1.1 界面设计1.2 图像融合演示11.3 图像融合演示21.4 图像融合演示3 二、技术原理2.1 引言2.2 融合策略2.3 深度特征的提取2.4 融合策略2.4.1 利用深度特征计算模糊度2.4.2 去噪与平滑2.4.3 图像融合 三、…

【MYSQL】mysql约束---自增长约束(auto_increment)

1、概念 在Mysql中&#xff0c;当主键为自增长后&#xff0c;这个主键的值就不再需要用户输入数据了&#xff0c;而由数据库系统根据定义自动赋值。每增加一条记录&#xff0c;主键会自动以相同的步长进行增长。 注意&#xff1a;自增长约束通常与主键放在一起使用。 通过给…

【CKA】十七、集群故障排查-node节点kubelet服务异常

17、集群故障排查-node节点kubelet服务异常 1. 考题内容&#xff1a; 2. 答题思路&#xff1a; 1、考试环境就是&#xff1a;kubelet这个服务没有设置开机自启&#xff0c;导致node节点状态异常。 2、只需要切换环境&#xff0c;登录到指定主机&#xff0c;获取root权限后&am…

LeetCode 54 Spiral Matrix 解题思路和python代码

题目&#xff1a; Given an m x n matrix, return all elements of the matrix in spiral order. Example 1: Input: matrix [[1,2,3],[4,5,6],[7,8,9]] Output: [1,2,3,6,9,8,7,4,5] Example 2: Input: matrix [[1,2,3,4],[5,6,7,8],[9,10,11,12]] Output: [1,2,3,4,8,1…

73.【C语言】C/C++的内存区域划分

目录 1.内存里的几个区域 2.示意图 3.解释 1.内存里的几个区域 除了耳熟能详的栈区,堆区,静态区,还有内核空间,内存映射段,数据段,代码段 2.示意图 3.解释 栈区(stack area):局部变量,函数参数,返回数据,返回地址 内存映射段:将文件映射到内存 映射的含义: 如果看过李忠…

【python实操】python小程序之对象的属性操作

引言 python小程序之对象的属性操作 文章目录 引言一、对象的属性操作1.1 题目1.2 代码1.3 代码解释 二、思考2.1 添加属性2.2 获取属性 一、对象的属性操作 1.1 题目 给对象添加属性 1.2 代码 class Cat:# 在缩进中书写⽅法def eat(self):# self 会⾃动出现,暂不管print(f…

OpenAI 推出全新 “Canvas” 工具的系统提示词泄露

OpenAI 推出了一款叫做 Canvas 的新工具&#xff0c;用来帮助用户更好地与 ChatGPT 协作写作和编程。 Canvas 允许用户和 ChatGPT 在一个独立的窗口中协作&#xff0c;实时修改内容。这个工具可以帮助改进文本、调整语言、审查和修复代码&#xff0c;甚至转换成不同编程语言。…

大模型之RAG-关键字检索的认识与实战(混合检索进阶储备)

前言 按照我们之前的分享&#xff08;大模型应用RAG系列3-1从0搭建一个RAG&#xff1a;做好文档切分&#xff09;&#xff1a; RAG系统搭建的基本流程 准备对应的垂域资料文档的读取解析&#xff0c;进行文档切分将分割好的文本灌入检索引擎&#xff08;向量数据库&#xff…

【单例模式】

单例模式是指在内存中只会创建且仅创建一次对象的设计模式。 一、实现方式 1. 饿汉式 在类加载的时候就创建实例&#xff0c;无论是否使用&#xff0c;实例都会被创建。优点是实现简单&#xff0c;线程安全。缺点是可能造成资源浪费&#xff0c;而程序可能不一定会使用这个实例…