目录
1.进程优先级
1)什么是优先级
2)为什么要有优先级
3)Linux的优先级特点 && 查看方式
2.命令行参数和环境变量
3.环境变量
1)直接现象
2)见见更多的环境变量
3)整体理解环境变量和系统,和我们的程序结合一下
1.进程优先级
1)什么是优先级
优先级是指定进程获取某种资源的先后顺序
task_struct 进程控制块->struct->内部字段 ->int prio = ??
(task_struct作为进程控制块,内部包含了多个不同的结构体和字段,其中某个特定的struct中包含prio字段,用于存储默认优先级数字)
prio
default_prio = 80;
nice
在Linux中,优先级数字越小,优先级越高
关于优先级与权限之间的联系:
1.权限表示这个资源能不能获取
2.而优先级则是这个资源已经能获取了,只不过是获取资源的顺序
2)为什么要有优先级
因为进程访问的资源(CPU)始终都是有限的,而系统中进程大部分情况都是有较多的。
操作系统关于调度和优先级的原则:分时操作系统(时间片),基本的公平,如果进程因为长时间不被调度,就造成了饥饿问题。
3)Linux的优先级特点 && 查看方式
PRI:进程优先级
NI:进程优先级的修正数据,nice值,新的优先级 = 优先级 + nice,达到对于进程优先级动态修改的过程
这里我直接把nice干到了100,但是可以看到,NI只有19,这是因为:
nice的值有范围的 --> [-20,19]
这里我又进行了一次nice = -10(变为root才能二次更改)
但是我们发现PRI并没有从99开始变,而是从80,说明每次调整优先级,都是从80开始的。
一些其他概念:
2.命令行参数和环境变量
命令行参数:
int main(int argc, char *argv[]){}
main函数的参数可带可不带
通过传参和for循环遍历,可以将argv里面的char* 打印出来
而这个char** argv默认是父进程bash的!!
那么,为什么要有命令行参数呢:
本质:命令行参数本质是交给我们程序的不同的选项,用来定制不同的程序功能。命令中会携带很多的选项。
g_val这个数据在fork()创建子进程后,子进程也能访问并打印出来
说明父进程的数据,默认能被子进程看到并访问(注意:这里并没有说写入,所以与进程的独立性并不冲突)
我们发现,当我们执行exe可执行程序时,初始进程的ppid(也就是初始进程父进程的pid)始终为一个id,那这个id是谁呢?
命令行中启动的程序,都会变成进程,其实都是bash的子进程。
3.环境变量
1)直接现象
Linux中,存在一些全局的设置,表明告诉命令行解释器,应该去那些路径下去寻找可执行程序
PATH:环境变量
$PATH:打印环境变量的内容
系统中很多的配置,在我们登录Linux系统的时候,已经被加载到了bash进程中(内存)
默认我们查到的环境变量是内存级的
如果我想执行我的命令时,和系统指令一样的话
通过 PATH=$PATH:可执行程序所在路径
但是一旦重启XShell或其他终端软件时,PATH就会恢复默认,这时因为最开始的环境变量不是在内存中,而是在系统的对应的配置文件中
配置文件:
默认的环境变量都是存在于配置文件中的,在配置文件中修改,才算是真正修改了
2)见见更多的环境变量
PATH/HOME/SHELL/HISTSIZE/PWD
指令:
env --- 查看所有环境变量
echo $xxx --- 查看某个环境变量
export name=value --- 创建一个名为name值为value的环境变量
unset name --- 取消环境变量
3)整体理解环境变量和系统,和我们的程序结合一下
bash进程启动的时候,默认会给我子进程形成两张表:argv[]命令行参数表,env[]环境变量表。bash通过各种方式交给子进程!!!
1.argv命令行参数表来自用户输入的命令行
2.而env[]环境变量表则是来自OS的配置文件夹
这里和命令行参数类似,可以用for循环打印出环境变量(传参数或者声明都可)(传参--》int main(int argc, char *argv[], char* env[]))
父进程的数据,默认子进程也能看到并访问:
获取环境变量的方式:
1.extern char **environ
2.通过main函数参数
3.getenv("path")
环境变量具有系统级的全局属性,因为环境变量本身会被子进程继承下去
一般来说父进程的数据,子进程是能看到的,但是如果子进程导的一些变量做了修改,父进程是看不到的(因为进程具有独立性)
那么这种情况下做出的定义,它不应该创建子进程吗??如果创建了子进程那么导出来的环境变量就不应该被bash看到,但是确实实实在在的导给了bash啊,这是为什么呢??
(80%的命令都是bash创建子进程执行的)
因为export、echo等等有些命令为内建命令,由bash亲自执行
怎么理解呢?--》
比如C语言中有很多函数(bash也是C语言写的),就相当于bash内部有函数调用,而一些函数调用的名字就叫做
void export()
void echo)() 等等函数
bash内部如果识别到你的命令正好是export或者echo时,就不创建子进程了,就自己把这个函数调用就执行了
那怎么证明是内建命令呢?--》
当我把环境变量置空时,expor和echo还有其他内建命令能跑,而其他的命令都跑不了了