环境变量-进程概念(7)

文章目录

  • Linux 真实调度算法
    • 1. queue[140]
    • 2. bitmap[5] 位图
    • 3. nr_active
    • 4. 活跃进程与过期进程
  • 环境变量
    • 1. 基本概念
    • 2. 命令行参数
    • 3. PATH 环境变量
    • 4. 环境变量具体操作

Linux 真实调度算法

下图是Linux2.6内核中进程队列的数据结构,也有Linux2.6内核进程O(1)调度算法,可单单看一副图片,也不知所以然

在这里插入图片描述

1. queue[140]

首先就是这个queue[140]queue它就是个哈希表,优先级就是哈希槽(slot),x-60 + (140 - 40)就是哈希转换算法

Linux操作系统的优先级其实总共是140个,那之前不是实验出优先级的范围是[60, 99],总共40个吗?这里为啥是140个呢

因为Linux的优先级有实时优先级和分时优先级,它既是一个实时操作系统,又是一个分时操作系统,而[0, 99]是实时优先级(并不考虑),[100, 139]是分时优先级的范围,是咱们所要去关注的

x的取值范围是[60, 99],将其代入到哈希转换算法中,得出的取值范围不就是[100, 139]。那此时就会存在疑问,既然这个实时优先级不考虑,为啥还要将它设计出来呢?

实时优先级适用于实时操作系统,Linux最初确实是作为分时操作系统设计的,主要应用于服务器领域。但它的调度算法之所以要加入实时操作系统特性,最根本的原因在于:任何操作系统开发者都希望扩大用户群体

虽然Linux在后端服务器领域应用最为广泛,但这并不意味着它只能用于服务器场景。实际上,Linux同样适用于工业控制和制造等实时性要求较高的领域。因此,现代操作系统通常都会同时支持分时和实时两种调度模式

2. bitmap[5] 位图

bitmap它首先是个位图,unsigned int bitmap[5]总共有160个比特位(32*5),比特位前140个的位置就逐一对应着queue[140]的slot,比特位中的内容:1/0,1表示该slot指向的进程不为空,0则为空

在这里插入图片描述

这里运行队列咱们只考虑从100开始,上面只是做个形象的展示。进程调度,宏观上先看优先级,优先级相同的先进先出(FIFO算法),比如图中2号优先级的第一个进程先调度

比如0000100,优先级为3的进程不为空。为啥位图的元素个数是5,因为4是128,6是192,只有5是最接近140的

调度器快速地挑选一个进程要分成两步,第一步就是挑队列,而挑队列再也不用去遍历queue这个指针数组了,直接查看对应的位图bitmap

第二步:再到队列中去挑特定的进程→这样挑选一个进程基本上做到了几乎为O(1)的时间复杂度,将这个调度算法称为Linux内核进程调度算法之大O(1)调度算法

3. nr_active

nr_active就表示整个队列中一共有多少个进程。所以进程调度时先查nr_activebitmap(确认下标)→queue,找到目标队列,从目标队列头部提取内容,头部移除(Pop_from),将当前结点的PCB放入到struct task_struct* current指针里,执行切换算法,将current指针指向的进程放到CPU上就能运行了

如果这样调度的话,假如今天有一个60号进程,它是一个死循环,也有一个99号进程。60进程时间片到了,运行完毕后,切换下去,它未来还要被调度的,所以就将它重新放到了这个队列(60优先级指向的队列)的最后面进行排队

此时你就会发现存在什么样的问题,CPU在调度时,只有将60优先级队列中的所有进程全部跑完,才会跑后面优先级队列的进程,跑完前面所有进程,才会跑99号进程,可是60号进程是个死循环,那99号进程就永远无法被调度,就会造成进程饥饿问题

4. 活跃进程与过期进程

那为了解决上面进程饥饿问题,就存在着活跃进程与过期进程之分,活跃进程指向蓝色框,过期进程指向红色框,框中内容是相同的

在这里插入图片描述

挑选活跃进程中60号进程,它要被CPU调度,等时间片到了之后,它要从CPU上剖离下来,那此时这个进程它不能再放回到active指针所指向的活跃进程中的60号队列当中,得链入到expired指针所指向的过期进程中的60号队列当中,CPU它调度完成的进程都是要放入到过期进程的对应位置

这样active queue进程会越来越少,expired queue进程会越来越多。直至active queue中的进程全部为0,即nr_active = 0,最后直接swap(&active, &expired),交换它两指向的内容,重新进行调度

上面才算是真正的Linux内核进程调度算法之大O(1)调度算法。这里还要提到的一点就是:当新进程到来时,如果将新进程放到过期进程当中,目前这个进程就处于就绪状态

很多分时操作系统是支持内核优先级抢占的,比如当前正在运行的是80号进程,新来了一个65号进程,新进程就要给特权,让它尽快运行,那就只能让它插队,那总不能让它插到过期进程的队列当中吧,就直接让它链入到活跃进程的65号队列当中,就开始了优先级的抢占

环境变量

1. 基本概念

  • 环境变量(environmentvariables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
  • 比如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性
  • 常见环境变量
    • PATH:指定命令的搜索路径
    • HOME:指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
    • SHELL:它的值通常是/bin/bash

2. 命令行参数

main函数有参数吗?有,argv相当于一张命令行参数表,而argc表示argv指针数组元素的个数

#include<stdio.h>int main(int argc, char* argv[])
{for (int i = 0; i < argc; i++){printf("argv[%d]: %s\n", i, argv[i]);}return 0;
}

在这里插入图片描述

再写一段代码,来帮助理解程序如何利用argv命令行参数表实现选项功能

int main(int argc, char* argv[])
{if (argc != 2){printf("Usage: %s [-a|-b|-c]\n", argv[0]);return 0;}const char* arg = argv[1];if (strcmp(arg, "-a") == 0)printf("这是功能1\n");else if (strcmp(arg, "-b") == 0)printf("这是功能2\n");else if (strcmp(arg, "-c") == 0)printf("这是功能3\n");else printf("Usage: %s [-a|-b|-c]\n", argv[0]);return 0;
}

在这里插入图片描述

3. PATH 环境变量

可是执行我们自己的命令需要带./,执行系统的命令却不需要,这是为什么呢?

首先你写的二进制指令与系统的指令并没有本质区别,咱们所用的指令本质上在系统里提前预装的二进制程序,你写的二进制程序同样如此,它们两个并没有本质区别。 那为啥一个带路径,一个不带路径呢?

你要知道,要去执行一个程序,那必须先找到它。./code在当前路径下执行可执行程序, 系统指令却不需要带路径的原因是因为系统中存在环境变量

在这里插入图片描述

特别不建议将你自己写的二进制程序拷贝到/usr/bin目录下,因为你的二进制文件并没有经过测试,可能会存在bug,可能会污染系统原本的指令池

在这里插入图片描述

那系统凭啥就知道执行命令时就去/usr/bin目录下去找呢?因为系统中存在环境变量PATH,这个环境变量在系统中默认是存在的,用来标识一串路径,告诉系统,要去哪些路径下去找二进制可执行文件(系统中搜索指令的默认搜索路径)

4. 环境变量具体操作

介绍两个指令,env:查看系统中所有的环境变量,echo $环境变量名称:具体查看一个环境变量的内容

在这里插入图片描述

对于PATH这个环境变量,执行ls指令时,以冒号作为分隔符,从第一个路径去找可执行文件,没找到再依次去后面的路径找

如果想要去修改一个环境变量的内容,直接环境变量名称=具体修改内容,比如PATH=/home/xiao,就直接进行路径覆盖

在这里插入图片描述

如果想要在PATH这个环境变量中去新增一个路径,可以PATH=$PATH:绝对路径。那我修改了咋改回来呢?关掉xshell,再重新登录即可(恢复默认的环境变量)

在这里插入图片描述

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

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

相关文章

为什么数组可以做到时间复杂度为O(1)的随机访问

这个问题涉及数组底层结构与内存寻址机制 一、数组元素在内存中连续存储 数组在内存中会开辟一块连续地址空间。假设数组A为int类型&#xff0c;共有n个元素&#xff0c;每个元素大小为4字节&#xff0c;那么他们在内存中的存储结构可能如下&#xff1a;内存地址数组元素A0x100…

《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——5. 集成OpenCV:让程序拥有“视力”

目录一、概述1.1 背景介绍&#xff1a;赋予应用“视力”1.2 学习目标二、集成OpenCV2.1 安装OpenCV2.2 在Qt项目中配置CMake三、项目数据集介绍与准备四、图像的桥梁&#xff1a;ImageProvider与格式转换五、加载、转换并显示图像六、总结与展望一、概述 1.1 背景介绍&#xf…

智慧驾驶疲劳检测算法的实时性优化

智慧驾驶疲劳检测&#xff1a;从技术突破到场景革命全球每年因疲劳驾驶引发的交通事故占比超20%&#xff0c;夜间及长途驾驶场景中这一比例更高。当驾驶员出现疲劳甚至晕倒等危险驾驶行为时&#xff0c;传统检测手段因依赖单一传感器或受环境干扰&#xff0c;存在误报率高、响应…

USRP X440

产品概述 USRP X440 是 Ettus Research 推出的高性能、多通道、宽带软件定义无线电&#xff08;SDR&#xff09;系统。基于 Xilinx Zynq UltraScale RFSoC 架构&#xff0c;它提供高密度、相干性的信号收发能力&#xff0c;帮助您快速构建雷达、电子战&#xff08;EW&#xff0…

[特殊字符] GitHub 2025年7月月度精选项目 Top5

&#x1f680; GitHub 2025年7月月度精选项目 Top5 本月GitHub有哪些值得关注的优质开源项目&#xff1f;我从数千个新项目中&#xff0c;精选了5个有趣 实用 可演示的仓库 无论你是开发者、AI爱好者、工具控&#xff0c;还是正在做副业产品&#xff0c;这篇文章都值得收藏&a…

微服务架构下的自动化测试策略调优经验分享

微服务架构下,自动化测试策略需针对分布式特性、服务自治性和高耦合风险进行针对性调整的关键调整方向及实施方法: 一、​​测试策略重构:分层与契约驱动​​ 1. ​​测试金字塔升级为钻石模型​​ ​​调整逻辑​​:传统金字塔中UI测试占比过高,而微服务需强化契约测试与…

图论:并查集

入门 久闻并查集的大名&#xff0c;今天来一探究竟&#xff0c;到底什么是并查集&#xff0c;并查集有什么用&#xff1f; 并查集(Disjoint Set Union, DSU)是一种处理不相交集合的合并及查询问题的数据结构。 其实并查集的作用主要就有两个&#xff1a; 1、将两个元素添加到…

告别静态文档!Oracle交互式技术架构图让数据库学习“活“起来

&#x1f5fa;️ 当数据库架构图学会"互动" 想象一下&#xff0c;你正在学习Oracle数据库架构&#xff0c;面对密密麻麻的静态文档和复杂的组件关系图&#xff0c;是不是常常感到&#xff1a; 像在迷宫里找路&#xff0c;不知道组件间如何协作&#xff1f;想深入了…

day62-可观测性建设-全链路监控zabbix+grafana

&#x1f31f;监控api接口 &#x1f50d;监控zabbix-api接口 生成API tokens命令行测试 curl -s -X POST -H "Content-Type: application/json-rpc" -d {"jsonrpc": "2.0","method": "host.get","params": {&quo…

通过Deepseek找工作

推送的结果如下,对应的AI提示词在底部: 计算机方向远程工作职位汇总 整合全球远程技术岗位 | 支持全地域远程办公 | 涵盖开发、安全、云计算等方向 覆盖方向:8+个技术领域 薪资范围:10K-40K/月 工作模式:100%远程 远程技术职位列表 职位名称 技能要求 经验要求 薪资…

vscode文件颜色,只显示自己更改的文件颜色、刚git下来的库,vscode打开后,显示所有文件都被修改了

问题&#xff1a;git新的库&#xff0c;然后我用vscode打开&#xff0c;默认显示所有的文件都更改了&#xff0c;但是我打开他们修改的对比&#xff0c;没有显示任何有被修改的地方&#xff0c;是怎么回事 linux/wsl下这么设置就可以了&#xff1a;git config core.autocrlf in…

基于ENMeval包的MaxEnt模型参数优化总结

MaxEnt模型参数优化1. MaxEnt模型优化&#xff1a;增加RM&#xff0c;降低模型过拟合风险&#xff0c;简易模型&#xff0c;平滑响应曲线&#xff0c;增强模型可解释性和转移性&#xff08;生物入侵&#xff09;2. 默认参数&#xff1a;FCLQHP&#xff0c;RM12.1. 基于优化的 M…

Docker实践:使用Docker部署blog轻量级博客系统

Docker实践&#xff1a;使用Docker部署blog轻量级博客系统一、blog系统介绍1.1 blog介绍1.2 个人博客系统介绍1.3 个人博客使用场景二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、…

专题:2025电商增长新势力洞察报告:区域裂变、平台垄断与银发平权|附260+报告PDF、原数据表汇总下载

原文链接&#xff1a;https://tecdat.cn/?p43416 当茂名果农对着镜头用方言喊出“荔枝现摘现发”&#xff0c;2小时卖出83万元&#xff1b;当65岁的上海阿姨通过“子女代付”买到人生第一台智能冰箱——2025年的电商战场&#xff0c;正在上演三重革命&#xff1a;新兴市场的增…

数字化转型-AI落地金字塔法则

前言 人工智能必须要跟传统产业结合&#xff0c;融入传统产业&#xff0c;才能落地&#xff0c;才能产生巨大的倍增个几何级效果&#xff01;&#xff01; AI不应该停留在工具层面&#xff0c;AI不仅仅是工具&#xff0c;不仅仅是硬件和软件&#xff0c;而是软硬结合。人工智能…

SQL Server 字段类型选型指南:什么数据用什么字段

目录 一、数值型数据 二、日期与时间数据 三、字符串与文本数据 四、布尔值与状态码 五、二进制与文件数据 六、唯一标识符&#xff08;GUID&#xff09; 七、枚举与代码表设计 八、存储优化小结 九、总结 在数据库设计中&#xff0c;字段类型&#xff08;数据类型&am…

酷暑来袭,科技如何让城市清凉又洁净?

烈日下的身影&#xff0c;不该被“炙烤”的担当又是一年盛夏&#xff0c;城市的血管在高温下脉动&#xff0c;柏油马路仿佛要融化&#xff0c;空气中弥漫着灼热的气息。此刻&#xff0c;你是否曾留意过那些身影&#xff1f;在烈日下&#xff0c;他们依旧坚守岗位&#xff0c;用…

传统框架与减震楼盖框架地震动力响应分析与有限元模拟

传统框架与减震楼盖框架地震动力响应分析与有限元模拟 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家,觉得好请收藏。点击跳转到网站。 摘要 本文针对传统钢框架和减震楼盖钢框架两种结构体系,建立了水平地震作用下的动力学模型,推…

Java集合去重

✅ 方式一&#xff1a;TreeSet Comparator最优雅的一种&#xff0c;适用于对象中某个字段唯一的去重&#xff08;如 partyAId&#xff09;List<PartyACompanyVO> result contractDOS.stream().map(contract -> {PartyACompanyVO vo new PartyACompanyVO();vo.setPa…

Qt字符串处理与正则表达式应用

一、Qt字符串处理基础 在Qt应用程序开发中&#xff0c;字符串处理是一项常见且重要的任务。Qt提供了强大而灵活的字符串处理功能&#xff0c;能够满足各种复杂的文本处理需求。 1.1 QString类概述 QString是Qt中处理字符串的核心类&#xff0c;它基于Unicode编码&#xff0c…