Linux进程<3>
紧接上文进程排队的话题,那操作系统根据什么来判断进程的先后执行情况?根据进程优先级。进程想要访问眸子资源,进程进行通过一定的方式(排队),确认享受自资源的先后顺序。是为了应对操作系统资源过少的现状。通过中整型PRI指数的大熊啊来判断。接下来细说PRI,liux默认优先级是80,linux的优先级是可以被需改的,linux的优先级的范围是【60,99】,其pri=pri(old)+nice。linux优先级本质是数字,数字越小,优先级越高。linux系统允许用户调整优先级,但是不允许让人直接修改pri,而是修改nice值,但是nice值有可以修改无限大吗?经过测试,其区间是【-20,19】,也就是说在linux默认优先级的情况下,向下是-20为60,向上是+19为99。以上操作是为了达到任何的分时操作系统进行较为公平的调度。为什么Linux要调整优先级是受限制的?如果不加限制,比如在一个大型项目中,有些人将自己的进程优先级调整的非常高,导致优先执行他的代码,对于别人就不公平了。因为优先级较高的进程,会优先得到资源,对于有源源不断产生的后续进程,后续进程就很难享受到cpu资源,进而也会产生进程饥饿问题。
linux的调度与切换
进程在运行的时候,放在cpu上,并不一定会让进程直接跑完,现在的操作系统,都是给予时间片进行轮转执行的。进程的调度有如下特性:竞争性,独立性,并行,并发
进程在运行的过程中,要产生大量的临时数据,放在cpu的寄存器中,cpu内部的所有临时数据,我们叫做进程的硬件上下文,硬件上下文存在的目的是保存进程,进而达到保护上下文的目的。当进程在二次调度的时候,进行被放在cpu上开始运行时,其会将曾经保存的硬件上下文进行恢复。那cpu的寄存器只有一套,其资源不会被占满了吗?首先我们要明确cpu的寄存器只有一套,寄存器内部保存的数据可以有很多套,我们要区分的是寄存器和寄存器的内容,虽然寄存器数据被放到了一个共享的cpu设备里面,但是所有的数据,其实都是被进程私有的。最后所有的保存都是为了最终的回复,所有的回复都是为了继续上次的运行位置,以便继续运行进程。
接下来我们来介绍下linux实现进程调度的算法,即要考虑优先级,饥饿,效率这三个因素。首先传输服务器上存在活跃队列和过期队列,活跃队列优先于过期队列进行资源占用。在活跃队列中,操作系统会根据进程优先级的指数pri对各种进程进行排序,其在linux中会是一串比特位,比特位的内容代表了不同的含义:比特位的数字,表示是哪一个队列,比特位的内容,表示该队列是否为空等等,要检测那个队列中是否有进程,只需检测对应的比特位是否为1即可。随着时间的进行,活跃队列中的进程会不断减少,相反,过期队列中的进程会不断增多。当达到一定条件时,活跃队列就会和过期队列进行交换,这里的交换更改的时指针变量的内容(swap(&,&)),从而达到实现活跃队列和过期队列属性的交换。
接下来介绍的是环境变量,我先引入一下:在学习C语言中,main函数后面的括号内容一般被省略不写,那么系统默认会执行main函数的第一部分功能,事实上main函数有多个功能,其通过命令行参数去实现main函数的多功能,这样做的目的是可以让我们通过不同的选项,让我们的同一个程序去执行内部不同的功能,对于linux,命令行参数是linux选项的基础。回归正题,环境变量并不是一个变量,而是一堆但彼此没有关系的变量,其作用一般是系统内置的具有特殊用途的变量。别忘了,定义变量的本质其实是开辟空间,在运行期间我们的程序也能开辟空间。所以操作系统/bash也能在运行中空间,因为其也是C语言写的程序。再者,系统的环境变量,本质是系统开辟空间,给他名字和内容即可
下面是一些常见的环境变量:
环境变量也有特性,即具有全局特性,环境变量会被虽有的子进程包括孙子进程继承,进而实现相应的命令行操作:echo,env,。