Linux——进程的概念(万字总结)(3)

简介: Linux——进程的概念(万字总结)(3)

九、进程的优先级

1. 基本概念

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

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

2.查看进程优先级

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

[mlg@VM-20-8-centos lesson2]$ ps -l

1ecd1b2606ed46e9956a89f231c9802c.png

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

       UID : 代表执行者的身份

       PID : 代表这个进程的代号

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

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

       NI :代表这个进程的nice值  

3.PRI & NI

PRI: 即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序, 此值越小 进程的优先级别越高;

NI: 就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值 ;

PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice

当nice值为负值的时候 ,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行;

调整进程优先级,在Linux下,就是调整进程nice值; nice其取值范围是-20至19,一共40个级别;

注:Linux下,PRI(old)默认是80

4.如何更改进程的优先级

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

      top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。

[mlg@VM-20-8-centos lesson2]$ top

1ecd1b2606ed46e9956a89f231c9802c.png

想要把ps这个进程的nice值修改了,我们可以在输入top命令后,输入“r”,此时会出现提示:

1ecd1b2606ed46e9956a89f231c9802c.png

在这里输入你想要修改的进程的PID,回车之后

1ecd1b2606ed46e9956a89f231c9802c.png

在这里输入你想要修改的nice值,回车之后,按q退出,进行查看

1ecd1b2606ed46e9956a89f231c9802c.png

2.用renice命令更改已存在进程的nice

1ecd1b2606ed46e9956a89f231c9802c.png

5.其他概念

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

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

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

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

十、环境变量

1.基本概念

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

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

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

2.常见的环境变量

PATH : 指定命令的搜索路径

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

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


3.查看环境变量

我们可以通过echo命令来查看环境变量

[mlg@VM-20-8-centos lesson2]$ echo $PATH

1ecd1b2606ed46e9956a89f231c9802c.png

1.测试PATH

       我们在输入指令时(ls / pwd等)并没有输入相应的路劲,只要指令正确就一定能执行,但是我们生成的可执行程序却要加上 ./(当前路径下)才可以被执行。这主要是以为系统在环境变量中找不到你当前可执行程序相应的路径。

1ecd1b2606ed46e9956a89f231c9802c.png

       我们通过echo $PATH查看环境变量,发现有许多有路径,并且由(:)号隔开。当我们输入指令时会通过环境变量查找相应的路径。

1ecd1b2606ed46e9956a89f231c9802c.png

如何让我们自己的可执行程序也想系统命令一样直接执行呢?

方法一:

直接将可执行程序拷贝到里面去,但是不推荐这样做,如果你添加了,忘记删除了,后期在执行某些指令时,突然多出一些东西。污染环境

方法二:

直接将可执行程序所在路径拷贝到里面去。通过export指令+环境变量的名(export PATH)对环境变量进行新的设置

[mlg@VM-20-8-centos lesson2]$ export PATH=/home/mlg/lesson2

但是这样设置覆盖原来的环境变量,导致很多指令都用不了了

1ecd1b2606ed46e9956a89f231c9802c.png

其实也不用担心,我们只要退出在重新启动就恢复了

正确的做法:

[mlg@VM-20-8-centos ~]$ export PATH=$PATH:/home/mlg/lesson2

1ecd1b2606ed46e9956a89f231c9802c.png

2.测试HOME

为什么每次登录不同的用户,所在的家目录都是不一样的,就是因为环境变量HOME

普通用户:

1ecd1b2606ed46e9956a89f231c9802c.png

root用户:

1ecd1b2606ed46e9956a89f231c9802c.png

3.测试SHELL

       我们在命令行所输入的指令,都是由命令行解释器进行解释的。我们可以通过查看环境变量SHELL来知道自己当前所用的命令行解释器。

1ecd1b2606ed46e9956a89f231c9802c.png

4.和环境变量相关的命令

1.echo命令

这个处理可以查看相关的环境的变量,还可以直接打印一些数据

1ecd1b2606ed46e9956a89f231c9802c.png

2.export命令

设置一个新的环境变量,还可以将本地变量导出环境变量;所谓的本地变量就相当于我们在C/C++中定义一个变量;

1ecd1b2606ed46e9956a89f231c9802c.png

3.env命令

显示所有环境变量

1ecd1b2606ed46e9956a89f231c9802c.png

4.set命令

显示本地定义的shell变量和环境变量

1ecd1b2606ed46e9956a89f231c9802c.png

5.unset命令

清除环境变量;处理环境变量外,还有本地变量,所谓的本地变量就相当于我们在C/C++中定义一个变量。如下图所示:

1ecd1b2606ed46e9956a89f231c9802c.png

5.环境的组织方式

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

1ecd1b2606ed46e9956a89f231c9802c.png

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

1.main函数命令行参数的了解

对于main函数我们已经很熟悉了,它其实可以带有参数的,你了解吗?main函数有三个参数

int main(int arge, char* argv[], char* envp[])//这里的三个参数就是命令行参数
{}

我们先了解一下前两个参数的作用

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

1ecd1b2606ed46e9956a89f231c9802c.png

    结合代码及运行结果可以看出,我们在命令行中只有一个命令,那么对于的数组(argv[ ])中就有一个元素(字符串“./myproc”),有多个携带的参数就有多个字符串。


我们这里想说明的是,当我们在命令行中敲出一个命令后通过带入不同的参数选项,会有不同的结果。我们通过模拟实现一下这样的效果。

#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
    if(argc != 2){
        printf("Using: %s -[a|h|ah]\n",argv[0]);
        return 1;
    }
    if(strcmp(argv[1],"-h") == 0){
        printf("hello world!\n");
    }
    else if(strcmp(argv[1],"-a") == 0){
        printf("hello linux!\n");
    }
    else if(strcmp(argv[1],"-ah") == 0){                                        
        printf("hello world!\n");
        printf("hello linux!\n");
    }
    else{
         printf("hello C++!\n");
    }
return 0;
}

1ecd1b2606ed46e9956a89f231c9802c.png

通过上面的代码我们也实现出了通过指令加选项的操作达到不同的效果,指令有很多选项,用来完成同一个命令的不同子功能,选项的底层使用的就是命令行参数。

2.main函数的环境变量获取

main函数除了有命令行参数,还有环境变量,也就是第三个参数。它是用来获取环境变量的

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

1ecd1b2606ed46e9956a89f231c9802c.png

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

这是系统提供的一个获取环境变量的第三方变量,是一个二级指针

1ecd1b2606ed46e9956a89f231c9802c.png

2020062310470442.png

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

1ecd1b2606ed46e9956a89f231c9802c.png

7.通过系统调用获取环境变量 (常用)

       以上两种获取环境变量太过于麻烦,我们最长用的还是通过系统调用来获取环境变量。

使用getenv函数获取

1ecd1b2606ed46e9956a89f231c9802c.png

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

1ecd1b2606ed46e9956a89f231c9802c.png

注:环境变量是具有全局属性的,可以被子进程继承下去

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

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

导出环境变量

export MYENV="hello world"

再次运行程序,发现结果有了!说明:环境变量是可以被子进程继承下去的!

        我们的程序执行起来后(进程),其共享父进程bash的环境变量(bash的环境变量是系统给的),那么只有bash的环境变量有所改变,影响的就是全局。


目录
相关文章
|
17天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
43 1
|
2月前
|
资源调度 Linux 调度
Linux c/c++之进程基础
这篇文章主要介绍了Linux下C/C++进程的基本概念、组成、模式、运行和状态,以及如何使用系统调用创建和管理进程。
48 0
|
5天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
47 13
|
12天前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
|
21天前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
38 4
|
20天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
1月前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
138 4
linux进程管理万字详解!!!
|
25天前
|
缓存 算法 Linux
Linux内核的心脏:深入理解进程调度器
本文探讨了Linux操作系统中至关重要的组成部分——进程调度器。通过分析其工作原理、调度算法以及在不同场景下的表现,揭示它是如何高效管理CPU资源,确保系统响应性和公平性的。本文旨在为读者提供一个清晰的视图,了解在多任务环境下,Linux是如何智能地分配处理器时间给各个进程的。
|
1月前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
77 8
|
1月前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
71 1