【Linux】-----进程第二弹(优先级,环境变量)

news2024/11/26 16:48:45

目录

一、进程优先级

是什么

为什么要有? 

查看进程优先级

修改进程优先级

二、环境变量 

 命令行参数

概念

常见环境变量

查看环境变量 

配置环境变量

内存级别修改(命令行修改,暂时)

 ①拷贝到系统路径下

② 路径添加到PATH中

修改配置文件(永久)

和环境变量相关的命令

程序获取环境变量

①第三方变量environ 

②命令行参数获取

③系统接口获取


一、进程优先级

是什么

在第一弹中我们提及过操作系统会同时存在多个进程,但是呢,操作系统如何得知应该先调度哪个进程?实际上就得看在每个进程优先级!

所以进程优先级就是指进程获取某种资源的先后顺序,是存在于每个PCB中的内部字段。。

在Linux中,优先级的数字越小,优先级越高!

注意:这里需要区分优先级和权限

  • 权限:代表的是能不能获取资源的问题
  • 优先级:表示的已经有能力了,但是是获取资源的顺序问题!

为什么要有? 

  • 操作系统中大多数情况下存在很多的进程,但是系统资源是有限的。
  • 操作系统关于调度的原则:分时操作系统,基本的公平,如果进程因为长时间不被调度,就会造成饥饿问题!

查看进程优先级

指令:ps -al  查看当前系统所有的进程

示例:

比较重要的信息

  • UID:代表执行者身份
  • PID:自身ID
  • PPID:父进程ID
  • PRI:代表进程的优先级,值越小,越优先
  • NI:代表进程的nice值,进程优先级的修正数据

修改进程优先级

进程的新优先级=优先级(默认80开始)+nice值,即:PRI(new)=PRI+nice

这里值得一提的是:nice值是有范围的,一般【-20,19】40个数字

操作步骤:

①输入指令top

按下r+对应的进程pid

③输入要调整的值

④quit退出

可以看到,上述进程调整后变成了60(80-20),倘若你调整的值是超出nice范围的值,比如调整值为100时,系统默认采用的是范围的上限值19,也就是变成80+19=99。 

补充几个小概念:

  • 并行:多个进程在多个CPU上同时运行
  • 并发:多个进程在同一个CPU上采用进程切换的方式,在一段时间内,让多个进程都得以推进
  • 独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。。

二、环境变量 

 命令行参数

关于main函数,想必在一些地方,大家都看到过这样的形式:

int main(int argc,char* argv[])
{
    return 0;
}

实际上这些参数是可带可不带的!

  • argv[]:指针数组,数组里的每一个元素都是一个个指针,指向的是一个字符串。
  • argc:代表的数组元素个数。。

打印数组内容

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

可以看到,这个数组里面的内容会根据命令行输入的数据而不同,也就是是实际上这个数组存的的命令行的字符串!

一般情况下,默认第一个位置存的都是路径+可执行程序,后面的位置就是该可执行程序匹配的选项!

那么为什么要有命令行参数呢?

实际上就是因为命令行参数的本质是交给我们程序不同的选项,用来定制不同的程序功能,每一个选项都有对应的功能!

演示演示:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

int main(int argc,char* argv[])
{
    if(argc!=2)
    {
        printf("%s->可用选项有-[a,b,c]\n",argv[0]);
        return 0;
    }

    if(strcmp(argv[1],"-a")==0)
    {
       printf("this is -a function\n"); 
       return 0;
    }
 
    else if(strcmp(argv[1],"-b")==0)
    {
        printf("this is -b function\n");
        return 1;
    }                                                                                                                                                                   

   else if(strcmp(argv[1],"-c")==0)
   {
       printf("this is -c function\n");
       return 1;
   }
   else
    printf("no section\n");
    return 0;
}

所以说,平时我们所接触到的指令底层都类似于这样实现(如ls),这也再一次说明,指令本质就是一个可执行程序,选项就是该可执行程序不同模块的功能!

 问题:命令行参数是由谁传递的?

是父进程bash,在命令行中启动程序,实际上都是bash的子进程。(父进程的数据默认都是能被子进程访问的)

概念

  • 环境变量一般☞ 在操作系统中用来指定操作系统运行环境的一些参数。(类似于全局变量)
  • Linux中,会存在一些全局的设置,目的就是告诉命令行解释器,应该去哪些路径下寻找可执行程序,所以系统指令执行时不需要带路径,而我们自己的可执行程序需要带路径。

常见环境变量

PATH:指定命令的搜索路径

HOME:指定用户的主工作目录

SHELL:当前Shell,值为/bin/bash

查看环境变量 

echo $环境变量名称

示例:

上述所显示的路径就是命令行解释器查找指令的路径,也就是系统指令的位置。 所以对于ls这样的命令,可以不带路径执行,就是因为它是全局的。

问题:如果我们想让我们所写的可执行程序能够像系统指令那样不带路径就能执行,要怎么做?配置即可!

配置环境变量

内存级别修改(命令行修改,暂时)

 ①拷贝到系统路径下

可以看到当我们将我们的可执行程序配置到系统路径下时,就不需要带路径执行,可以直接在命令行运行我们的程序! (不建议这么干,污染系统)

② 路径添加到PATH中

指令:

PATH=$PATH:自己可执行程序的路径

演示:

 注意:以上两种方式,都是内存级别的修改(命令行中的修改),也就是说当你关闭Linux时,这些配置都会消失,并不是永久存在的,要想永久存在,就需要配置系统对应的配置文件!!

为何呢?

最开始的环境变量不是存在于内存中的,而是在系统的配置文件中的,当我们在启动Linux时,系统会创建bash进程,bash进程会读取配置文件中的内容,将其中的环境变量拷贝一份。

修改配置文件(永久)

配置文件: bash_profile,存在于家目录下

我们只需要将自己的可执行程序的路径添加到这个文件中,即可实现永久保留! 

这样当你重启系统时,配置的记录就能永久保存! 

和环境变量相关的命令

  • env:显示所有的环境变量

  • echo:打印某个环境变量 

 

  • exprot:设置新的环境变量
export 环境变量名=值

 

注意: 

1.export设置的新环境变量是内存级别的,也就给bash进程的,不能永久存在!

2.不加上exprot关键字,直接导入的变量是本地变量!本地变量不能被子进程继承,只在bash中有效 

  •  unset:清楚环境变量

 

程序获取环境变量

①第三方变量environ 

为何能呢?

实际上环境变量的在系统中的组织方式是以一张表的形式进行组织的,环境变量表是一个字符指针数组,每个指针指向的是一个以'\0'结尾的环境字符串变量。

 

前面有说过,当我们启动Linux系统时,会创建bash进程,同时bash进程会读取磁盘上环境变量的配置文件,并拷贝一份。而bash进程是所有在命令行中启动程序的父进程,父进程的数据,默认能被子进程看到(但不能修改)。所以子进程能看到并访问在bash中的环境变量表,所以能用程序访问。。

小结论:bash进程在启动的时候,默认会给子进程形成两张表,一张是命令行参数表,一张是环境变量表,bash会通过各种方式交给子进程。

命令参数来源于用户输入的命令行,环境变量表来源于系统的配置文件!!

Tip:

对于export,echo这样的指令本质也是可执行程序,在命令行中启动,父进程都是bash,可是父进程的数据是不能被修改的,但是export却能将新的环境变量导入到bash的环境变量表中,是不是矛盾了?

并不是!实际上,在Linux中,80%的命令都是由bash的子进程执行的,也就是在命令行启动的程序,但是像export,echo这样的指令实际上是由bash亲自执行的,并不是bash的子进程,而是内建命令!!所谓内建命令,可以理解为bash中的一个函数!(因为bash也是C语言写)。

②命令行参数获取

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
int main(int argc,char* argv[],char* env[])
{

  int i=0;
  for(;env[i];i++)
  {
       printf("env[%d]->%s\n",i,env[i]);                                                                                                                               
  }
}

结果也是一样,可见main函数实际上可以不带参数,也可以带2/3个! 这些参数的值实际都是由bash提供的!继承下来的。

③系统接口获取

  • getenv()
#include <stdlib.h>
#include <stdio.h>
int main()
{
   char* path=getenv("PATH");
   if(path==NULL) return 1;
   printf("path:%s\n",path);
   return 0;
}  

 这个系统接口能够获取具体的一个环境变量的内容!

一句话:环境变量具有全局的属性,能够被子进程继承下去! 


今天的内容就分享到这里,如果对你有所帮助,欢迎点赞+关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2190183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Android】中级控件

其他布局 相对布局RelativeLayout RelativeLayout下级视图的位置是相对位置&#xff0c;得有具体的参照物才能确定最终位置。如果不设定下级视图的参照物&#xff0c;那么下级视图默认显示在RelativeLayout内部的左上角。用于确定视图位置的参照物分两种&#xff0c;一种是与…

算法专题三: 二分查找

目录 1. 朴素版: 二分查找2. 查找排序数组元素第一个和最后一个位置3. 搜索插入位置4. x的平方根5. 山脉数组的峰顶索引6. 寻找旋转数组中的最小值7. 点名 博客主页: 酷酷学!!! 感谢您的关注~ 正文开始 1. 朴素版: 二分查找 题目思路: 仅需根据题意, 找出二段性, 正确更新下标…

Python编码系列—Python访问者模式:为对象结构添加新功能的艺术

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

LLM端侧部署系列 | PowerInfer-2助力AI手机端侧部署47B大模型 (论文解读)

引言 简介 PowerInfer-2 概述 神经元感知的运行时推理 多态神经元引擎 内存中的神经元缓存 灵活的神经元加载 Neuron-Cluster-Level Pipeline 生成执行计划 执行 总结 0. 引言 一雨池塘水面平&#xff0c;淡磨明镜照檐楹。东风忽起垂杨舞&#xff0c;更作荷心万点声…

2024年liunx安装openvino非源码编译版(比源码编译简单!)

前言 真的要感慨一句&#xff0c;openvino源码编译真的麻烦&#xff01;由于2023年之后openvino官网的之间下载取消之后&#xff0c;很多人只能选择源码编译&#xff0c;我也是研究了好几天&#xff0c;又是clone改变的库&#xff0c;又是安装什么&#xff0c;搞了三四天都没有…

已解决:TypeError: ‘int‘ object is not iterable

已解决&#xff1a;TypeError: ‘int’ object is not iterable 文章目录 写在前面问题描述报错原因分析 解决思路解决办法1. 检查代码中的 for 循环2. 检查函数返回值是否为可迭代对象3. 确认变量类型4. 使用 map() 或 list comprehension 处理整数5. 防止不必要的迭代 总结 写…

Leetcode—148. 排序链表【中等】

2024每日刷题&#xff08;171&#xff09; Leetcode—148. 排序链表 C实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr…

java计算机毕设课设—坦克大战游戏

这是什么系统&#xff1f; 坦克大战游戏是一款以坦克为主题的射击游戏&#xff0c;旨在为玩家提供一个刺激、有趣的游戏体验。该游戏不仅拥有丰富的功能&#xff0c;还注重玩家的互动体验。此系统是使用Java语言实现坦克大战游戏程序&#xff0c;玩家通过连接访问进入游戏&…

【C++】—— 类和对象(上)

【C】—— 类和对象(上) 文章目录 【C】—— 类和对象(上)前言1. 类的定义1.1 类定义格式1.2 访问限定符1.3 类域 2. 实例化2.1 实例化概念2.2 对象的大小 3. this指针4. C和C语言实现Stack对比结语 前言 小伙伴们大家好呀&#xff0c;今天我们就开始学习C的重点及难点——类和…

[python]Flask_Login

flask_login是flask框架中的一个拓展功能&#xff0c;用于更快捷的实现用户会话管理功能&#xff0c;主要处理登录&#xff0c;注销和长时间会话存储的功能处理。 目录 安装 使用 第一步,配置SECRET_KEY 第二步,创建LoginManager实例绑定app 第三步,用户类继承UserMixin …

Github优质项目推荐-第三期

文章目录 Github优质项目推荐 - 第三期一、【coding-interview-university】&#xff0c;305k stars - 软件工程师学习计划二、【drawdb】&#xff0c;20.1k stars - 数据库设计工具三、【twenty】&#xff0c;16k stars - 排名第一的开源 CRM四、【Douyin-Vue】&#xff0c;9.…

海南网站建设提升网站用户体验实用技巧

海南网站建设提升网站用户体验实用技巧 在当今数字时代&#xff0c;网站已成为企业展示形象和吸引客户的重要平台。尤其对于海南这一旅游胜地来说&#xff0c;优化网站用户体验显得尤为重要。以下是一些实用技巧&#xff0c;可帮助您提升网站的用户体验。 首先&#xff0c;确保…

柔性作业车间调度(FJSP)

1.1 调度问题的研究背景 生产调度是指针对一项可分解的工作(如产品制造),在尽可能满足工艺路线、资源情况、交货期等约束条件的前提下,通过下达生产指令,安排其组成部分(操作)所使用的资源、加工时间及加工的先后顺序,以获得产品制造时间或成本最优化的一项工作。 一般研究车间…

django的路由分发

前言&#xff1a; 在前面我们已经学习了基础的Django了&#xff0c;今天我们将继续学习&#xff0c;我们今天学习的是路由分发&#xff1a; 路由分发是Web框架中的一个核心概念&#xff0c;它指的是将不同的URL请求映射到对应的处理函数&#xff08;视图&#xff09;的过程。…

发现一篇瑞芯微RK3588上使用Gstreamer的文章(野火)

1. 前言 最近经常使用英伟达的Orin和瑞芯微RK3588做开发,自己还买了好几块开发板,很多需要自己琢磨,今天忽然发现了一篇文章,意外解决了一些之前的问题,以此作为记录: 文章链接:https://doc.embedfire.com/linux/rk356x/quick_start/zh/latest/lubancat_rk_software_har…

Redis基础三(redis的高级配置)

Redis进阶配置 一、Redis持久化操作 ​ 持久化就是把内存的数据写到磁盘中去&#xff0c;防止服务宕机了内存数据丢失。&#xff08;Redis 数据都放在内存中。如果机器挂掉&#xff0c;内存的数据就不存在。所以需要做持久化&#xff0c;将内存中的数据保存在磁盘&#xff0c…

Gralloc图形缓冲的分配过程

广告 首先帮我朋友打个广告 我们一起在运营一个视频号 感兴趣的可以帮忙点击右边这个小铃铛 铃铛 序 其实越往底下走在很多人嘴里就会变得很玄乎&#xff0c;变得不可思议&#xff0c;这里的gralloc就是一个native service&#xff0c;只是分装了一些调用接口&#xff0c;上…

使用Scikit-image进行图像处理入门

简介 在数据科学的广阔领域中&#xff0c;图像处理占据了重要的一席之地&#xff0c;为分析和处理视觉数据提供了各种工具和技术。Python 拥有丰富的库生态系统&#xff0c;为图像处理提供了多种选择&#xff0c;其中&#xff0c;scikit-image 凭借其强大且易用的功能脱颖而出…

记录使用gym和stable_baseline3训练出成功通关的贪吃蛇ai

参考自b站up林亦LYi的开源项目 传送门 本次只训练了cnn版本的 第一次接触这种项目&#xff0c;建python虚拟环境时出了点难以说清楚的小问题&#xff0c;安装不上requirement.txt中的gym库那个版本&#xff0c;折腾了一会&#xff0c;自己都乱了头绪&#xff0c;最后导致训练…

TMGM:黄金价格持稳,而WTI原油价格和天然气价格飙升

黄金价格顽强地拒绝下跌&#xff0c;昨天和周三继续抵制下行的趋势。 价格继续保持在近期的历史高位附近&#xff0c;很可能会有进一步上涨的动力。美元走强阻止了价格的进一步上涨&#xff0c;但总体上升趋势仍在进行中。 目前还没有明显的向下催化剂迹象&#xff0c;不过如…