[Linux] Linux操作系统 进程的优先级 环境变量

news2024/11/17 10:33:20

标题:[Linux] Linux操作系统 进程的优先级

个人主页@水墨不写bug

(图片来源于网络)

目录

一、进程优先级

1.PRI and NI

2.PRI vs NI 的补充理解

二、命令行参数和环境变量

1. 命令行参数

2.环境变量        

I,环境变量是内存级的 

II,其他更多的环境变量及具体意义

 III,整体理解环境变量系统

IV,环境变量和本地变量


正文开始:


一、进程优先级

基本概念

        进程的调用需要CPU,CPU对进程的资源分配的先后顺序,就是指进程的优先权(priority)。

        优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。

        还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

查看当前的系统进程

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

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

        UID : 代表执行者的身份

        【Linux下对用户的区分是按照一个特定的编号来进行的,这样做是为了提高效率,因为对字符串的比较需要O(N),而对于整形数字的比较只需要O(1)】

        PID : 代表这个进程的代号

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

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

        NI :代表这个进程的nice值

1.PRI and NI

  • PRI(priority)也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高。
  • 那NI就是我们所要说的nice值了,什么是nice值?其表示进程可被执行的优先级的修正数值。
  • PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为: PRI(new)=PRI(old)+nice
  • 这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行。
  • 调整进程优先级,在Linux下,就是调整进程nice值。(为什么不直接调整PRI呢?因为调整PRI的时机不是确定的。修改了进程A的优先级表示在调用队列中A的位置发生了变化,但是这是不符合CPU的调用公平原则的)
  • nice其取值范围是-20至19,一共40个级别。

当我们创建一个进程,他的优先级默认是80:我们可以修改它的优先级:

        首先进入top;输入r(renice);输入需要修改的进程pid;输入要修改的nice值即可。

 将进程的优先级调到最低:

将进程的优先级调到最低:

        进程的优先级是不能被频繁修改的,如果想要成功修改进程的优先级,需要切换到超级用户(root)

2.PRI vs NI 的补充理解

        需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化

        可以理解nice值是进程优先级的修正修正数据


二、命令行参数和环境变量

1. 命令行参数

        当初我们第一次打开编译器的时候,我们会发现默认的源文件里面的main函数是有参数的:

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

        其实即使没有参数,main函数还是可以正常运行的。

        如果main函数带了这些参数, 当我们调用这个可执行程序的时候,第一个参数就是我们调用的指令,如果我们在调用指令之后以空格为间隔,加上一些选项,这些选项会被以字符串的形式追加到 指针数组 argv[] 中。

        这些工作实际上是父进程Bash做的。Bash(命令行解释器)会解释输入的命令,每一个指令的执行其实就是一个子进程的创建、运行、返回。

        比如我们使用ls,可以加-a -l -al等:

ls -al 

        我们使用这样的指令,默认是输入给父进程bash的,父进程保存这些数据。由于子进程可以访问父进程数据,子进程mytest的main函数的参数是通过访问父进程的数据来传递的。


2.环境变量        

I,环境变量是内存级的 

        我们生成的mytest可执行程序在执行的时候需要加上当前目录的标识符“./”然后加上程序名才能执行。但是我们最常使用的指令,比如:

        ls

        pwd

        cd

        等这些指令,却不需要指定这些程序文件的位置,为什么?

        其实操作系统是通过环境变量来找到这些程序的位置的。依靠的环境变量就是:

        PATH

        我们可以通过echo指令查看环境变量:

echo $PATH

         这些路径就是bash默认查找的路径:当我们执行常用的系统指令的时候,bash会默认在这些路径中查找指令的程序文件:

        如果找到,则加载到内存中运行;

        如果没有找到的,则报错:

         ls等这些系统指令是存储在/user/bin中的,如果我们想要让自己写的指令拥有与系统指令相同的“待遇”,有如下两种方法:

方法一:

        把自己的可执行程序拷贝到user/ben目录中。这样虽然可以达到目的,但是着实不太明智,这会污染系统的指令集。


方法二:

        我们可以把自己的可执行程序的路径添加到bash默认查找的路径中;这就需要更改

PATH环境变量,对于PATH环境变量的更改,有如下两种方法:

PATH=(指定的目录)

        这种方法会直接覆盖原来的默认路径。


PATH=$PATH:(指定的路径)

        这种方法会追加在原来默认路径的后面。

         我们更改了默认的搜索路径之后,就可以不用指定当前目录而执行自己的指令了。

但是当我们再次登录服务器的时候,会发现PATH环境变量被改回去了。这是因为环境变量是最开始不是在内存中,而是在系统对应的配置文件中的。 当我们登录服务器,bash启动就会把配置文件信息读取到环境变量中去。

        这就是读取环境变量的配置文件: (默认是在每个人的工作目录: cd ~ 的目录中)

         我们可以得出结论:环境变量是内存级的。

II,其他更多的环境变量及具体意义

        要查找所有的环境变量,就需要用到指令:

env

         要查找某一特定的环境变量,需要用到指令:

echo $+环境变量名称

         用第一个指令,查找所有的环境变量,会出现一大堆信息:

        这一堆信息就是系统内部的(内存级)环境变量 ,是启动Bash的时候bash从配置文件中读取的。

        仔细看,发现一些环境变量:

        PATH:当前的目录

        HOME:当前登录用户的家目录

        SHELL:当前的SHELL,通常是/bin/bash

        PWD:当前的工作目录

        HISTSIZE:系统默认记录的历史指令数

         如果想要在这些环境变量中加入自己创建的变量,需要用到指令:

export name=value

         如果想要删除已经创建的环境变量,需要用到指令: 

unset name

 III,整体理解环境变量系统

        过程一:系统文件中首先包含了环境变量,Bash在启动的时候会在磁盘中读取文件信息,把环境变量的信息加载到内存中,加载到内存中的环境变量就是我们平常通过指令env查看到的环境变量。

        

        过程二: 子进程是可以访问父进程的数据的,当我们创建一个子进程。我们写的进程通过父进程bash创建,那么我们在子进程中也当然可以访问父进程bash的环境变量数据!

想要访问父进程的环境变量数据,三种方法:

        1.通过main函数参数传递环境变量:

int main(int argc,char* argv[],char* env[])
{}

(这是main函数的第三个参数,对于参数的传递的理解,上文有详解)

        2.通过extern 声明 变量 :

extern char** environ;

        3.通过库函数

        在C语言的函数库stdlib.h中存在一个可以获取环境变量的函数getenv():

        可以通过这个函数获取bash的环境变量。本质是根据环境变量的名称来查找匹配的变灵名称,并返回对应的变量值。

        这三种方式,无论是哪一种,都声明了一个指针数组,这个指针数组里存储的就是父进程的环境变量 。由于进程的独立性,子进程对这些环境变量的修改并不会影响到父进程。(甚至并不能被修改)


IV,环境变量和本地变量

        我们已经知道了如何声明自己的环境变量,与环境变量相关的还有一种变量:本地变量。

 声明环境变量的时候,需要加上export:

export name=value

而声明本地变量,则不需要加上export:

name=value

 在声明本地变量之后,可以通过echo查询本地变量:

echo $变量名

但是本地变量不存在于环境变量表中,无法grep查询到。

想要将本地变量转化为环境变量,需要export再次声明:

export name

 操作过程记录:

        本地变量与环境变量的区别是环境变量具有全局属性,可以被所有的子进程访问;而本地变量则无法被子进程访问。 

内建指令:

        我们平时使用的指令,都是通过环境变量PATH来找到程序文件的位置的。但是对于特殊的命令,比如echo等在PATH变量被破坏时也可以正常使用。

        因为echo命令是内建命令,直接是一个可以被直接调用的函数,所以执行时不需要创建一个进程,本身就没有程序文件,自然不需要直到程序文件的位置。


完~

未经作者同意禁止转载 

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

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

相关文章

AI大模型算法工程师就业宝典—— 高薪入职攻略与转行秘籍!

从ChatGPT到新近的GPT-4,GPT模型的发展表明,AI正在向着“类⼈化”⽅向迅速发展。 GPT-4具备深度阅读和识图能⼒,能够出⾊地通过专业考试并完成复杂指令,向⼈类引以为傲的“创造⼒”发起挑战。 现有的就业结构即将发⽣重⼤变化&a…

【CSS Tricks】深入聊聊前端编写css的方法论

目录 引言BEM 规范OOCSS 规范结构与样式分离容器与内容分离 SMACSS 规范ITCSS 规范设置层工具层通用层元素层对象层组件层微调层由此分层后的项目代码结构也会相应做修改,主要有两种形式:文件夹形式文件名形式引用方式按照层级顺序引用 ACSS 规范总结 引…

U盘打开提示要格式化:深度剖析、恢复策略与预防指南

U盘打开提示要格式化现象阐述 在日常的数字生活中,U盘作为便携式存储设备的代表,扮演着不可或缺的角色。然而,不少用户都曾遭遇过这样一个令人头疼的问题:当满怀期待地插入U盘,准备访问其中存储的数据时,系…

21天全面掌握:小白如何高效学习AI绘画SD和MJ,StableDiffusion零基础入门到精通教程!快速学习AI绘画指南!

‍‍大家好,我是画画的小强。 今天给大家分享一些我长期以来总结的AI绘画教程和各种AI绘画工具、模型插件,还包含有视频教程 AI工具,免费送👇👇‍‍ 这份完整版的AI绘画全套学习资料已经上传CSDN,朋友们如…

怎么通过AI大模型开发一个网站?

目录 一、提示词与AI输出 二、网站效果 以前不会代码开发,写网站是不可能的事情,现在有了AI,一切都有了可能。以下是我通过通义千问大模型开发的简单网站。 一、提示词与AI输出 提示词1 你是python程序员,我有一个大的需求&am…

使用代理IP数据采集都需要注意那些?

“在当今大数据时代,数据采集成为了企业决策和个人研究的重要依据。然而频繁访问目标网站往往会引发IP被封锁的风险,这时使用代理IP就显得尤为重要。但代理IP的使用并非毫无风险,以下是使用代理IP进行数据采集时需要注意的几个关键事项。” 一…

Spring Boot助力:小徐影院管理系统

第二章开发技术介绍 2.1相关技术 小徐影城管理系统是在Java MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言,易于学习,实用且面向用户。全球超过35%的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统,因为它…

一些硬件知识(二十四)

如何测量芯片电源的上电时序: FPGA和很多的CPU上电都有一个上电时序:也就是先那部分上电,后那部分上电,这样主板才能正常开机,否则会开机异常: 设置触发参数,选择单次触发: 小米手环…

赋值运算符重载

背景: 在EHR模块进行调试时,发现QVector3D对象进行赋值时,出现变量未赋值成功问题。 问题描述: 在进行代码调试时,发现赋值操作未成功,导致代码逻辑异常,经过分析,发现QVector3D 赋…

数据结构——二叉树的性质和存储结构

二叉树的抽象类型定义 基本操作: CreateBiTree(&T,definition) 初始条件:definition给出二叉树T的定义。 操作结果:按definition构造二叉树T。 PreOrderTraverse(T) 初始条件:二叉树T存在。 操作结果:先序遍历T,对每个结…

springboot农产品销售信息微信小程序—计算机毕业设计源码35557

摘 要 在信息飞速发展的今天,网络已成为人们重要的信息交流平台。每天都有大量的农产品需要通过网络发布,为此,本人开发了一个基于springboot农产品销售信息微信小程序。 对于本农产品销售信息系统的设计来说,它主要是采用后台采…

D21【python接口自动化学习】-python基础之内置数据类型

day21 内置数据类型文档使用 学习日期:20240928 学习目标:内置数据类型--30 内置数据类型参考:如何使用官方文档与帮助? 学习笔记: 使用官方文档 可通过终端查看数据类型的方法 使用帮助 总结 官方文档是体系化的…

端侧Agent系列 | 端侧AI Agent任务拆解大师如何助力AI手机?(详解版)

引言 简介 Octo-planner 规划和执行Agent框架 规划数据集 基准设计 实验设计 结果 全量微调与LoRA 多LoRA训练与合并 不同基础模型的全量微调 不同数据集大小的全量微调 总结 实战 英文 中文示例1: 中文示例2: 0. 引言 人生到处知何似…

简单理解C++在C的基础上的改变

1.C语言的一些不足 我们首先看下面用C语言实现栈 #include<stdio.h> #include<assert.h> #include<stdlib.h> typedef int StackDateType; typedef struct Stack {StackDateType* _ps;size_t _size;size_t _capacity; }Stack; void StackInit(Stack* ps) {…

探索基因奥秘:汇智生物如何利用DNA亲和纯化测序技术革新生物医学研究?

引言&#xff1a; 随着生物医学技术的不断进步&#xff0c;我们对生命奥秘的探索越来越深入。在众多的生物技术中&#xff0c;表观组学分析技术逐渐成为研究的热点。本文将带您走进汇智生物&#xff0c;了解他们如何利用DNA亲和纯化测序技术&#xff08;DAP-seq&#xff09;推…

vue2 将页面生成pdf下载

项目场景&#xff1a; 在项目开发的过程中&#xff0c;经常有下载一些报表&#xff0c;有部分要求文档是pdf格式的文件&#xff0c;这时候可以插件快速地搭建一个将页面生成pdf文件的功能。 依赖支持 本次项目中主要使用的nodejs: 14.20.0&#xff0c;npm版本是6.14.17。 npm…

Glide基本用法及With方法源码解析

文章目录 引入优点 使用步骤导入依赖权限使用 其他用法占位符错误图片后备回调符圆角过渡动画大小调整gif缩略图 使用RequestOptions缓存机制设置缓存策略清理缓存 使用集成库OkHttpVolley with源码解析getRetrieverGlide.getinitializeGlide getRequestManagerRetriever Reque…

VS Code breadcrumbs view 是什么

VS Code breadcrumbs view 是什么 正文 正文 breadcrumbs view&#xff1a;中文翻译&#xff0c;面包屑视图&#xff0c;乍听起来感觉十分抽象。这里我们来解释一下这个视图的含义&#xff1f; 如下图所示&#xff0c;红色框标记的部分就是 这个视图可以显示出当前打卡文件所…

深入理解 Nuxt.js 中的 app:error:cleared 钩子

title: 深入理解 Nuxt.js 中的 app:error:cleared 钩子 date: 2024/9/28 updated: 2024/9/28 author: cmdragon excerpt: Nuxt.js 中的 app:error:cleared 钩子的用途及其实现方式。这个钩子为开发者提供了一种优雅的方式来处理错误清除后的状态恢复和用户反馈。 categor…

Rust赋能前端:为WebAssembly 瘦身

❝ 凡事你一旦接纳了&#xff0c;就不存在了&#xff1b;你看不惯它&#xff0c;它就一直折磨你 大家好&#xff0c;我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder ❝ 此篇文章所涉及到的技术有 WebAssembly Rust SIMD LLVM binaryen 因为&#xff0c;行文字…