目录
进程的优先级
什么是优先级
为什么要有优先级
linux的优先级特点和查看方式
其他概念
环境变量
命令行参数
环境变量
查看环境变量方法
修改PATH
其他环境变量
进程的优先级
什么是优先级
优先级:指定进程获得某种资源的先后顺序。(优先级代表已经有相应的权限只不过获得资源的顺序不同)
linux中优先级数组越小,优先级越高
为什么要有优先级
进程访问的资源(CPU)始终是有限的--(因为只有一个cpu,如果有多个cpu那么相应的进程也会多都是类似的)而系统中进程大部分情况都是有较多的
操作系统关于调度和优先级的原则:分时操作系统(基于时间片来进行调度的) ,多个进程在被调度的时候保证基本的公平,如果进程长时间得不到cpu的调度就造成了饥饿问题。
linux的优先级特点和查看方式
使用ps -al命令
UID : 代表执行者的身份
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
PRI :代表这个进程可被执行的优先级,其值越小越早被执行
NI :代表这个进程的nice值,进程优先级的修正数据,新的优先级=优先级+nice,达到对于进程优先级动态修改的过程。nice其取值范围是-20至19,一共40个级别
这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行,所以,调整进程优先级,在Linux下,就是调整进程nice值。需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进 程的优先级变化
用top命令更改已存在进程的nice:
top:
进入top后按“r”–>输入进程PID–>输入nice值:
我输入nice值100但是最后显示19说明nice有范围
需要注意的是每次调整优先级每次都是从80开始的(PRI)
其他概念
竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
环境变量
命令行参数
在我们的主函数main中可带参也可不带,例如:
int main(int a,char*s[]),s是字符串数组,a是长度,main函数最多三个参数
int main()
#include<stdio.h>
#include<unistd.h>
int main(int a,char*s[]){
for(int i=0;i<a;i++){
printf("a[%d]: %s\n",i,s[i]);
}
return 0;
}
./mytest.exe -a -b -c叫做命令行字符串,第一个是程序的路径+可执行程序名后面叫做和该进程匹配的选项
为什么要有命令行参数?
本质:命令行参数本质是教给我们程序不同的选项,用来定制不同的程序功能。命令中带有很多的选项
就比如ls -l,ls-la等
命令行中启动的程序都会变成进程,其实都是bash进程的子进程,比如 ./mytest.exe是输入父进程bash的。因为bash进程就是命令行解释器
环境变量
查看环境变量方法
echo $NAME //NAME:你的环境变量名称
系统中有很多的配置,在我们登录Linux中时已经被加载到bash进程中(内存)
为什么我们平常输入ls/pwd就行,而到我们得./xx.exe -x呢?
这是因为在Linux中存在一些全局变量,表明告诉命令行解释器应该去哪些途径下去寻找可执行程序。当然你也可以将自己的程序cp到指定的path下这样就不用./了但是不建议
修改PATH
对PATH修改:
1.直接覆盖修改,可能导致一些命令不能用,如果能跑说明不需要这个环境变量
这时候重新进入xshell进行,因为PATH是进入的时候加载到内存中的,自己有配置文件2.追加,PTAH=$PATH:XXXX XXX是追加的途径
这样就跟ls等命令一样不用加./了再重新登录也会初始化说明最开始的环境变量不是在内存中,而是在系统的对应的配置文件中
如果想一直保存则要修改配置文件
那么有一个问题?为什么我们安装java或者python都要我们安装环境变量,这是为什么呢?
主要原因是想通过环境变量直接找到我的可执行程序,不要让我带路径执行这样麻烦,并且可以让其他程序或脚本能够轻松地调用 Java 或 Python 程序。
其他环境变量
env:显示所有环境变量
export: 设置一个新的环境变量 export name=xxxx
unset: 清除环境变量 unset name
理解environ:
可以看到环境变量可以被子进程拿到,说明环境变量不在子进程里,那么他在那里?默认在bash内部里。父进程的数据默认能被子进程看到并访问
bash进程启动的时候,默认会给我子进程形成两张表:
argv[]命令行参数表(就是主函数main里的参数main(int a,char*argv[])),env[]环境变量表(从os的配置文件获得),bash通过各种方式交给子进程
比如export一个环境变量就是添加到env[]表里
理解:环境变量具有系统级的全局属性,因为环境变量本身会被子进程继承下去
同样也可以这样获得环境变量:
getenv("xxx");----需要的环境变量name需要stdlib.h头文件
本地变量只在本bash内部有效,无法被子进程继承下去,导成环境变量,此时才能够被获取
echo export都是内建命令 不是子进程