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

news2024/11/24 19:17:54

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

文章目录

目录

文章目录

前言

一  进程调度算法

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 { //parent
        sleep(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.coloradmin.cn/o/2196441.html

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

相关文章

uniapp 游戏 - 使用 uniapp 实现的扫雷游戏

0. 思路 1. 效果图 2. 游戏规则 扫雷的规则很简单。盘面上有许多方格,方格中随机分布着一些雷。你的目标是避开雷,打开其他所有格子。一个非雷格中的数字表示其相邻 8 格子中的雷数,你可以利用这个信息推导出安全格和雷的位置。你可以用右键在你认为是雷的地方插旗(称为标…

AI赋能新质生产力医院管理项目成功举办

2024年9月27日&#xff0c;为进一步贯彻实施《2024年全国卫生健康工作会议》精神&#xff0c;提升医学诊断准确性&#xff0c;优化医院服务流程&#xff0c;并降低医疗成本&#xff0c;清华大学智慧医疗研究院联合北京整合医学学会&#xff0c;在郑州大学第一附属医院东院区成功…

Java实体对象转换利器MapStruct详解

概述 现在的JAVA项目多数采用分层结构&#xff0c;参考《阿里巴巴JAVA开发手册》。 分层之后&#xff0c;每一层都有自己的领域模型&#xff0c;即不同类型的 Bean&#xff1a;  DO &#xff08; Data Object &#xff09; &#xff1a;与数据库表结构一一对应&#xff0c;…

蓝牙资讯|AirPods Pro 2推送新固件,或新增听力健康相关功能

苹果公司面向 USB-C 和 Lightning 两种型号的 AirPods Pro 2 耳机&#xff0c;推送了新的固件版本7A305&#xff0c;高于 9 月早些时候发布的 7A302 固件。 相关更新包含默认启用的听力保护模式&#xff08;在嘈杂环境下提供被动降噪&#xff09;&#xff0c;以及一种“临床级…

大模型面试八股+答案,LLM-offer手到擒来!

你是否也曾为面试大模型八股文而苦恼&#xff1f;别担心&#xff01;今天我就来给你分享一些绝妙的面试技巧&#xff0c;让你轻松应对&#xff01; &#x1f50d; 第一关&#xff1a;了解题目 首先&#xff0c;一定要仔细阅读题目&#xff0c;理解清楚每个要求。明确问题的关键…

windows C++-创建数据流代理(二)

完整的数据流演示 下图显示了 dataflow_agent 类的完整数据流网络&#xff1a; 由于 run 方法是在一个单独的线程上调用的&#xff0c;因此在完全连接网络之前&#xff0c;其他线程可以将消息发送到网络。 _source 数据成员是一个 unbounded_buffer 对象&#xff0c;用于缓冲…

git clone 私有仓库时出现错误 Authentication failed for :xxxxxx

错误信息 remote: Support for password authentication was removed on August 13, 2021. remote: Please see https://docs.github.com/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended…

【算法】博弈论(C/C++)

个人主页&#xff1a;摆烂小白敲代码 创作领域&#xff1a;算法、C/C 持续更新算法领域的文章&#xff0c;让博主在您的算法之路上祝您一臂之力 欢迎各位大佬莅临我的博客&#xff0c;您的关注、点赞、收藏、评论是我持续创作最大的动力 目录 博弈论&#xff1a; 1. Grundy数…

手机商城系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;订单管理&#xff0c;商品信息管理&#xff0c;基础数据管理&#xff0c;地址管理&#xff0c;轮播图管理 微信端账号功能包括&#xff1a;系统首页&#…

Java数据结构栈和队列(Stack和Queue详解)

前言&#xff1a; 栈和队列是数据结构中重要的存储方式&#xff0c;也是建立在Arrarylist和LinkedList之上的数据结构。 本猿在C语言阶段就已经详细剖析过栈和队列&#xff0c;不熟悉的小伙伴可以翻看之前的博客内容&#xff01; Java阶段一方面剖析Java中自带的Stack和Queue中…

宠物咖啡馆平台开发:SpringBoot框架的高效应用

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

【Spring】“请求“ 之传递 JSON 数据

文章目录 JSON 概念JSON 语法JSON 的语法JSON 的两种结构 JSON 字符串和 Java 对象互转JSON 优点传递 JSON 对象 JSON 概念 JSON&#xff1a;JavaScript Object Notation【JavaScript 对象表示法】 JSON 就是一种数据格式&#xff0c;有自己的格式和语法&#xff0c;使用文本…

什么是PLM系统?PLM系统对制造业起到哪些作用?三品PLM系统对汽车制造业意义

在当今竞争激烈的制造业环境中&#xff0c;企业面临着来自市场、技术、客户需求等多方面的挑战。为了应对这些挑战&#xff0c;许多制造企业纷纷引入产品生命周期管理PLM系统&#xff0c;以实现更高效、更灵活的产品全生命周期管理。PLM系统以其独特的优势&#xff0c;在优化产…

社区圈子系统 圈子社区系统 兴趣社区圈子论坛系统 圈子系统源码圈子系统的适用领域有哪些?如何打造自己的圈子圈子系统有哪些常见问题

社区圈子系统 圈子社区系统 兴趣社区圈子论坛系统 圈子系统源码圈子系统的适用领域有哪些&#xff1f;如何打造自己的圈子圈子系统有哪些常见问题 圈子系统的适用领域 圈子系统的适用领域广泛&#xff0c;涵盖了多个行业和场景&#xff0c;包括但不限于以下几个方面&#xff1…

计算机毕业设计 自习室座位预约系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

火语言发布暨火车采集器VIP用户回馈活动

火车头软件系列产品从最初的火车采集器、火车浏览器到触控精灵一直致力于数据采集领域的深耕与拓展&#xff0c;不断优化用户体验&#xff0c;力求为用户提供更加高效、便捷的数据处理工具。 火语言也属于同创始团队的旗下产品&#xff0c;历经三年每周版本更新&#xff0c;迭…

电感七大关键参数

大家好,这里是大话硬件。 今天这篇文章介绍电感的七大关键参数。 1、电感值 电感值就是电感做好以后的固有特性,比如1uH, 10mH,1H,这样不同类型的感值。在学习电感值之前,我们先看一下电阻公式: 其中p是导体的电阻率(Ω*m),S是导体的横截面积(m2),l是导体的长度…

Linux驱动学习——Linux启动流程

什么是驱动 驱动&#xff0c;即设备驱动程序&#xff0c;是一种可以使计算机和设备通信的特殊程序。 从作用角度来看&#xff0c;驱动的主要功能是将硬件设备的功能与操作系统进行连接&#xff0c;让操作系统能够识别并正确使用硬件设备。例如&#xff0c;显卡驱动能让操作系…

Java SE-object类和里面的3个主要方法解读

文章目录 1.object类2.toString方法调用过程2.1具体案例2.2源代码查看2.3方法的重写2.4重写效果 3.equals方法调用过程3.1现象的描述3.2方法的重写3.3IDEA自动填充 4.hashcode方法 1.object类 java里面除了object类&#xff0c;所有的类都是存在继承关系的&#xff0c;object类…

【Docker】03-自制镜像

1. 自制镜像 2. Dockerfile # 基础镜像 FROM openjdk:11.0-jre-buster # 设定时区 ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 拷贝jar包 COPY docker-demo.jar /app.jar # 入口 ENTRYPOINT ["ja…