Linux系统---环境变量+内核进程调度队列(选学)

顾得泉:个人主页

个人专栏:《Linux操作系统》  《C/C++》

键盘敲烂,年薪百万!


一、环境变量

1.基本概念

       环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:

       我们在编写CI/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

       环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

2.常见环境变量

       PATH:指定命令的搜索路径

       HOME:指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)

       SHELL:当前Shell,它的值通常是/bin/bash。

3.如何查看环境变量

       echo  $NAME      //NAME:你的环境变量名称

4.环境变量相关的命令

       1.echo:显示某个环境变量值

       2.export:设置一个新的环境变量

       3.env:显示所有环境变量

       4.unset:清除环境变量

       5.set:显示本地定义的shell变量和环境变量

5.环境变量的组织方式

       每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以O'结尾的环境字符串。

6.通过代码获取环境变量

1.命令行第三个参数

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

2.通过第三方变量environ获取

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

       libc中定义的全局变量environ指向环境变量表environ没有包含在任何头文件中,所以在使用时要用extern声明。

7.通过系统调用获取或设置环境变量

#include <stdio.h>
#include <stdlib.h>int main()
{printf("%s\n", getenv("PATH"));return 0;
}

       常用getenv和putenv函数来访问特定的环境变量。

8.环境变量的全局属性

       环境变量通常具有全局属性,可以被子进程继承下去

#include <stdio.h>
#include <stdlib.h>int main()
{char * env = getenv("MYENV");if(env){printf("%s\n", env);}return 0;
}

       运行后直接查看,发现没有结果,说明该环境变量根本不存在

导出环境变量

        export MYENV=" hello world"

       再次运行程序,发现结果有了!

       说明:环境变量是可以被了进程继承下去的!


二、Linux内核进程调度队列

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

1.一个CPU拥有一个runqueue

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

2.优先级

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

       实时优先级:0~~99(不关心)

3.活动队列

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

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

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

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

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

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

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

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

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

4.过期队列

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

       过期队列上放置的进程,都是时间片耗尽的进程

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

5.active指针和expired指针

       active指针永远指向活动队列

       expired指针永远指向过期队列

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

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

6.总结

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


结语:Linux系统关于环境变量和内核进程调度队列的分享到这里就结束了,没有进行展示的操作大家可以自行练习,希望本篇文章的分享会对大家的学习带来些许帮助,如果大家有什么问题,欢迎大家在评论区留言~~~ 

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

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

相关文章

从0开始学习JavaScript--JavaScript 闭包的应用

JavaScript的高级概念中&#xff0c;闭包&#xff08;closure&#xff09;常常是一个让人感到困惑但又强大的概念。在这篇文章中&#xff0c;将深入探讨闭包的概念以及它在JavaScript中的各种应用场景。 什么是闭包&#xff1f; 在JavaScript中&#xff0c;闭包是指一个函数能…

MySQL系列 - 数据类型

MySQL是一种常用的关系型数据库管理系统&#xff0c;它支持多种数据类型&#xff0c;包括整数、浮点数、字符串、日期和时间等。在本文中&#xff0c;我们将介绍MySQL中常用的数据类型及其用法。 MySQL数据类型介绍&#xff1a; 1、整数类型&#xff1a; MySQL提供了多种整数…

3个.NET开源免费的仓库管理系统(WMS)

前言 今天给大家推荐3个.NET开源免费的WMS仓库管理系统&#xff08;注意&#xff1a;以下排名不分先后&#xff09;。 仓储管理系统介绍 仓储管理系统&#xff08;Warehouse Management System&#xff0c;WMS&#xff09;是一种用于管理和控制仓库操作的软件系统&#xff0…

Java 8 中 ReentrantLock 与 Synchronized 的区别

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

Linux下基于MPI的hello程序设计

Linux下基于MPI的hello程序设计 一、MPICH并行计算库安装实验环境部署创建SSH信任连接&#xff0c;实现免密钥互相连接node1安装MPICH 3.4配置NFS注意(一定要先看)环境测试 二、HELLO WORLD并行程序设计 一、MPICH并行计算库安装 在Linux环境下安装MPICH执行环境&#xff0c;配…

2023年汉字小达人市级比赛最后一天的整体复习建议和5个提醒

今天是2023年11月29日&#xff0c;明天&#xff08;11月30日&#xff0c;星期四&#xff09;就是2023年汉字小达人市级活动&#xff08;市级比赛&#xff09;比赛的日子了。从孩子今天16点30放学&#xff0c;到明天16点开始比赛&#xff0c;除去生活时间、写学校作业&#xff0…

VT-MSPA1-12-1X/V0直动式比例压力阀放大器

适用于控制不带电位移反馈的比例压力阀、比例流量阀、比例方向阀的控制;差动输入;1个脉冲输出端口;函数发生器;带斜坡时间可调的斜坡生器&#xff08;可上升和下降斜坡&#xff09;; 可调电流调节器;电源带错极保护;LED 电磁铁动作显示;&#xff08;LED 的亮度与流过电磁铁的电…

解决git action发布失败报错:Error: Resource not accessible by integration

现象&#xff1a; 网上说的解决方法都是什么到github个人中心setting里面的action设置里面去找。 可这玩意根本就没有&#xff01; 正确解决办法&#xff1a; 在你的仓库页面&#xff0c;注意是仓库页面的setting里面&#xff1a; Actions> General>Workflow permisss…

python实验3 石头剪刀布游戏

实验3&#xff1a;石头剪刀布游戏 一、实验目的二、知识要点图三、实验1. 石头剪刀布2. 实现大侠个人信息 一、实验目的 了解3类基本组合数据类型。理解列表概念并掌握Python中列表的使用。理解字典概念并掌握Python中字典的使用。运用jieba库进行中文分词并进行文本词频统计。…

python之pyqt专栏7-信号与槽3

在上一篇文章中python之pyqt专栏6-信号与槽2-CSDN博客中&#xff0c;我们可以了解到对象可以使用内置信号&#xff0c;这些信号来自于类定义或者继承过来的。我们可以对这些信号可以通过connect连接槽函数。 需求 现在有一个需求&#xff0c;有两个UI界面“untitled.ui”和“u…

深入redis过程-命令

目录 通用命令 get set keys exists del expire key seconds ttl type 常用数据结构 String类型 SET GET MSET MGET INCR INCRBY INCRBYFLOAT SETNX SETEX Hash类型 HSET key field value HGET key field HMSET HMGET HGETALL HKEYS HVALS HINCRB…