Linux进程概念——进程优先级、环境变量

一、Linux进程优先级

1.1 进程优先级三连问?

<1> 什么是进程优先级?(优先权 VS 权限)

首先我们了解两个概念,什么是优先权,什么是权限?

现实生活中,优先权指对于某种“事物”使用的先后顺序,而权限则是指我们能不能使用某种“事物”

例如,对于学校的食堂而言,谁来的早谁就能先打饭,而在一些学校教师可以优先打饭无需排队,这样教师就具有使用食堂的优先权,更甚至一些学校设有教职工餐厅,这个餐厅只允许教职工用餐而不允许学生用餐,这样教师就具有对教职工餐厅的权限,学生不具备这个权限。

而对于操作系统而言,进程优先权是指CPU资源分配的先后顺序,而权限通常体现在对某个文件的打开、创建删除等操作,或对某个系统函数、资源的调用等等。

<2> 为什么要有优先级?

假如系统只有一个cpu且只有一个进程在运行,那么就不需要优先级,进程独占资源。但是对于现代计算机,都是多任务多进程的,这就大大体现了优先级的价值,进程就需要被管理起来。

  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

<3> 怎么使用优先级?

进程的优先级决定了哪个进程优先使用某种资源(例如CPU,外设IO等)。

1.2 Linux进程优先级查看和修改

<1>查看系统进程

Linux系统中我们使用ps -l命令查看系统进程信息,信息如下:
在这里插入图片描述

<2> PRI和NI的区别与联系

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

NI表示进程可被执行的优先级的修正数值。nice其取值范围是-20至19,一共40个级别。
PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为: P R I ( n e w ) = P R I ( o l d ) + n i c e PRI(new)=PRI(old)+nice PRI(new)=PRI(old)+nice
当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行。

区别

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

<3> 修改进程优先级的命令

在这里插入图片描述
在这里插入图片描述

二、环境变量

2.1 基本概念

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

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

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

2.2 环境变量的查看和组织

<1> 常见的环境变量

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

<2> 查看环境变量方法

格式:echo $NAME NAME是你的环境变量名称
在这里插入图片描述

<3> PATH的测试

假设我们有如下程序

#include<iostream>
using namespace std;

int main()
{
    
    
  cout<<"hello world"<<endl;
  return 0;
}

我们编译好执行该程序,会发现如下问题
在这里插入图片描述
那么如何才能让02-PathTest程序可以运行呢?这时候PATH环境变量就发挥了重要作用,因为PATH环境变量提供了各类命令的搜索路径,我们只需要将自己的程序路径添加入PATH环境变量即可

export PATH=$PATH:程序路径

在这里插入图片描述
我们还可以将程序拷贝到LINUX命令池中
在这里插入图片描述

<4> 和环境变量相关的命令

  1. echo: 显示某个环境变量值
  2. export: 设置一个新的环境变量
  3. env: 显示所有环境变量
  4. unset: 清除环境变量
  5. set: 显示本地定义的shell变量和环境变量

2.3 环境变量的组织方式

每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串。
在这里插入图片描述

<1> 通过代码获取环境变量

在使用这种方式之前,我们先来了解c/c++中main函数的三个参数

  • int argc 存放命令行参数的个数
  • char *argv[] 是个字符串指针数组,每个元素都是一个字符指针,指向一个字符串,即命令行中的每一个参数
  • char *env[] 也是一个字符串的指针数组,这个数组的每一个元素是指向一个环境变量的字符指针
#include<iostream>
using namespace std;

int main(int argc, char* argv[], char* env[])
{
    
    
  int i = 0;
  for(;i<argc;++i)
  {
    
    
    cout<<"argv["<<i<<"]:"<<argv[i]<<endl;
  }
  
  cout<<"---------------------------------"<<endl;

  for(i =0;env[i];++i)
  {
    
    
    cout<<"env["<<i<<"]:"<<env[i]<<endl;
  }
  return 0;
}

结果
在这里插入图片描述
通过调用系统提供的库函数来获取环境变量

#include<stdlib.h>
#include<iostream>
using namespace std;

int main(int argc, char* argv[], char* env[])
{
    
    
  cout<< getenv("PWD") <<endl;
  return 0;
}

在这里插入图片描述

<2> 环境变量通常具有全局属性

运行如下代码,会发现系统不会打印MYENV变量

#include<stdlib.h>
#include<iostream>
using namespace std;

int main(int argc, char* argv[], char* env[])
{
    
    
  cout<< getenv("MYENV") <<endl;
  return 0;
}

那么我们设置该环境变量后再运行
在这里插入图片描述
上述操作说明了环境变量通常具有全局性,且可以被子进程继承下去

猜你喜欢

转载自blog.csdn.net/qq_40076022/article/details/114522018