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

2023-11-20

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux】进程优先级,环境变量,进程地址空间 的相关文章

  • 对 sf:: 的未定义引用

    我想用 C 制作 GUI 应用程序 发现 SFML 是一个不错的选择 幸运的是 我使用的是 Linux 所以 SFML 2 4 已经安装在我的系统上 所以我开始搜索一些教程并找到了一个制作简单窗口的教程 但是当我运行代码时 出现错误 提示未
  • xdotool 类型需要很长时间并导致整个桌面冻结

    我一直在使用xdotool type过去只能在快捷方式上输入耸肩xdotool type 这可行 但总是需要相当长的时间 并导致整个桌面冻结 完全冻结 而不仅仅是输入 几秒钟 不过并没有太打扰我 现在我需要一种方法来从文件中读取内容 对其进
  • 通过 SSH 将变量传递给远程脚本

    我正在通过 SSH 从本地服务器在远程服务器上运行脚本 首先使用 SCP 复制该脚本 然后在传递一些参数时调用该脚本 如下所示 scp path to script server example org another path ssh s
  • Xenomai 中的周期性线程实时失败

    我正在创建一个周期性线程 它在模拟输出上输出方波信号 我正在使用 Xenomai API 中的 Posix Skin 和 Analogy 我使用示波器测试了代码的实时性能 并查看了方波信号 频率为 1kHz 的延迟 我应该实现 250us
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手
  • Gradle 1.3:build.gradle 不构建类

    这里有一个新问题 我有一个 build gradle 文件apply plugin java在其中 并与 java 项目 包关联 当我跑步时gradle build从命令行我得到 compileJava UP TO DATE process
  • 如何从 Linux 的 shell 中删除所有以 ._ 开头的文件?

    确实如标题所示 我已将许多文件从 Mac 复制到 Raspberry Pi 这导致了许多以前缀开头的多余文件 我想删除以以下开头的文件夹中的每个文件 我该怎么做 尝试类似的方法 cd path to directory rm rf 或者 如
  • perf stat中的cycles注释是什么意思

    8 014196 task clock 0 004 CPUs utilized 204 context switches 0 025 M sec 32 cpu migrations 0 004 M sec 0 page faults 0 0
  • 在 shell 脚本中查找和替换

    是否可以使用 shell 在文件中搜索然后替换值 当我安装服务时 我希望能够在配置文件中搜索变量 然后在该值中替换 插入我自己的设置 当然 您可以使用 sed 或 awk 来完成此操作 sed 示例 sed i s Andrew James
  • Linux 上的 Python 3.6 tkinter 窗口图标错误

    我正在从 Python GUI 编程手册 学习 Python GUI 某项任务要求我通过将以下代码添加到我的配方中来更改窗口图标 Change the main windows icon win iconbitmap r C Python3
  • 为 Linux 安装 R 包时出错

    我试图在 R 3 3 上安装一个名为 rgeos 的包 但是当我输入 install packages rgeos 但它返回给我以下错误 其他包也会发生同样的情况 但不是所有包 gt installing source package rg
  • 如何从linux命令行运行.exe可执行文件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 Windows 中有一个 abc exe 可执行文件 我可以使用 DOS 命令提示来执行此应用程序 并为其提供一些运行时变量 我想从
  • 无法仅在控制台中启动 androidstudio

    你好 我的问题是下一个 我下载了Android Studio如果我去 路径 android studio bin 我执行studio sh 我收到以下错误 No JDK found Please validate either STUDIO
  • 套接字:监听积压并接受

    listen sock backlog 在我看来 参数backlog限制连接数量 这是我的测试代码 server initialize the sockaddr of server server sin family AF INET ser
  • 如何调用位于其他目录的Makefile?

    我正在尝试这样做 我想打电话给 make Makefile存在于其他目录中 abc可以使用位于不同目录中的 shell 脚本的路径 我该怎么做呢 由于 shell 脚本不允许我cd进入Makefile目录并执行make 我怎样才能编写she
  • 操作系统什么时候清除进程的内存

    进程在某些操作系统上成功或异常终止 操作系统何时决定擦除分配给该进程的内存 数据 代码等 在退出时或当它想为新进程分配内存时 这个清除内存分配过程在所有操作系统 winXP Win7 linux Mac 上都相同吗 据我了解 页表具有该进程
  • 如何获取 linux 实用程序 tail 的源代码?

    这个命令确实非常有用 但是我可以在哪里获取源代码以查看内部发生的情况 thanks tail 实用程序是 Linux 上 coreutils 的一部分 源压缩包 ftp ftp gnu org gnu coreutils coreutils
  • gethostbyname() 或 getnameinfo() 如何在后台工作?

    How gethostbyname or getnameinfo 在后台工作 include
  • 如何使用AWK脚本检查表的所有列数据类型? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在这里 我正在检查表中第一列的数据类型 但我想知道AWK中表的所有列数据类型 我尝试过 但只能获得一列数据类型 例如 Column 1
  • git在Windows和Linux之间切换后强制刷新索引

    我有一个Windows和Linux共享的磁盘分区 格式 NTFS 它包含一个 git 存储库 约 6 7 GB 如果我只使用Windows or 只使用Linux操作 git 存储库一切正常 但是每次切换系统的时候git status命令将

随机推荐

  • java pakage、import关键字

    package介绍 常用的包 import 案例
  • C语言结构体初始化的四种方法

    定义 struct InitMember int first double second char third float four 方法一 定义时赋值 struct InitMember test 10 3 141590 method o
  • 静态功耗具体指什么

    之前我的理解一直为静态功耗等同于关机功耗 今天专门搜索了解了下 百度百科给出的定义是指漏电流功耗 是电路状态稳定时的功耗 其数量级很小 其实这个定义很模糊 怎样的状态是电路稳定状态 我自己的理解是静态功耗为两种 一 等同于关机功耗 即器件全
  • ssh连接很慢GSS failure解决办法

    什么导致了 scp 和 ssh 的登陆提示速度下降 就我自身所遇到的情况来看 这些延迟绝大部分是 GSSAPI 的认证功能导致的 你可以用 v 选项确认你的情况 例如 下面是 ssh 的详细登陆过程 cherry cherry ssh v
  • 原生JS实现随着鼠标滚动到元素位置触发对应css3动画,简单易用

    废话不多说 直接上代码 附用法 纯博主手写 看完后 觉得好左上角请点个赞 觉得不好的请留下您的建议 谢谢 此代码改版很方便 大家可以任意发挥 注意 如果不想自己写动画的 可以引入Animate css 相信这个动画库大家都不陌生 body
  • modbus协议crc校验c语言代码,modbus协议crc校验

    数据校验是数据传输必不可少的一部分 主要目的就是防止数据传输过程中出现差错 本文主要根据原理实现它的核心代码 预置1个16位的寄存器为十六进制FFFF 全1 此寄存器为CRC寄存器 把第一个8位二进制数据 即通讯信息帧的第一个字节 与16位
  • MySQL 常用高可用方案

    这一节内容来简单聊聊 MySQL 最常用的几种高可用方案 1 主从或主主 Keepalived 主从或主主 Keepalived 算是历史比较悠久的 MySQL 高可用方案 常见架构如下 其大致原理是 在主实例的 Keepalived 中
  • AIGC之Stable Diffusion 提示词学徒库

    前言 描述 本文主要用来记录 提示词TAG 一 提示词 1 提升画面品质的提示词 masterpiece 杰作 best quality 最佳品质 ultra highers 超高分辨率 8k resolution 8k分辨率 realis
  • C++基础问题

    1 在 main 函数执行之前和之后的代码可能是什么 main 函数执行之前 初始化系统相关资源 设置栈指针 初始化 static 变量和 global 变量 未初始化的全局变量赋初值 全局对象初始化 这里会调用构造函数 这是可能会调用的代
  • 为什么越来越多的 IT 人考软考?

    近几年随着国家计算机与软件技术的发展 每年报名参加软考考试的人也越来越多 据工信部新闻发布会消息 计算机软件与通信专业技术人员职业资格考试累计报考人数超过485万 2022年报考人数129万人 01 为什么越来越多的IT人考软考证书 1 软
  • 【精品示例】超实用Python爬虫入门实例——做一个优质舔狗

    引言 最近发现了一个有意思的网站 里面充斥了大量的舔狗箴言 作为一个爬虫发烧友怎么能错过此等机会 咱们直接就是上才艺 类的编写 本次爬虫使用了多协程的方案进行 保证了爬虫的速度 在这里我们新建一个爬虫类 并在里边添加上我们需要的方法 网页的
  • IDEA打包上传到阿里云私服

    上传阿里云私服报错 ERROR Failed to execute goal org apache maven plugins maven deploy plugin 2 8 2 deploy default deploy on proje
  • 通讯录系统图形化界面(C++,Qt5.12)(Visual Studio2019,QtCreator)(初学)

    目录 无用的前言 无用的话 无需用看 前言 一 开发工具 二 功能演示以及 源码和安装包 下载 三 功能介绍以及设计思路 四 代码具体实现 项目文件结构 main cpp mainwindow ui mainwindow h mainwin
  • 2.前端笔记-CSS-字体属性

    1 字体系列 CSS使用font family属性定义文本的字体系列 body font family 思源黑体 Microsoft YaHei 建议 使用英文写字体的属性值 尽量使用系统默认自带字体 保证在任何用户的浏览器都可以显示 微软
  • react 入坑学习(十四)混合菜单新模式(ANT ProLayout)

    混合菜单新模式 样例 Ant Design Pro Blog 文档 这个明显就比非混合的好看很多 今天就来试试改一改吧 现在官网中找到ProLayout 就可以找到这个混合模式的源码样例 import React from react im
  • css实现文本超出显示省略号

    一 普通情况下 1 固定width 2 overflow hidden 3 text overflow ellipsis 显示为省略号 4 white space nowrap 不换行 二 table表格里 td 设置上面的4步 table
  • Selenium 之订制启动Chrome的选项(Options)

    使用 selenium 时 我们可能需要对 chrome 做一些特殊的设置 以完成我们期望的浏览器行为 比如阻止图片加载 阻止JavaScript执行 等动作 这些需要 selenium的 ChromeOptions 来帮助我们完成 1 什
  • 3.Open3D教程——点云数据操作

    点云数据 本教程阐述了基本的点云用法 随需要的文件链接 1 显示点云 import open3d as o3d import numpy as np print Load a ply point cloud print it and ren
  • ESDA in PySal (3):Geosilhouettes:集群拟合的地理测量

    ESDA in PySal 3 Geosilhouettes 集群拟合的地理测量 Silhouette statistics Rousseeuw 1987 是观测值与给定聚类的拟合优度的非参数度量 在聚类具有 地理 解释的情况下 例如当它们
  • 【Linux】进程优先级,环境变量,进程地址空间

    文章目录 1 进程优先级 基本概念 查看系统进程 PRI and NI PRI vs NI 修改进程优先级的命令 其他概念 2 环境变量 基本概念 查看环境变量方法 常见环境变量 测试PATH 环境变量相关的命令 环境变量的组织方式 通过代