【Linux】进程优先级

Linux 进程优先级

  • 为什么要有优先级的划分?
  • Linux 环境设置优先级的具体做法
  • 并发运行
  • 环境变量
    • 如何通过代码获取环境变量
  • 环境变量的来源

为什么要有优先级的划分?

优先级的规定就是为了确定某种资源获取的先后顺序。
本质原因是因为CPU资源是有限的。进程数量太多时,就会对资源形成竞争,就需要有优先级的划分来分配资源。
优先级反映到程序中也只是 PCB 结构体(LInux环境下是 task_struct)中定义的一些数据。

Linux 环境设置优先级的具体做法

以下面代码为例查看优先级。

#include <stdio.h>                                                                                    
#include <unistd.h>    int main()    
{    while(1)    {    printf("hello world: %d\n", getpid());    sleep(1);    }    return 0;
}

一个进程的优先级有 PRI 和 NI 共同决定。
PRI 越小,优先级越高,也越先被执行。
NI 是对 PRI 做调整的,也就是说 Linux 下的优先级是可变的。
NI 的取值范围为 -20~19
在这里插入图片描述
修改 NI 的方法有很多,这里使用top命令来修改。
在这里插入图片描述
在这里插入图片描述
下面是对 NI 值进行修改后查看到的进程的 PRI。从这里可以体现出 NI 对于进程优先级的调整方式。
在这里插入图片描述

并发运行

并行是指多个进程在多个CPU下分别同时运行。
并发是指多个进程在一个CPU下采用进程切换的方式,在一段时间内,多个进程都得以推进。
这里要谈的一点是,进程被切换之后,进程如果还没有被执行结束,那这个进程之后在CPU上恢复执行的时候,它是从头开始执行,还是从之前未执行完的地方开始执行?如果是从未执行完的地方恢复执行,又是如何做到这种恢复的呢?
首先回答第一个问题,肯定不能是从头开始执行了。
要知道用户所使用的计算机通常都只有一个CPU。
假如进程A正在被执行,CPU内的寄存器一定保存的是进程A的执行的各种临时数据。(寄存器中的临时数据,叫做进程的上下文数据)
当进程A被切换下来的时候,进程A需要同时带走自己的上下文数据暂时保存。
这是为了等下次回来继续被运行的时候,能根据这些保存的上下文数据,继续按照之前执行的逻辑向后执行,就好像没有被中断过一样。
所以CPU只有一个,寄存器中的数据也只能存储一份,但是上下文数据可以有多份,这些数据对应不同的进程,从而能够实现并发的运行。

环境变量

先以一个问题作为切入。
在这里插入图片描述
我们所写的可执行程序,和系统的可执行程序其实都是一样的存在。
这些可执行程序在执行的时候,都可以带全路径。
但是系统的可执行程序还可以直接执行,不用指定具体路径。而我们所写的可执行程序就必须指明路径(./路径)。
这是为什么呢?我们所写的可执行程序能不能不指定具体路径就执行呢?
首先要明确的是,系统要执行一条命令,必须要先找到它。
我们所写的可执行程序如果不带路径,就无法被找到。而系统的命令是默认可以被找到的。
因为这些系统命令已经是在环境变量PATH中存放的路径下的。
在这里插入图片描述
ls命令就存放在/usr/bin路径下。
所以要想让我们所写的可执行程序不带路径,有两种做法。
第一种是将我们所写的可执行程序配置进PATH环境变量的路径下(不推荐,可能会污染命令池)。
第二种是将我们所写的可执行程序的路径放进PATH环境变量中。
在这里插入图片描述
这里要说明一下命令行中改环境变量只在本次登录期间有效。当退出重新登陆后又会恢复修改前的样子。
PATH只是环境变量的一种。
要查看Linux下所有的环境变量,可以使用env命令。
在这里插入图片描述
这些环境变量在系统当中都是以键值对的形式存在着。
set命令也可以查看环境变量。同时还可以显示本地定义的shell变量。
在这里插入图片描述
在这里插入图片描述

如何通过代码获取环境变量

#include <stdio.h>
#include <unistd.h>int main(int argc, char* argv[], char* env[])
{/** 方法一* argc argv 命令行参数* env 环境变量参数*/for (int i = 0; env[i]; ++i){printf("env[%d]: %s\n", i, env[i]);}/** 方法二* environ 全局的第三方变量*/extern char** environ;for (int i = 0; environ[i]; ++i){printf("env[%d]: %s\n", i, env[i]);}return 0}

上面的代码获取的是所有的环境变量。
还可以使用getenv指定要获取的环境变量。
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>int main()
{// 获取 PATH 环境变量printf("%s\n", getenv("PATH"));return 0;
}

这里再介绍一下 main 函数的argcargv参数。

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

这里可以看到,argc 表示在命令行中传入的参数个数,而argv内则会保存这些传入的参数。
这里就可以理解,指令对应不同的参数选项,所具有的不同的功能是如何做到的了。
在这里插入图片描述

环境变量的来源

环境变量具有全局属性。
任何在命令行上启动的进程,他的环境变量都来自父进程。
默认,所有的环境变量都会被子进程继承。
下面的执行结果给出了一定的证明。

#include <stdio.h>int main()
{printf("%s\n", getenv("helloworld"));return 0;
}

在这里插入图片描述
而追溯到源头,命令行shell外壳的环境变量来自操作系统,操作系统会将配置文件中的环境变量进行装载。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LIS检验信息系统

LIS检验信息系统是以病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标&#xff0c;将医学检验、科室管理和财务统计等工作进行整合&#xff0c;全面改善检验科室的工作现状。 LIS把检验、检疫、放免、细菌微生物及科研使用的各类分析仪器&#xff0c;通…

uniapp实现聊天消息触,vue3和vue2实现聊天消息触底 scrollTop ,scrollHeight Pc端H5端都适用

uniapp触底SDN链接如下(本人的另一篇博客) uniapp聊天时时触底链接 Pc端 模拟手机端H5 vue3写法 <template><div><!-- 聊天窗体 --><div class"test" id"gundong"><div class"text" v-for"p in chat"&…

SQL Server数据库 -- 表的高级查询

文章目录 一、子查询 嵌套子查询相关子查询二、查询运算 并运算union交运算intersect差运算except三、函数的使用 if语句while语句case语句四、总结 前言 高级子查询是对查询更灵活的运用&#xff0c;学会了高级查询将对数据库使用有很大的帮助。 一、子查询 1、子查询简介 在…

比亚迪海外市场势起

监制 | 何玺 排版 | 叶媛 海外市场正成为比亚迪新的增长点。 据媒体报道&#xff0c;从去年下半年至今&#xff0c;比亚迪已经在至少四个国家的纯电车型市场占据“销冠”位置。对于国内用户群体来说&#xff0c;比亚迪销量“霸屏”早已不是新闻&#xff0c;但在海外也保持这个…

易基因“多区域DNA甲基化检测探针设计及其检测方法”获专利授权!

大家好&#xff0c;这里是专注表观组学十余年领跑多组学科研服务的易基因。 DNA甲基化是表观遗传学研究中&#xff0c;修饰最为稳定&#xff0c;含量最为丰富&#xff0c;对基因调控最为活跃、途径最为广泛的一种修饰。不同基因区域或位点的修饰与胚胎发育、疾病发生和发展密切…

数据库--->MySQL(2)【事务、SQL优化】

文章目录 事务什么是事务&#xff1f;隔离性中的不同隔离级别事务实现的原理隔离级别的实现原理&#xff08;MVCC&#xff09;MySQL中的锁机制 SQL优化 事务 什么是事务&#xff1f; 事务就是逻辑上的一组操作&#xff0c;在同一个事务中&#xff0c;如果有多条sql语句执行&am…

android studio 使用lib中的framework.jar编译

本文参考了网上搜索到的内容总结了一下&#xff0c;感谢大神们的无私奉献。 在App中的build.gradle中的android{}下添加&#xff1a; android{...gradle.projectsEvaluated {tasks.withType(JavaCompile) {Set<File> fileSet options.bootstrapClasspath.getFiles()Li…

100种思维模型之安全边际思维模型-92

安全边际&#xff0c; 简而言之即距离某一件糟糕的事件发生&#xff0c;还有多大的空间&#xff0c;安全边际越高&#xff0c;我们就越安全&#xff01; 安全边际思维模型一个 让生活变得更从容 的 思维模型。 01、何谓安全边际思维模型 一、安全边际思维 安全边际 源于…

(9)基础强化:元字符,正则表达式,匹配,提取组,Regex,Match与Matches

一、作业 1、问&#xff1a;下面解压程序出错&#xff0c;什么原因&#xff1f; string src "E:\1.txt";string des "E:\2.txt";using (FileStream read File.OpenRead(src)){using (GZipStream gzip new GZipStream(read, CompressionMode.Decompress…

PHP代码审计(一)之PHP代码审计的意义

PHP代码审计的意义 什么是代码审计 什么是代码审计&#xff1f;代码审计就是获取目标的源代码&#xff0c;这个目标可以是一个网站&#xff0c;也可以是一个手机app&#xff0c;只要我们得到了目标的源代码&#xff0c;我们就可以去挖掘目标系统的漏洞&#xff0c;代码审计是…

电脑上有哪些好用的小众软件?快看看这里!

​ 电脑上的各类软件有很多&#xff0c;除了那些常见的大众化软件&#xff0c;还有很多不为人知的小众软件&#xff0c;专注于实用功能&#xff0c;简洁干净、功能强悍。 自动化工具——AutoHotkey ​ AutoHotkey是一个自动化工具&#xff0c;可以让你创建和运行各种脚本&…

快快快快快快快快快快排

作者简介&#xff1a;დ旧言~&#xff0c;目前大一&#xff0c;现在学习Java&#xff0c;c&#xff0c;Python等 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 望小伙伴们点赞&#x1f44d;收藏✨加关注哟&#x1f495;&#x1f495; C语言实现快排☺️ ℹ️…