优先级:实际上就是CPU分配资源的先后顺序,指的就是进程的优先权。
原因是:资源是有限的,CPU资源同样是有限的。CPU一次只能跑一个进程,但进程确是不止一个的,所以需要用进程优先级区分,进程获取CPU资源的先后顺序。
我们可以使用以下命令查看进程优先级。
[---@VM-8-4-centos day01]$ ps -l
其中有几个重要的信息:
PRI & NI
在Linux系统中,PRI值默认为80,所以优先级PRI = 80 + NI。
NI
NI值的范围是-20~19
,如果超出这个范围,就会设置一个最接近这个区间的值也就是如果小于-20,就设为-20。如果大于19,就设为19。
为什么会有这个范围的规矩呢?
这是因为操作系统为了各个进程的公平运行,如果优先级(PRI)设置的很低操作系统就会更倾向于执行这个进程从而导致其他进程不能很好的被CPU执行。
nice(NI)值的修改
1.输入top
2.按r
键,输入需要被修改的PID。
3.输入修改后的NI值
4.按q
键退出
查看修改后的PRI值和NI值:(我不小心退出了,新的PID是25409)
我们本来设置的100,被改为了19。
如果我们想改为负值,则需要sudo提升权限。
[---@VM-8-4-centos day01]$ renice 10 26249
//26249 (process ID) old priority 0, new priority 10
如果想修改为负值,同样需要sudo提升权限。
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。
一般环境变量在系统中是具有全局性的。
bin/bash
。我们通过以下指令进行查看环境变量:
[---@VM-8-4-centos ~]$ echo $(PATH/HOME/SHELL/...)
我们在执行可执行程序时,为什么要加./
呢?为什么一些我们输入的命令就不用加呢?
原因是:我们在输入ls
等命令时,系统可以识别出这些命令存在的默认路径,而我们生成的可执行文件,系统可不知道它的路径是什么。所以我们需要给系统指明路径加上./
指明该可执行程序是在当前路径下的。
为什么系统知道ls
等命令的路径呢?
因为PATH中存了这些命令的路径。
[---@VM-8-4-centos day01]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/wsj/.local/bin:/home/wsj/bin
[---@VM-8-4-centos day01]$ which ls
alias ls='ls --color=auto'
/usr/bin/ls
如果我们也想我们的可执行程序不加路径就可以被执行呢?
方法1.把可执行程序拷贝到PATH环境变量下的某一路径
[---@VM-8-4-centos day01]$ sudo cp mycode /usr/bin
方法2.把可执行程序的当前路径拷贝到PATH环境变量中
路径输入pwd
后的路径,从==/home/…==替换。
[wsj@VM-8-4-centos day01]$ export PATH=$PATH:/home/...
每个用户都有自己的主目录(工作目录)。
下面一个是普通用户,另一个是超级用户:
我们在Linux操作系统当中所敲的各种命令,实际上需要由命令行解释器进行解释,而在Linux当中有许多种命令行解释器(例如bash、sh),我们可以通过查看环境变量SHELL来知道自己当前所用的命令行解释器的种类。
因为太多了就显示前5行。
其实就是一个二级指针:
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串。
main函数其实一共有3个参数,一般我们都不会去写它。
main(argc, argv, envp)
我们通过以下代码了解一下:
int main(int argc, char* argv[])
{
for(int i = 0; i < argc; i++)
{
printf("argv[%d]: %s\n", i, argv[i]);
}
return 0;
}
通过对这三个参数了解,我们写两段代码体会一下这三个参数:
代码1:
int main(int argc, char *argv[])
{
if (argc > 1)
{
if (strcmp(argv[1], "a") == 0)
{
cout << "hello" << endl;
}
else if (strcmp(argv[1], "b") == 0)
{
cout << "byebye" << endl;
}
else
{
cout << "nt" << endl;
}
}
else
{
cout << "ggwp" << endl;
}
return 0;
}
代码2:
int main(int argc, char* argv[], char* envp[])
{
int i = 0;
while(envp[i])
{
cout << envp[i] << endl;
i++;
}
return 0;
}
运行结果就是各个环境变量的值。
#include
#include
#include
using namespace std;
int main()
{
extern char** environ;
int i = 0;
while(environ[i])
{
cout << environ[i] << endl;
i++;
}
return 0;
}
和通过char* envp[]
的结果差不多。
libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern进行声明。
系统调用:getenv
int main()
{
cout << getenv("HOME") << endl;//PATH SHELL
return 0;
}
感谢您的阅读,欢迎指正。