目录
1、进程优先级
1、UID
2、PRI、NI
1、top命令调整进程的优先级
2、进程的相关概念
3、环境变量
1、问:为什么自己写的程序要带./才能运行?
2、如何让自己的程序不带./也能运行?
1、环境变量
1、常见的环境变量
2、和环境变量相关的命令
3、本地变量
2、环境变量的组织方式
1、命令行参数
2、环境变量的组织方式
3、环境变量的获取方式
3、环境变量通常是具有全局属性的
优先级:享受某种资源的先后顺序
为什么会有优先级?因为资源有限。
优先级的本质就是分配资源的一种方式。
fg 将后台进程提到前台
ps -l或者ps -al 查看进程的相关信息
UID:指用户id。就类似于身份证号与名字
PRI:就是priority的简写,可以理解为就是优先级
NI:代表进程的nice值,是优先级的修正数据
nice的取值范围是-20—19,一共40个级别
Linux中优先级数据越小,优先级越高
PRI(new)=PRI(old)+nice
Linux是通过调整进程的nice值来调整进程的优先级,当nice值为负值时,进程的优先级值将变小,所以优先级将变高,则其可以越快被执行。
top之后,会看到上述的场景,按r,再输入要调整进程的pid,回车之后,再输入nice值,然后q退出,此时ps -al就会看到进程的优先级发生变化。
注意:1、公式PRI(new)=PRI(old)+nice 中的PRI(old)的值一直是80。
2、如果不让短时间内做多次修改,可以sudo top来提升权限。
为什么nice值的范围只有40个级别,为什么范围不设置的大一点?
优先级再怎么设置,也只是一种相对的优先级,不能出现绝对的优先级,否则会出现很严重的“进程饥饿问题”,说人话就是某个进程长时间得不到资源。而且调度器就是为了让每个进程较为均衡 的得到cpu资源,所以不能让优先级设置的太夸张。
竞争性:系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰 。
并行:多个进程在多个CPU下分别,同时进行运行,这称之为并行 。
并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。
Linux中命令、程序、工具等,本质都是一个个的可执行文件。
我们都知道./是告诉操作系统要执行的程序在当前路径下,但是为什么像ls、pwd这样的命令直接就能运行?
因为环境变量PATH。
系统中存在系统级别的变量——环境变量
echo $环境变量名 查看环境变量里的内容
例如:echo $PATH 查看PATH里的内容
答:系统通过PATH进行路径查找,查找规则就是在PATH中,先找第一个路径,找不到就找第二个路径,以此类推,如果找到了对应的命令,后续就不再找了,将该路径下的可执行程序跑起来。换言之,操作系统执行命令时,实际上操作系统是通过环境变量PATH去搜索对应的可执行程序路径。
1、将程序拷到PATH路径下。(不推荐,污染命令池)
2、将当前路径添加到PATH中。
所谓的安装软件就是将该软件拷到系统环境变量当中特定的命令路径下,所以安装的过程就是拷贝的过程。
注意:上图只是本次登录有效,关闭Xshell再重登,就不行了。
如果想让配置永久有效,请百度。
环境变量:一般是指在操作系统中用来指定操作系统运行环境的一些参数。
环境变量通常具有某些特殊用途,在系统当中通常具有全局属性。
语言上定义变量本质是在内存中开辟空间(该空间有名字),然后就可以根据名字找内容。
不要质疑操作系统开辟空间的能力。
环境变量本质是操作系统在内存/磁盘文件中开辟空间,用来保存系统相关的数据。
PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash
env 查看所有的环境变量
echo 显示某个环境变量值
export 设置一个新的环境变量
env 显示所有环境变量
unset 清除环境变量
set 显示本地定义的shell变量和环境变量
系统中还存在一种变量,只与本次登陆Xshell有关的变量,只在本次登录有效,称为本地变量。
set 显示环境变量和本地变量
注意:上述export导成的环境变量并没有写入到系统配置文件中,Xshell关了就不存在了。
unset 取消本地或环境变量
main函数也是能携带参数的
#include
int main(int argc,char* argv[])
{
for(int i=0;i%s\n",i,argv[i]);
}
return 0;
}
问:为什么要有命令行参数?
答:指令有很多选项,用来完成同一个命令的不同子功能。选项的底层使用的就是命令行参数。
main函数可以携带三个参数,第三个就是环境变量参数
#include
int main(int argc,char* argv[],char* env[])
{
for(int i=0;env[i];i++)
{
printf("%d->%s\n",i,env[i]);
}
return 0;
}
环境变量的组织方式和argv[]差不多,如图:
1、命令行第三个参数
2、通过第三方变量environ获取
man environ
代码如:
#include
int main()
{
extern char** environ;
for(int i=0;environ[i];i++)
{
printf("%d->%s\n",i,environ[i]);
}
return 0;
}
注意:main函数没有参数也可以传参。
3、通过系统调用获取或设置环境变量
man getenv
代码如:
#include
#include
int main()
{
printf("%s\n",getenv("PATH"));
return 0;
}
命令行上启动的进程,其父进程都是bash,子进程的环境变量是父进程(bash)给的,bash的环境变量是系统给的,在系统的相关配置文件中。当bash启动时,bash本身就将系统环境变量写到自己的上下文中。
env查到的都是Shell写入的环境变量,这个环境变量可以继承给子进程。
所以环境变量之所以具有全局属性,就是因为环境变量可以被子进程继承,从而影响了整个“用户系统”。