[Linux] 进程优先级 && 进程的调度与切换 &&环境变量详解

1.进程优先级

优先级的前提也就是:访问某种资源的时候,通过一定的方式确定先后顺序;
这里我们先搞清楚两个概念
优先级 VS 权限
一个进程有了优先级的概念,那他就一定能被执行,也就是一定有权限。
简单来说权限是决定了能不能执行,优先级则是执行的先后顺序

优先级:cpu资源分配的先后顺序,进程的优先权(priority)

1.1查看进程

我们采用 ps -l 查看进程
在这里插入图片描述
在这里插入图片描述
这里面的PRI就是优先级,优先级也是一个整型变量。

  1. Linux的默认优先级是80;
  2. Linux的优先级是可以被修改的,优先级范围是[60, 99]—40
  3. 数字越小,优先级越高

1.2 PRI VS NI

这里的NI就是我们说的nice值,nice表示的是进程可被执行的优先级的修正数值
注意这里是修正数据

(new)PRI = (old)PRI + NI

nice的取值范围 -20到19
为什么linux调整优先级是一种受限状态?
因为优先级高的进程,先得到资源,常规进程很难享受到CPU资源,从而造成进程饥饿问题。

1.3用指令调整优先级

在这里插入图片描述

2.进程的调度与切换

进程在运行的时候,是基于时间片进行轮转执行的;时间片可以理解为OS给每个进程设定的最大执行时间,例如:1ms,一毫秒过去之后,不论这个进程有没有执行完毕,OS都会把这个进程调离出去,执行下一个进程

在这里插入图片描述
并发可以理解为一个大的CPU被分成了10个小的cpu每一个都去执行一个进程,但他们的效率都只有原本的十分之一。

2.1 进程切换

cpu有大量的寄存器,进程在cpu运行中,会产生大量的临时数据,放在cpu的寄存器中;这里面的临时数据衡量了进程当前的执行到了哪一行(PC指针),执行的结果……
cpu内部产生的临时数据,叫做进程的硬件上下文,让我们的进程进行保存(拷贝到PCB中)。
进程被二次调度的时候,将硬件的上下文进行恢复。

2.2 linux实现进程调度的算法

linux实现进程调度的算法,要考虑优先级,饥饿问题,效率.
这句话可以用下面的这张图来解释
在这里插入图片描述
首先一个运行队列中会有两个不同的队列,在这个队列中会有140个存放队列指针的数据,而我们只用后面的40——这个与上面的优先级相匹配,根据优先级,队列上面的进程根据优先级依次执行,这个是活跃队列的工作,而过期队列,存放的是新加入的进程,当活跃队列的进程都执行完毕之后,活跃队列和过期队列他们会交换,而交换的方式就是把他们指针所指向的位置进行交换,这里就体现出了他的效率性
我们在谈谈他是怎么遍历这些进程的,我们用位图来完成这个操作,比特位的位置表示一个队列,而比特位的内容表示这个队列是否为空

3.环境变量

前言引入(main参数–命令行参数)

main函数也是有参数的,

main(int argc,char *argv[],char *env[])
argv为指针数组(命令行参数表),argc是数组中元素的个数,env就是环境变量表

我们先来谈谈前面两个参数
在这里插入图片描述
在这里插入图片描述
这里就容易看出来了,argc就是指针函数argv的参数个数,argv就是命令行参数表
结论:通过不同的选项实现不同的功能;命令行参数是linux指令选项的基础。
为了方便理解我们可以写一个实现加减乘除的代码来解释一些

void Usage(char *process)
{   
    printf("Usage:\n\t%s [add|sub|mul|div] x y\n\n",process);
}
int main(int argc,char* argv[])
{
    // ./myprocess [add|sub|mul|div] x y
    //实现+-*/四种运算
    if(argc!=4)
    {
        Usage(argv[0]);
    }
    int x=atoi(argv[2]);
    int y=atoi(argv[3]);
    if(strcmp("add",argv[1])==0)
    {
        printf("%d + %d =%d\n",x,y,x+y);
    }
    else if(strcmp("sub",argv[1])==0)
    {
        printf("%d - %d =%d\n",x,y,x-y);
    }
    else if(strcmp("mul",argv[1])==0)
    {
        printf("%d * %d =%d\n",x,y,x*y);
    }
    else if(strcmp("div",argv[1])==0)
    {
        printf("%d / %d =%d\n",x,y,x/y);
    }
    else 
    {
        printf("none\n");
    }
}

在这里插入图片描述
这就是通过不同的选项实现不同的功能。

3.1 环境变量

概念:
在操作系统中用来指定操作系统运行环境的一些参数
不是一个,而是一堆彼此之间没有直接关系。系统的环境变量,本质就是系统直接开辟空间,给他名字和内容即可。

3.2 PATH环境变量

echo $PATH:打印环境变量的路径

在这里插入图片描述
为什么我们自己写的程序不加路径无法被找到,还要加上./才行呢?
因为我们的命令没有被添加到bash路径中。
我们可以采用以下两种方法
在这里插入图片描述

3.3 系统指令查看环境变量

  1. echo $[环境变量]
    在这里插入图片描述
  2. env查看系统全面的环境变量
    在这里插入图片描述
  3. 自己定义一个环境变量export 【要定义的内容】

3.4用代码获取环境变量

刚刚在提到main函数的参数,第三个参数就是环境变量表,我们就可以把他打印出来

int main(int argc,char* argv[],char *env[])//命令行参数个数,命令行参数表,环境变量表
{
    for(int i=0;env[i];i++)
    {
        printf("%d---------------------------------%s\n",i,env[i]);
    }
    return 0;
}

在这里插入图片描述
在这里插入图片描述
第二种使用 getenv
在这里插入图片描述
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tpoog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值