• linux进程之进程的优先级➕环境变量


    1.优先级的认识

    1.1优先级的介绍

    为什么要有优先级?

    • CPU资源有限,被执行的进程很多,需要通过某种方式竞争资源。
    • 配置进程优先级对多任务环境的linux很有用,可以改善系统性能。
    • 把某些不重要的进程运行到指定的CPU上,大大改善系统整体性能

    什么是优先级?

    1. 用来确定CPU资源分配的先后顺序
    2. 调度器调度进程到CPU执行的指标
    3. 进程的优先级在有评判方的存在时才有意义 如高考存在时 班级第一名才有"第一"的意义
    4. 可以用数据来表明优先级 如1,2,3…
    5. 他也是PCB中成员属性
      在这里插入图片描述

    1.2初识优先级

    1.3ps指令

    Linux的ps指令是用来查看系统进程的命令,类似于Windows任务管理器中查看到的进程的功能
    在这里插入图片描述
    ps -al : 查看当前会话的进程
    UID: user id 执行者的身份
    PRI: priority 进程的优先级/程序被CPU执行的先后顺序 默认是80 值越小优先级越高 越早被执行
    NI: nice nice值 进程优先级的修正数值

    1. PRI(new) = PRI(old) + nice
    2. nice值为负值,优先级值变小,优先级变高,越快被执行
    3. 调整进程优先级,在Linux下就是调整进程nice值
    4. nice取值范围是-20~19,共40个级别。
    5. 进程的nice值不是进程的优先级,进程nice值会影响进程的优先级变化
    6. nice值是进程优先级的修正数据

    1.4查看/修改进程的优先级

    法一:

    cmd: top r PID nice-value
    进入任务管理器 按r 进入重新设值模式 输入目标进程的PID 按回车 输入新nice

    法二

    在这里插入图片描述
    在这里插入图片描述
    renice指令: 运行时调nice值

    法三:

    nice: 启动时调

    法四:

    系统接口: setproority/getpriority

    1.5对优先级的认识

    1. CPU在意的不是谁的优先级最高 而是想让每个进程的优先级趋于平衡 让所有进程运行时可被雨露均沾
    2. 如果有进程优先级差距太大 会导致这一进程每次最先被执行 这会打破平衡

    1.6对进程的深一步理解

    1. 竞争性: 系统进程数目众多,CPU资源只有少量,甚至1个,进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
    2. 独立性: 多进程运行,独享各种资源,多进程运行期间互不干扰 [QQ卡壳不影响WeChat/父进程子进程也是具有独立性的(虽然共享了代码)]
    3. 并行: 多个进程在多个CPU下同时运行,这称之为并行

    在这里插入图片描述

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

    一个进程并不是在CPU上执行结束才离开的 理解:

    1. 每个进程都有被允许允许的时间限制 ---- 时间片 时间达标不在执行
    2. 未达到时间限制 但自己不想执行了 可以出让给下一进程
    3. 未达到时间限制 但下一进程比自己优先级高 自己的时间片被抢占

    在这里插入图片描述

    对进程切换的理解

    在这里插入图片描述

    1. 进程被CPU调度执行 CPU中的寄存器要存储进程的临时数据 如:函数栈帧首尾记录寄存器 函数传值返回拷贝寄存器 寄存器中存储的临时数据叫做此进程的上下文
    2. 因为多进程需要不断切换 所以要考虑切换时上下文的去向
    3. 切换过程中 上下文不可被丢弃 而是进程被切换下来时 带走自己的上下文
    4. 带走的目的: 为了再次执行时 恢复自己的上下文 继续未执行完的操作 虽然中途被切换下来 但是再次被调度时 能像未被打断那样继续执行
    5. CPU内的寄存器只有一份 而多进程有多份上下文 所以这一份寄存器 是给正在被执行的进程使用的
    6. 就好比你去图书馆 来的时候带着自己的书包 走的时候再带走 如果不带走 下次来极大可能已经没了
    7. 又好比你上大学上到一半 想去参军 那么你走的时候要把自己的东西带走并通知学校保留的你学籍 退伍时可以继续学习

    2.环境变量

    2.0环境变量相关的命令

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

    2.1环境变量的概念

    环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
    环境变量通常具有某些特殊用途具有特定功能,在系统当中通常具有全局特性

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

    2.2常见/查看环境变量

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

    echo $NAME //NAME:环境变量名称
    在这里插入图片描述

    2.3环境变量的作用

    在xshell下 使用ls指令有两种方式 带路径/不带路径

    在这里插入图片描述

    前面我们已经了解到 ls也是个可执行程序 那为什么我们写的可执行程序不能不带路径运行呢

    在这里插入图片描述

    回答:

    PATH: 运行ls指令时 会在PATH下查找ls的路径 找到后开始运行此路径下的ls

    2.4修改环境变量

    1.将zombie可执行程序放到PATH现有的路径下(不建议)

    1. 实际上是把你自己写的可执行程序安装到了指定路径
    2. 污染环境变量已配置好的路径下的命令池: 已配置好的如ls/pwd/touch等 把自己的可执行程序放进去毫无用处

    2. 把当前可执行程序的路径放到PATH中(只在本次登录有效)

    在这里插入图片描述

    在这里插入图片描述

    2.5查看所有环境变量

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

    2.6环境变量的组织方式

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

    2.6通过代码获取环境变量

    1.main()函数的参数

    argc,*argv: 命令行参数    *env: 环境变量参数: 每一个进程启动时 启动该进程的进程传递的环境变量信息以env参数传导
    int main(int argc, char* argv[],char* env[])
    {
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1.1环境变量参数–env

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

    1.2命令行参数—argc/argv
    1.初识main()命令行参数

    在这里插入图片描述

    在这里插入图片描述

    2.命令行参数的应用

    在这里插入图片描述

    在这里插入图片描述

    命令行参数的意义/作用

    1. 让一个程序通过不同的选项调用特定的语句实现不同的功能
    2. linux的指令ls/pwd/touch等都是由命令行参数编写的 他们一个个都是可执行程序 且可以搭配不同的选项实现不同的功能

    在父进程下写的指令如 ./arg -a 子进程的程序是如何拿到的?

    父进程bash先获取 然后传给子进程
    换言之 命令行参数也是子进程的父进程

    2.第三方全局变量environ获取

    libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,使用时要用extern声明。
    在这里插入图片描述

    在这里插入图片描述

    #include 
    #include 
    
    int main(int argc, char *argv[])
    {
    extern char **environ;
    int i = 0;
    for(; environ[i]; i++){
    printf("%s\n", environ[i]);
    }
    return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

    在这里插入图片描述

    #include 
    #include 
    int main()
    {
    printf("%s\n", getenv("PATH"));
    return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    当前进程的环境变量信息是从哪来的?

    是父进程传的 从父进程那里继承得来的

    如何证明?

    1. 当登录服务器时 OS会将配置文件中的环境变量给bash(父进程)
    2. 在bash下 执行可执行程序时的进程是bash的子进程 子进程的环境变量继承于父进程
    3. Linux下,父进程和子进程类似目录和文件组成一棵多叉树 由于环境变量是子进程继承父进程 所以环境变量具有全局属性
    4. 在终端下执行一个可执行程序./test 显示进程的PID可以看到test进程的父进程就是bash
    5. 在父进程即bash下执行export hello = 你好 在test.c中编写代码: printf("%s\n", getenv("hello"));命令行执行env | grep hello 会显示hello = 你好 运行test会输出你好
    6. 在bash父进程下导出一个环境变量 子进程下的代码可以输出 由此得知 子进程的环境变量是继承父进程的

    2.7局部变量

    1.介绍

    set: 获取bash创建时所有变量
    env: 只获取环境变量
    在这里插入图片描述
    ape被称为局部普通变量 是命令行独有的 不可以向上面的hello在代码运行时输出
    ape前+export可以修订为环境变量(具有全局属性可以被子进程继承)

    2.应用–shell脚本

    在这里插入图片描述

  • 相关阅读:
    Python线程
    软件设计师——多媒体基础
    Time-Frequency Signal Analysis and Processing 笔记
    Hadoop笔记06-Hadoop-源码解析
    【仿牛客网笔记】Elasticsearch,分布式搜索引擎——Spring整合Elasticsearch
    专为医疗领域打造!飞凌嵌入式新一代FDU显控一体机发布
    JS常用事件,使用方法
    Linux 忘记root密码解决方法(CentOS7.9)
    【算法集训专题攻克篇】第二十篇之二叉搜索树
    Python技法:浮点数取整、格式化和NaN处理
  • 原文地址:https://blog.csdn.net/LHRan_ran_/article/details/134477536