【Linux】进程优先级,环境变量,进程地址空间

news2024/11/24 17:03:26

文章目录

  • 1.进程优先级
    • 基本概念
    • 查看系统进程
    • PRI and NI
    • PRI vs NI
    • 修改进程优先级的命令
    • 其他概念
  • 2. 环境变量
    • 基本概念
    • 查看环境变量方法
    • 常见环境变量
    • 测试PATH
    • 环境变量相关的命令
    • 环境变量的组织方式
    • 通过代码如何获取环境变量
    • 通过系统调用获取或设置环境变量
    • 环境变量通常是具有全局属性的
  • 3. 程序地址空间
    • 程序地址空间回顾
    • 用代码的角度测试一下
    • 进程地址空间

1.进程优先级

基本概念

  • cpu资源分配的先后顺序,就是指进程的优先权(priority)。

  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。

  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能

查看系统进程

在linux或者unix系统中,用ps –l命令则会类似输出以下几个内容:

image-20230906213855809

我们很容易注意到其中的几个重要信息,有下 :

  • UID : 代表执行者的身份

  • PID : 代表这个进程的代号

  • PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号

  • PRI :代表这个进程可被执行的优先级,其值越小越早被执行

  • NI :代表这个进程的nice值

PRI and NI

PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高

那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行,所以,调整进程优先级,在Linux下,就是调整进程nice值nice其取值范围是-20至19,一共40个级别

PRI vs NI

需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。
可以理解nice值是进程优先级的修正修正数据

修改进程优先级的命令

用top命令更改已存在进程的nice:

(1)top
(2)进入top后按“r”–>输入进程PID–>输入nice值

其他概念

  • 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级

  • 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰

  • 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行

  • 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

2. 环境变量

基本概念

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

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

查看环境变量方法

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

常见环境变量

PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。

image-20230906214745511

测试PATH

  1. 创建hello.c文件
image-20230906215418905
  1. 对比./hello执行和之间hello执行

image-20230906215526409

很明显可以看到,在执行hello这个程序的时候,如何没有加上./就无法运行

  1. 为什么有些指令可以直接执行,不需要带路径,而我们的二进制程序需要带路径才能执行?

    这是因为在操作系统中,系统已经配置了一些默认的环境变量和路径,使得某些常用的指令可以直接执行,而不需要指定完整的路径。这些指令通常是操作系统提供的核心功能或常用工具,比如lscdmkdir等。

    对于二进制程序来说,它们并不在默认的路径中,所以需要提供完整的路径才能执行。如果你想让一个二进制程序在任何位置都能被执行,可以将其所在的路径添加到系统的环境变量中,这样就可以直接使用程序名来执行了。

    另外,如果你当前所在的目录中有一个可执行文件,你也可以使用相对路径来执行它,比如./program,其中./表示当前目录。但是相对路径只适用于当前目录下的文件,如果要执行其他目录下的文件,还是需要提供完整的路径。

  2. 将我们的程序所在路径加入环境变量PATH当中, export PATH=$PATH:hello程序所在路径

    image-20230906220412780

  3. 对比测试

    image-20230906220435137

  4. 还有什么方法可以不用带路径,直接就可以运行呢?

    如果我们使用 root 权限将我们所写的程序拷贝到 /bin 目录下,那样就可以直接执行自己写的程序了。 这个方法一般不是很理想,这里不做演示。

环境变量相关的命令

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

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

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

  4. unset: 清除环境变量

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

环境变量的组织方式

image-20230907161906343

通过代码如何获取环境变量

  1. 命令行第三个参数

image-20230907163252683

image-20230907162330772
  1. 通过第三方变量environ获取

    image-20230907163137584

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

    image-20230907163442554

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

image-20230907163713779

image-20230907163655491

常用getenv来访问特定的环境变量

环境变量通常是具有全局属性的

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

(1) 添加环境变量MYENV=1

image-20230907164112674

(2)创建子进程验证是否存在MYENV

image-20230907165031026

image-20230907165008706

如果只进行 MYENV=“helloworld” ,不调用export导出,在用我们的程序查看,会有什么结果?为什么?

image-20230907165743900

image-20230907165809565

不加export就是普通变量,无法给子进程继承

export表示为全局变量,不止对当前shell有效,对子进程也有效,否则则为局部变量,只对当前shell有效,子进程无效。

3. 程序地址空间

研究背景

Linux centos7 3.10.0-1160.90.1.el7.x86_64

程序地址空间回顾

下面的程序地址空间图,一定是绝大部分大刚开始学C语言的时候就接触过的空间布局图—当那个时候我们对此并不理解

image-20230907170510788

用代码的角度测试一下

#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){ 
       //子进程
       printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
	}else{ 
       //父进程
       printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
	}
	return 0;
}

输出的结果与环境相关,观察现象即可

image-20230907171222587

我们发现,输出出来的变量值和地址是一模一样的,很好理解,因为子进程按照父进程为模版,父子并没有对变量进行进行任何修改。可是将代码稍加改动

#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){ 
       //子进程
       g_val=100;                                  
     	//现在这个场景子进程肯定先跑完,也就是子进程先修改,完成之后,父进程再读取
       printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
	}else{ 
       //父进程
       printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
	}
	return 0;
}

image-20230907171952988

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

  • 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量
  • 地址值是一样的,说明,该地址绝对不是物理地址!
  • 在Linux地址下,这种地址叫做 虚拟地址
  • 所以我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理OS必须负责将 虚拟地址 转化成 物理地址

进程地址空间

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

image-20230907173357193

说明: 同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址

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

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

相关文章

1DM+下载器_11.2.1魔改增强版下载

1DM「原&#xff1a;IDM」下载器是一款安卓端的下载工具&#xff0c;多语言解锁版直安装版本&#xff0c;号称是目前 Android 平台最快、最先进的下载管理器应用「支持通过Torrent下载」&#xff0c;而这个版本是改线程的最新idm版本&#xff0c;可用来下载视频、音乐、电影、T…

2023-9-8 求组合数(三)

题目链接&#xff1a;求组合数 IV #include <iostream> #include <algorithm>using namespace std;const int N 5010;int primes[N], cnt; bool st[N]; // 每个质数的次数 int sum[N];void get_primes(int n) {for(int i 2; i < n; i){if(!st[i]) primes[cnt]…

bean的管理-bean的获取

获取bean 默认情况下&#xff0c;在Spring项目启动时&#xff0c;会把bean都创建好&#xff08;但是还会受到作用域及延迟初始化的影响&#xff09;放在IOC容器中&#xff0c;如果想主动获取这些bean&#xff0c;可以通过如下方式 根据name获取bean Object getBean&#xff08…

智能机器人:打造自动化未来的关键技术

文章目录 1. 智能机器人的基本概念2. 智能机器人的关键技术2.1 机器视觉2.2 机器学习与深度学习2.3 传感器技术 3. 智能机器人的应用领域3.1 制造业3.2 医疗保健3.3 农业3.4 服务业 4. 智能机器人的未来趋势4.1 自主决策能力的提升4.2 协作与互操作性4.3 个性化定制4.4 环境感知…

正弦信号的平均功率和峰值电压计算举例

正弦信号的平均功率和峰值电压计算举例 一、问题 假设加载在纯电阻为R1Ω&#xff0c;频率为50Hz和60Hz的正弦信号的平均功率分别为0.5W和2W,请求解这两个信号的峰值电压 U p 1 U_{p1} Up1​和 U p 2 U_{p2} Up2​。 二、解答&#xff1a; 根据欧姆定律可知&#xff1a;对于…

Java虚拟机内存模型和垃圾回收机制

1 Java虚拟机内存模型是怎样的&#xff1f; 2 常见垃圾回收器及其作用内存&#xff1f;

激活函数总结(三十):激活函数补充(Logit、Softsign)

激活函数总结&#xff08;三十&#xff09;&#xff1a;激活函数补充 1 引言2 激活函数2.1 Logit激活函数2.2 Softsign激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PReLU、Swish、ELU、SELU、GELU、Softmax、So…

基于 SpringBoot 的大学生体质测试管理系统,附源码

文章目录 简介效果图系统首页模块管理员功能模块用户功能模块教师功能模块 部分源码源码下载地址 简介 本次设计任务是要设计一个大学生体质测试管理系统&#xff0c;通过这个系统能够满足大学生体质测试管理系统功能。系统的主要功能包括首页、个人中心、用户管理、教师管理、…

记一次opencv安装过程

环境为anaconda&#xff0c;python选择3.9 上图&#xff0c;def仅为了可以折叠&#xff0c;方便观察 (simswap) C:\Windows\system32>conda install opencv def 执行后失败:无科学上网Retrieving notices: ...working... DEBUG:urllib3.connectionpool:Starting new HTTPS …

高频golang面试题:简单聊聊内存逃逸?

文章目录 问题怎么答举例 问题 知道golang的内存逃逸吗&#xff1f;什么情况下会发生内存逃逸&#xff1f; 怎么答 golang程序变量会携带有一组校验数据&#xff0c;用来证明它的整个生命周期是否在运行时完全可知。如果变量通过了这些校验&#xff0c;它就可以在栈上分配。…

了解 Java 并发编程中的 volatile 关键字

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 了解 Java 并发编程中的 volatile 关键字 ⏱️ 创作时间&#xff1a; …

[NLP]LLM---FineTune自己的Llama2模型

一 数据集准备 Let’s talk a bit about the parameters we can tune here. First, we want to load a llama-2-7b-hf model and train it on the mlabonne/guanaco-llama2-1k (1,000 samples), which will produce our fine-tuned model llama-2-7b-miniguanaco. If you’re …

5分钟生成10条短视频,AI重构电商营销

点击关注 文&#xff5c;姚 悦&#xff0c;编&#xff5c;王一粟 “我们将正式告别过去单一渠道投放的时代&#xff0c;走向一站式跨渠道品效联合经营的全新时代。”9月6日&#xff0c;在2023年其最重要的营销峰会上&#xff0c;淘天集团阿里妈妈市场部总经理穆尔说道。 当天…

【C++】模拟实现二叉搜索树的增删查改功能

个人主页&#xff1a;&#x1f35d;在肯德基吃麻辣烫 我的gitee&#xff1a;C仓库 个人专栏&#xff1a;C专栏 文章目录 一、二叉搜索树的Insert操作&#xff08;非递归&#xff09;分析过程代码求解 二、二叉搜索树的Erase操作&#xff08;非递归&#xff09;分析过程代码求解…

java从入门到起飞(八)——循环和递归

文章目录 Java循环1. 什么是循环&#xff1f;1.1 为什么需要循环&#xff1f;1.2 循环的分类 2. Java中的循环结构2.1 for循环2.2 while循环2.3 do-while循环 3. 循环控制语句3.1 break语句3.2 continue语句 4. 总结 Java递归1. 什么是递归2. 递归的原理3. 递归的实现4. 递归的…

鼠标右键使用VSCode打开文件或文件夹配置

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

算法通关村17关 | 透析跳跃游戏

1. 跳跃游戏 题目 LeetCode55 给定一个非负整数数组&#xff0c;最初位于数组的第一个位置&#xff0c;数组中的每个元素代表你再该位置可以跳跃的最大长度&#xff0c;判断你是否能够达到最后一个位置。 思路 如果当前位置元素如果是3&#xff0c;我们无需考虑是跳几步&#…

04、javascript 修改对象中原有的属性值、修改对象中原有属性的名字(两种方式)、添加对象中新属性等的操作

1、修改对象中原有的属性值 其一、代码为&#xff1a; // 想将 obj 中的 flag 值&#xff0c;根据不同的值来变化(即&#xff1a;修改对象中原有的属性值)&#xff1b; let obj {"port": "port_0","desc": "desc_0","flag&quo…

【LeetCode】一起探究三数之和的奥秘

Problem: 15. 三数之和 文章目录 题目解析算法原理分析排序 暴力枚举 set去重排序 单调性 双指针划分思想 复杂度Code 题目解析 首先我们来分析一下本题的思路 题目说到要我们在一个整数数组中去寻找三元组&#xff0c;而且呢这三个数字所相加的和为0&#xff0c;而且呢这三…

数据复制:构建大规模分布式系统的关键组成部分

数据复制对于构建可靠的大规模分布式系统至关重要。在本期中&#xff0c;我们将探讨常见的复制策略以及选择合适策略的关键因素。 在本期中&#xff0c;我们将以数据库为例进行讨论。请注意&#xff0c;复制不仅适用于数据库&#xff0c;还适用于缓存服务器&#xff08;如Redis…