巧家县城乡建设局网站,网站配置伪静态,动图在线制作网站,wordpress文件存储在阿里云oss进程优先级 环境变量 一、进程优先级1、基本概念2、查看以及修改系统进程的优先级3、一些其他的关于进程优先级的指令和函数调用4、与进程优先级有关的一些进程性质二、环境变量1、基本概念2、和环境变量相关的命令3、Linux中的常见环境变量介绍4、环境变量的组织方式以及在C代…
进程优先级 环境变量 一、进程优先级1、基本概念2、查看以及修改系统进程的优先级3、一些其他的关于进程优先级的指令和函数调用4、与进程优先级有关的一些进程性质二、环境变量1、基本概念2、和环境变量相关的命令3、Linux中的常见环境变量介绍4、环境变量的组织方式以及在C代码中如何获取环境变量5、不同用户的环境变量是怎么形成的6、main()函数的命令行参数一、进程优先级
1、基本概念
cpu资源分配的先后顺序就是指进程的优先权priority。 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的Linux很有用可以改善系统性能。 还可以把进程运行到指定的CPU上这样一来把不重要的进程安排到某个CPU可以大大改善系统整体性能。
2、查看以及修改系统进程的优先级
在Linux或者unix系统中用ps –al命令则会类似输出以下几个内容,其中
UID : 代表执行者的身份PID : 代表这个进程的代号PPID 代表这个进程是由哪个进程发展衍生而来的亦即父进程的代号PRI 代表这个进程可被执行的优先级其值越小越早被执行NI 代表这个进程的nice值其表示进程可被执行的优先级的修正数值。 我们看到我们现在有两个进程 bash ps 它们的进程优先级都是80如果我们要修改它们的优先级就要用到NI的nice值了。 PRI(new)PRI(old)nicePRI(new)PRI(old)nicePRI(new)PRI(old)nice
从这个公式中我们知道 新的PRI 老的PRI nice值但是这个老的PRI的值是指PRI最初的默认值例如上面的bash ps 是80那么这个PRI以后不论怎么改老的PRI都是80当然大多数进程默认的PRI都是80。
此外nice是有范围的其取值范围是-20至19一共40个级别。 于是下面我们去尝试去更改processC进程的优先级。 注意将进程优先级调高即将nice值设置为负数需要root用户进行操作
修改进程优先级的Linux指令:
top命令进入top后按r - 输入进程PID - 输入nice值 按下 “r”
输入 -20
再次查看进程的相关信息 我们发现进程的优先级确实改变了但是我们能改变进程优先级有限[−20,19][-20,19][−20,19]因为调度器不允许我们将一个进程设置的优先级太高进而导致其他进程难以被调度。
3、一些其他的关于进程优先级的指令和函数调用
nice指令 nice命令的功能是用于调整进程的优先级合理分配系统资源。 -n参数是nice值的优先级别
以nice值为 -5 的方式执行指定程序 查看进程优先级 renice命令可以修改正在运行的进程的调度优先级。 renice更改一个或多个进程的调度优先级。第一个参数是要使用的优先级值另一个参数被表示为进程标识信息。
renice [-n] priority [-gpu] identifier-g,后面加组的 pgid,改变一个组的进程优先级 -u,后面加user name 或 uid改变一个用户所拥有的进程优先级。 -p, 后面加pid 改变一个进程的进程优先级。 使用renice命令 函数调用 在Linux中关于改变进程优先级函数调用主要有两个:getpriority() 与setpriority()具体的详细使用在这里我们就不做介绍了如果你有兴趣可以看我【Linux】专栏里面的另一篇关于getpriority() 与setpriority()的讲解。
4、与进程优先级有关的一些进程性质
竞争性: 系统进程数目众多而CPU资源只有少量甚至1个所以进程之间是具有竞争属性的。为了高效完成任务更合理竞争相关资源便具有了优先级独立性: 多进程运行需要独享各种资源多进程运行期间互不干扰。并行: 多个进程在多个CPU下分别同时进行运行这称之为并行并发: 多个进程在一个CPU下采用进程切换的方式在一段时间之内让多个进程都得以推进称之为并发
二、环境变量
1、基本概念
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数环境变量通常具有某些特殊用途在系统当中通常具有全局特性。
如我们在编写C/C代码的时候在链接的时候从来不知道我们的所链接的动态静态库在哪里但是照样可以链接成功生成可执行程序原因就是有相关环境变量帮助编译器进行查找。
2、和环境变量相关的命令 env: 显示所有环境变量 echo: 显示的变量值(需要带上 $ 符号) export: 设置一个新的环境变量或者将本地变量提升成环境变量。 unset: 清除环境变量 set: 显示本地定义的shell变量和环境变量
3、Linux中的常见环境变量介绍
PATH : 指定命令的搜索路径 例如我们使用的Linux中 ls pwd命令其实就是一个个C语言写的一个个小程序为什么我们运行自己写的程序就要用./ 自己的程序名 而我们运行ls pwd 从来不加./这就和环境变量PATH有关了 我们查看环境变量可以使用echo $环境变量命令 默认情况下我们使用的Linux指令会去PATH路径下寻找源程序由于ls指令的路径位置就在PATH的环境变量中所以我们可以不用加./ 我们现在尝试将我们的路径添加到PATH环境变量里面来让我们的程序也不需要加./这时我们就需要使用一个新的指令了export export令可以将本地变量提升成环境变量于是我们将我们的路径添加到PATH中就可以这样写 export PATH$PATH:你要添加的路径当然我们使用export命令是暂时将本地变量提升为环境变量当我们退出云服务器或关机重启都会消除export暂时提升的环境变量想要真正的修改我们要修改相应的配置文件。
当然我们还可以将我们写的程序拷贝到Linux的PATH默认路径下这样我们也不用使用./了在Linux中把可执行程序拷贝到系统默认路径下让我们可以直接访问的方式相当于Linux下软件的安装! HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录) 由于HOME环境变量的存在我们使用相同的命令cd ~却得到了不同的结果。 SHELL : 当前Shell,它的值通常是/bin/bash。
4、环境变量的组织方式以及在C代码中如何获取环境变量
在Shell内部环境变量其实是以环境变量表的方式进行维护的 此外环境变量还具有全局性我们知道我们在bash下运行的程序其父进程都是bash,那么bash就可以将自己的环境变量传递给子进程并在子进程中发挥作用
我们来看一段代码来验证环境变量具有全局性。
1. C库函数getenv()获得单个环境变量 在看验证代码之前我们先了解一个函数getenv() getenv()是一个C库函数,它可以获取一个环境变量的内容 函数原型 函数的参数是环境变量的名称返回值是一个char*字符串记录了环境变量里面的内容,如果调用失败会返回NULL指针。
实例代码
#includestdio.h
#includestdlib.h
int main()
{char* env getenv(USER);//USER是环境变量if(env NULL){perror(getenv fail:);}printf(%s\n,env);return 0;
}代码输出结果 我们在代码里面多出来的USER变量就是来自Shell传递给我们的test1c进程的环境变量 2. main()函数参数获得环境变量 此外我们我们还可以用main函数的参数来获得所有环境变量的地址通过地址我们也能遍历所有环境变量
函数原型
int main(int argc, char *argv[] char *envp[]);在这里我们先不谈论函数的参数 argc *argv[],我们来谈论第三个参数其中*envp[]是一个字符数组指针指向的是一个指针数组数组名代表首元素的地址首元素是一个字符指针*envp[]刚好又是指向首元素的指针故其实*envp[]其实是一个二级指针 明白了这些我们来看下面一段代码
#includestdio.h
int main(int argc, int *argv[], int *envp[])
{for(int i 0; envp[i] ! NULL ; i){//打印所有环境变量相当于 env 命令printf(envp[%d]--%s\n, i, envp[i]);}return 0;
}可以看到我们确实打印出了所有的环境变量而且这个环境变量来自于其父进程bash。
3. C语言全局变量environ获得环境变量
变量详情 environ变量是一个二级指针与main()函数参数的char *envp[]类似。遍历所有环境变量也可以这样写
#includestdio.h
#includeunistd.h int main()
{extern char** environ;for(int i 0; environ[i] ! NULL; i){printf(environ[%d]--%s\n, i, environ[i]);}return 0;
}5、不同用户的环境变量是怎么形成的
通过上面的讲解我们知道了环境变量的概念与作用环境变量中的每一个都有自己的用途:有的是进行路径查找的有的时进行身份认证的有的时进行动态库查找的有的是用来进行确认当前路径等等每一个环境变量都有自己的特定应用场景。
我们也知道为什么对于不同的用户其环境变量也并不相同例如我们上面的root用户的环境变量与pan的环境变量有的一样有的不一样那么Linux是怎样形成不同的环境变量的呢
这里先给出结论环境变量本质就是一个内存级的一张表这张表由用户在登陆会统的时候给特定用户形成属于自己的环境变量表。
在我们的家目录下有两个文件叫 .bashrc .bash_profile 在根目录下有一个bashrc的文件
打开这些文件看看 6、main()函数的命令行参数
在前面我们谈论中我们说到过main()函数的参数问题我们还有两个参数没有谈论int argc char *argv[]。现在我们来讨论它们
由于C语言中无法传递整个数组所以在函数中想要获得数组元素的个数必须在传参时就要提前传递好于是其中int argc 就是char *argv[]数组指针指向的数组的有效元素个数不包含NULL。
这个char *argv[]是一个数组指针其指向的数组里面存放的都是char *的指针这些char *的指针指向的内容需要我们使用命令行的方式进行设置。
我们先看下面一段代码
#includestdio.h
int main(int argc, int *argv[])
{printf(argc %d\n,argc);for(int i 0; argv[i] ! NULL; i){printf(argv[%d]--%s\n, i, argv[i]);}return 0;
}运行结果 我们Linux中ls命令有许多参数如-a -l -d -nls本质上就是C语言写的一个程序它为什么能根据不同的参数执行不同的功能就是因为使用了mian()函数的命令行参数