Linux进程优先级进程环境变量

文章详细介绍了Linux系统中进程的优先级,包括为什么需要优先级、如何查看和调整进程的nice值,以及通过top和renice命令修改进程优先级。此外,还阐述了环境变量的概念,特别是PATH、HOME和SHELL的作用,并提供了查看和设置环境变量的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux进程优先级/进程环境变量

进程优先级

优先级:实际上就是CPU分配资源的先后顺序,指的就是进程的优先权。

优先级存在的原因

原因是:资源是有限的,CPU资源同样是有限的。CPU一次只能跑一个进程,但进程确是不止一个的,所以需要用进程优先级区分,进程获取CPU资源的先后顺序。

查看优先级

我们可以使用以下命令查看进程优先级。

[---@VM-8-4-centos day01]$ ps -l

image-20230719221348127

其中有几个重要的信息:

  • UID:代表执行者的身份
  • PID:代表进程的代号
  • PPID:代表父进程的代号
  • PRI:代表进程的优先级
  • NI:代表进程的nice值,用来修正进程的优先级

PRI & NI

  • PRI是进程的优先级 通俗点说就是程序被CPU执行的先后顺序 此值越小进程的优先级别越高
  • NI值就是我们所要说的nice值了 其表示进程可被执行的优先级的修正数值
  • PRI和NI值的关系符合下面的公式 PRI(new) = PRI (old)+ NI
  • 当NI值为负值的时候 那么该程序将会优先级值将变小 优先级会变高
  • 调整进程优先级 就是调整进程的nice值
  • nice的取值范围是-20~19 一共四十个值

在Linux系统中,PRI值默认为80,所以优先级PRI = 80 + NI。

NI

NI值的范围是-20~19,如果超出这个范围,就会设置一个最接近这个区间的值也就是如果小于-20,就设为-20。如果大于19,就设为19。

为什么会有这个范围的规矩呢?

这是因为操作系统为了各个进程的公平运行,如果优先级(PRI)设置的很低操作系统就会更倾向于执行这个进程从而导致其他进程不能很好的被CPU执行。

nice(NI)值的修改

  • top命令修改

1.输入top

image-20230719221320281

2.按r键,输入需要被修改的PID。

image-20230719221504554

3.输入修改后的NI值

image-20230719221532328

4.按q键退出

查看修改后的PRI值和NI值:(我不小心退出了,新的PID是25409)

image-20230719221710142

我们本来设置的100,被改为了19。

如果我们想改为负值,则需要sudo提升权限。

  • 使用命令renice
[---@VM-8-4-centos day01]$ renice 10 26249
//26249 (process ID) old priority 0, new priority 10

image-20230719222016917

如果想修改为负值,同样需要sudo提升权限。

环境变量

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。

一般环境变量在系统中是具有全局性的。

常见环境变量
  • PATH:指定命令的搜索路径
  • HOME:指定用户的主工作目录(用户登录Linux后的默认路径)
  • SHELL:当前的Shell,通常是bin/bash
查看环境变量

我们通过以下指令进行查看环境变量:

[---@VM-8-4-centos ~]$ echo $(PATH/HOME/SHELL/...)

image-20230720091715937

PATH

我们在执行可执行程序时,为什么要加./呢?为什么一些我们输入的命令就不用加呢?

image-20230720092403951

原因是:我们在输入ls等命令时,系统可以识别出这些命令存在的默认路径,而我们生成的可执行文件,系统可不知道它的路径是什么。所以我们需要给系统指明路径加上./指明该可执行程序是在当前路径下的。

为什么系统知道ls等命令的路径呢?

因为PATH中存了这些命令的路径。

[---@VM-8-4-centos day01]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/wsj/.local/bin:/home/wsj/bin
[---@VM-8-4-centos day01]$ which ls
alias ls='ls --color=auto'
	/usr/bin/ls

image-20230720092959077

如果我们也想我们的可执行程序不加路径就可以被执行呢?

方法1.把可执行程序拷贝到PATH环境变量下的某一路径

[---@VM-8-4-centos day01]$ sudo cp mycode /usr/bin

image-20230720093527291

方法2.把可执行程序的当前路径拷贝到PATH环境变量

路径输入pwd后的路径,从==/home/…==替换。

[wsj@VM-8-4-centos day01]$ export PATH=$PATH:/home/...

image-20230720093744262

HOME

每个用户都有自己的主目录(工作目录)。

下面一个是普通用户,另一个是超级用户:

image-20230720094314310

SHELL

我们在Linux操作系统当中所敲的各种命令,实际上需要由命令行解释器进行解释,而在Linux当中有许多种命令行解释器(例如bash、sh),我们可以通过查看环境变量SHELL来知道自己当前所用的命令行解释器的种类。

image-20230720094656779

相关命令
  • echo 显示某个环境变量的值
  • export 设置一个新的环境变量

image-20230720095257260

  • env 显示所有环境变量

image-20230720095324529

  • set 显示本地定义的SHELL变量和环境变量

因为太多了就显示前5行。

image-20230720095434872

  • unset 清除环境变量

image-20230720100835261

环境变量的组织方式

其实就是一个二级指针:

image-20230720102250625

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

通过main获取环境变量

main函数其实一共有3个参数,一般我们都不会去写它。

main(argc, argv, envp)

我们通过以下代码了解一下:

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

image-20230720103215490

  • argc:指针数组argv中有效元素个数
  • argv:指针数组,存储的第一个是可执行程序的位置,其余是后面跟的各种选项
  • envp:接受环境变量表,通过它获取系统的环境变量

image-20230720103821420

通过对这三个参数了解,我们写两段代码体会一下这三个参数:

代码1:

int main(int argc, char *argv[])
{
    if (argc > 1)
    {
        if (strcmp(argv[1], "a") == 0)
        {
            cout << "hello" << endl;
        }
        else if (strcmp(argv[1], "b") == 0)
        {
            cout << "byebye" << endl;
        }
        else
        {
            cout << "nt" << endl;
        }
    }
    else
    {
        cout << "ggwp" << endl;
    }
    return 0;
}

image-20230720105008203

代码2:

int main(int argc, char* argv[], char* envp[])
{
    int i = 0;
    while(envp[i])
    {
        cout << envp[i] << endl;
        i++;
    }
    return 0;
}

运行结果就是各个环境变量的值。

image-20230720105308112

通过environ获取环境变量
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int main()
{
    extern char** environ;
    int i = 0;
    while(environ[i])
    {
        cout << environ[i] << endl;
        i++;
    }
    return 0;
}

和通过char* envp[]的结果差不多。

image-20230720110221926

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

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

系统调用:getenv

int main()
{
    cout << getenv("HOME") << endl;//PATH SHELL
    return 0;
}

image-20230720110735052

感谢您的阅读,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值