目录
1.进程优先级
首先区分优先级与权限。
- 权限:能否执行某个"事物"。
- 优先级:使用某个"事物"的顺序.
-
为什么要有优先级?
当要被管理的对象很多时候。
-
怎么样使用优先级
进程优先级决定了哪个进程优先使用资源。
1.1 pri和nice值
编写一个程序,让它运行起来,查看进程的信息
进程的优先级pri,ni(nice)表示优先级的修正数据。
优先级真正的值是pri+nice后的值。
Linux中调整优先级值的大小,就是通过调整nice值来实现的。nice的取值范围为-20-19,一共40个级别。也就是说pri(new)=pri(old)+nice
使用sudo,获取root权限输入正确的nice值。得到70。
需要注意的是,你重新修改nice值的话,不是在70的基础上进行加减。
pri(new)=pri(old)+nice
而是在80的基础上,也就是说pri(old)不变。
假如你输入的nice值,超过区间[-20,19],超过最大值按19进行处理,超过最小值按-20进行处理。
其实,除非特殊情况不要修改进程的优先级。
1.2 进程的其他概念
2. 环境变量
当我们把程序运行起来。
- 从硬件角度来看,程序从硬盘中被加载到内存。
- 从软件角度来看,os为这个程序创建task_struce结构体。
他就成为了进程。
我们再来看一个问题。
当我们运行自己写的程序,需要加./
表示当前路径。
那么像我们经常使用的ls,makedir,rm等等命令也是程序,为啥他就不需要加路径就能运行。
当我们要运行一个程序,先要找到他,然后再运行。./
的目的就是为了找到他,像ls这种程序,一定有某种默认查找路径来查找出他。
这种默认查找路径我们放在了path环境变量中。很明显环境变量也是一种变量,变量是有变量名+变量内容构成。
我们用echo $PATH
来查看他的内容
冒号作为分隔符,呈现出若干个子路径,执行命令时,在子路径一个个进行查找。找不到就会报错comand not find
那如果我们编写的程序想要不带路径,显然有两种方式。
第一种,把proc所在的绝对路径放在PATH环境变量的子路径中。
第二种,编写程序时把程序放在/usr/bin目录中
其实第二种会污染Linux环境,我们并不推荐。第一种在我们再次登录时会删除我们添加的路径(想永久保留需要修改配置文件)
那么怎么放呢?
我们可以过export来设置环境变量,注意千万不能像下面这样否则环境变量就会全部改变,只有这一条路径,所有命令都用不了了。
正确的做法:
查看发现当前路径环境变量已添加,不需要带路径运行成功。
除了PATH,还有一些常见的环境变量,都是通过echo $NAME
来进行查看。
- PATH : 指定命令的搜索路径
- HOSTHOME:当前主机名
- HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
- SHELL : 当前Shell,它的值通常是/bin/bash
通过env可以查看这些环境变量
2.1 简单总结一下环境变量:
- 什么是环境变量?
系统中某些具有全局性质的变量,通常是为了满足系统的某些需求。 - 为什么需要环境变量?
为了满足开发者,用户,系统进行简化的查找,确定,定位等问题。 - 怎么样使用?
在命令行中使用env,export以及echo $NAME等
2.2 编程语言怎么获取环境变量
我们平时写的main函数其实是有参数的。
从左到右依次是:
命令行参数的个数,命令行参数,环境变量。
2.21 命令行参数的个数与命令行参数
平时使用的命令也是程序,比如ls,他后面可以带参数从而表现出不同结果。
我们也可以让自己编写的程序呈现出这样的效果。
#include<iostream>
using namespace std;
int main(int argc,char* argv[],char* env[])
{
for(int i=0;i<argc;i++)
{
cout<<"argv["<< i<<"]"<<argv[i]<<endl;
}
return 0;
}
也就是说我们可以通过if语句来让他输入不同参数时显示出不同的效果
1 #include<iostream>
2 #include<string>
3 using namespace std;
4
5 int main(int argc,char* argv[],char* env[])
6 {
7 for(int i=0;i<argc;i++)
8 {
9 cout<<"argv["<<i<<"]:"<<argv[i]<<endl;
10 }
11 string s = argv[1];
12 if(s=="-a")
13 {
14 cout<<"hello a"<<endl;
15 }
16 else{
17 cout<<"hello b"<<endl;
18 }
19 return 0;
20 }
在c,c++中,argv[0],表示可执行程序
2.22 环境变量
我们通过打印env数组来打印出环境变量
#include<iostream>
2 #include<string>
3
4 using namespace std;
5
6 int main(int argc,char* argv[],char* env[])
7 {
8 for(int i=0;env[i];i++)
9 {
10 cout<<i<<":"<<env[i]<<endl;
11 }
12 return 0;
13 }
那么假如我们想获得环境变量PATH
#include<iostream>
2 #include<stdlib.h>
3 using namespace std;
4
5 int main(int argc,char* argv[],char* env[])
6 {
7 cout<<getenv("PATH")<<endl;
8 return 0;
9 }
也可以打印pwd,从而获取当前的路径
#include<iostream>
2 #include<stdlib.h>
3 using namespace std;
4
5 int main(int argc,char* argv[],char* env[])
6 {
7 cout<<getenv("PWD")<<endl;
8 return 0;
9 }
~
~
切到上级目录,获取当前路径。这样就自己实现了一个pwd
注意:环境变量具有全局属性,父进程的环境变量信息是可以被子进程继承下去的。