目录
一:进程优先级
二:并行并发
三:环境变量
接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧
一:进程优先级
1.基本概念
当使用ps -al指令时,就会显示用户所启动的所有进程信息
这里的PRI :代表这个进程可被执行的优先级,其值越小越早被执行,在Linux中优先级是一个整形的数字,是task_struct结构体当中的一个字段成员
NI :代表这个进程的nice值 ,代表进程优先级的修正数据 UID : 代表执行者的身份
cpu资源分配的先后顺序,就是指进程的优先权(priority)。
优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能
2.PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行所以,调整进程优先级,在Linux下,就是调整进程nice值nice其取值范围是-20至19,一共40个级别,对于这里的PRI(old)=80
3.用top命令更改已存在进程的nice:
root用户下,使用top指令->r->输入修改进程的PID->输入调整值
4.物理上硬件资源是缺少的,而进程有很多,因此进程在系统的资源角度是具有竞争性的。为了良性竞争,即较均衡的让每个进程享受到系统资源,必须想办法组织起来让他们排队,所以所有系统当中队列的问题本质上都是因为进程要访问的目标资源不足的问题,是竞争性所带来的结果
5.如果调度器允许用户恶意的更改优先级,而导致其他进程长时间处于排队状态的话,就会导致其他进程的饥饿问题
6.对于进程根据优先级来展开的调度
是维护了两个队列,即指针数组,一个是runqueue的运行队列,一个是waitqueue的等待队列,当每个进程在一段时间内在cpu上执行后,就会去等待队列对应位置去排队,当runqueue队列中的所有进程执行完后,就交换runqueue和waitqueue的指针,继续执行进程
二:并行并发
1.独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
2.并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
当有两个物理cpu时,在操作系统层面上就得维护两个调度队列,两个物理cpu各自调度各自的,所以就直接决定了在系统当中的任意一个时刻一定会同时存在两个真正并行运行的进程
3.并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
这里我们先铺垫一下
为什么函数返回值能被外部拿到呢?---通过CPU寄存器提前保存下来
系统如何得知我们当前进程执行到哪里了--通过程序计数器即pc指针,eip寄存器保存了当前进程正在执行指令的下一条指令的地址
对于在CPU当中寄存器是很多的,作用主要是将进程的高频数据放入寄存器中,提高效率
所以CPU寄存器内保存的是进程的相关临时数据(可被访问或修改)---进程的上下文
对于每个进程当被cpu调度执行时,都是有一个时间片的概念的,当时间片的时间一到,进程将会被强制从CPU上扒下来,再将下个进程继续调度执行
当进程在从CPU上离开的时候,要将自己的相关临时数据(上下文数据)保存好带走,为下次被调度执行做准备,防止下次调度执行时不知道进程执行到哪行代码了
进程在被切换的时候,要做保存上下文,恢复上下文的操作
CPU上的临时数据是被保存在进程的PCB当中的
三:环境变量
1.环境变量是系统提供的一组name=value形式的变量,不同的环境变量有不同的用户,通常具有全局属性
2.在Linux系统中对于指令的搜索会提供一个环境变量,即PATH(指令的搜索路径)
所以对于在Linux中的指令不用带./就可以直接运行是因为指令的路径是在PATH环境变量当中的,运行时会直接去PATH中去查找
而我们自己写的程序的路径是不在PATH环境变量当中的,因此直接去运行时,在PATH环境变量中就会找不到
因此当直接执行指令时,系统是如何得知这些指令在哪里的?
因为操作系统在执行指令的时候,shell会在所维护的PATH环境变量的路径中一个一个路径的去查找,如果找到了就停下来,去执行该路径下的指令程序,所以在执行时不用带路径,如果指令不在对应的PATH的路径下,就会报出找不到的信息
3.在PATH系统环境变量中添加路径:PATH=$PATH:对应路径
4.在首次登陆时,默认所处的目录是自己的家目录或工作目录,这是因为当我们登陆时,shell会识别账户,填充$HOME这样的环境变量,当你登陆的时候,默认就是相当于cd $HOME,shell就把你放在默认的路径下
正是因为有了这个环境变量的存在,当我们登陆时,xshell会给我们分配bash命令行解释器,这其实也是一个进程,在执行时就会cd $HOME,把自己变为/root这样的路径
5.shell当前的可执行程序:$SHELL
6.env可以查到当前进程以及bash进程从系统里继承下来的所有的环境变量
7.环境变量可以通过系统调用接口获取: getenv(环境变量名);
8.指令带选项,本质上是同一个指令,但是因为不同的选项可以有不同的功能点去查看不同的内容
9.为了支持命令行参数,就必须在main函数中带参 int main(int argc,char* argv[],char*env[])
在命令行上解释的时候,输入的是字符串,bash会将字符串打散,以空格为间隔符,第一个为执行的命令,其余的为选项
获取自己进程的所有系统环境变量 env[]
当程序变为进程启动时,一定有人调用main函数,将命令行参数表,环境变量表传给main函数,自身的进程没有环境变量,但启动起来变为进程后又具有了环境变量
这是因为在shell中./运行可执行程序后,会变为bash进程的子进程,bash本身在启动时,会从操作系统的配置文件中读取环境变量信息,子进程会继承父进程的环境变量
因此环境变量被继承的两种方式:通过main函数传参,通过环境变量直接继承
10.常规命令:通过创建子进程完成的
内建命令:bash不创建子进程,而是由自己亲自执行的,类似于bash调用了自己写的或系统调用的函数.因此命令行上所启动的指令不一定全都要创建子进程
本地变量(在命令行中直接定义的为变量):只在本bash内部有效,不会被继承
11.增加环境变量:export
取消环境变量:unset
查询系统中所有的变量:set