当前位置: 首页 > article >正文

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

进程优先级 && 进程的调度与切换 && 环境变量

  • 1.进程优先级
    • 1.1查看进程
    • 1.2 PRI VS NI
    • 1.3用指令调整优先级
  • 2.进程的调度与切换
    • 2.1 进程切换
    • 2.2 linux实现进程调度的算法
  • 3.环境变量
    • 前言引入(main参数--命令行参数)
    • 3.1 环境变量
    • 3.2 PATH环境变量
    • 3.3 系统指令查看环境变量
    • 3.4用代码获取环境变量

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
在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/news/312210.html

相关文章:

  • qt--Qml控件库如何从外部导入
  • 虾皮选品技巧有哪些?超全Shopee选品的方法和技巧分享!
  • C#无标题栏窗体拖动
  • 物联网开发+充电桩管理系统+充电桩系统源码
  • 【北京迅为】《STM32MP157开发板使用手册》- 第四十二章 事件实验
  • Java设计模式—面向对象设计原则(四) ----->接口隔离原则(ISP) (完整详解,附有代码+案例)
  • 基于JavaWeb开发的java+Springboot操作系统教学交流平台详细设计实现
  • 探索AI大模型的未来:电信运营商与云服务商的新征途@附58页PDF文件下载
  • liunx 计划任务
  • VRRP协议原理
  • 《计算机网络名词解释》
  • 【Python报错已解决】ModuleNotFoundError: No module named ‘paddle‘
  • 量化交易软件、接口、API、区别、用法,有什么好用的么
  • Vue2中路由的介绍和使用
  • UDS诊断-面试题2
  • 掌握Protobuf精髓:深入解析.proto文件语法及高效应用
  • 蓝桥杯4. Fizz Buzz 经典问题
  • sql基础语法及常见函数等
  • 解决:The play() request was interrupted by a call to pause().报错
  • Android Glide:让图片加载从未如此简单
  • 14_input子系统my_touch_device,my_touch_handlerLinux内核模块
  • Android 将EasyPermissions进一步封装,使得动态权限申请更加简明
  • Java 23、JDK 23正式发布!
  • C++之第十二课
  • 红日药业携手实在智能,构建RPA数字员工平台满足业务一体化需求 | 实在RPA案例
  • Java 多态(难)
  • VS运行程序时报错--无法定位程序输入点
  • Gitlab学习(007 gitlab项目操作)
  • 电影《祝你幸福!》观后感
  • 梧桐数据库(WuTongDB):SQL Server Query Optimizer 简介