进程优先级 && 进程的调度与切换 && 环境变量
- 1.进程优先级
- 1.1查看进程
- 1.2 PRI VS NI
- 1.3用指令调整优先级
- 2.进程的调度与切换
- 2.1 进程切换
- 2.2 linux实现进程调度的算法
- 3.环境变量
- 前言引入(main参数--命令行参数)
- 3.1 环境变量
- 3.2 PATH环境变量
- 3.3 系统指令查看环境变量
- 3.4用代码获取环境变量
1.进程优先级
优先级的前提也就是:访问某种资源的时候,通过一定的方式确定先后顺序;
这里我们先搞清楚两个概念
优先级 VS 权限
一个进程有了优先级的概念,那他就一定能被执行,也就是一定有权限。
简单来说权限是决定了能不能执行,优先级则是执行的先后顺序
优先级:cpu资源分配的先后顺序,进程的优先权(priority)
1.1查看进程
我们采用 ps -l
查看进程
这里面的PRI就是优先级,优先级也是一个整型变量。
- Linux的默认优先级是80;
- Linux的优先级是可以被修改的,优先级范围是[60, 99]—40
- 数字越小,优先级越高
1.2 PRI VS NI
这里的NI就是我们说的nice值,nice表示的是进程可被执行的优先级的修正数值
注意这里是修正数据
(new)PRI = (old)PRI + NI
nice的取值范围 -20到19
为什么linux调整优先级是一种受限状态?
因为优先级高的进程,先得到资源,常规进程很难享受到CPU资源,从而造成进程饥饿问题。
1.3用指令调整优先级
2.进程的调度与切换
进程在运行的时候,是基于时间片进行轮转执行的;时间片可以理解为OS给每个进程设定的最大执行时间,例如:1ms,一毫秒过去之后,不论这个进程有没有执行完毕,OS都会把这个进程调离出去,执行下一个进程
并发可以理解为一个大的CPU被分成了10个小的cpu每一个都去执行一个进程,但他们的效率都只有原本的十分之一。
2.1 进程切换
cpu有大量的寄存器,进程在cpu运行中,会产生大量的临时数据,放在cpu的寄存器中;这里面的临时数据衡量了进程当前的执行到了哪一行(PC指针),执行的结果……
cpu内部产生的临时数据,叫做进程的硬件上下文,让我们的进程进行保存(拷贝到PCB中)。
进程被二次调度的时候,将硬件的上下文进行恢复。
2.2 linux实现进程调度的算法
linux实现进程调度的算法,要考虑优先级,饥饿问题,效率.
这句话可以用下面的这张图来解释
首先一个运行队列中会有两个不同的队列,在这个队列中会有140个存放队列指针的数据,而我们只用后面的40——这个与上面的优先级相匹配,根据优先级,队列上面的进程根据优先级依次执行,这个是活跃队列的工作,而过期队列,存放的是新加入的进程,当活跃队列的进程都执行完毕之后,活跃队列和过期队列他们会交换,而交换的方式就是把他们指针所指向的位置进行交换,这里就体现出了他的效率性
我们在谈谈他是怎么遍历这些进程的,我们用位图来完成这个操作,比特位的位置表示一个队列,而比特位的内容表示这个队列是否为空。
3.环境变量
前言引入(main参数–命令行参数)
main函数也是有参数的,
main(int argc,char *argv[],char *env[])
argv为指针数组(命令行参数表),argc是数组中元素的个数,env就是环境变量表
我们先来谈谈前面两个参数
这里就容易看出来了,argc就是指针函数argv的参数个数,argv就是命令行参数表
结论:通过不同的选项实现不同的功能;命令行参数是linux指令选项的基础。
为了方便理解我们可以写一个实现加减乘除的代码来解释一些
void Usage(char *process)
{ printf("Usage:\n\t%s [add|sub|mul|div] x y\n\n",process);
}
int main(int argc,char* argv[])
{// ./myprocess [add|sub|mul|div] x y//实现+-*/四种运算if(argc!=4){Usage(argv[0]);}int x=atoi(argv[2]);int y=atoi(argv[3]);if(strcmp("add",argv[1])==0){printf("%d + %d =%d\n",x,y,x+y);}else if(strcmp("sub",argv[1])==0){printf("%d - %d =%d\n",x,y,x-y);}else if(strcmp("mul",argv[1])==0){printf("%d * %d =%d\n",x,y,x*y);}else if(strcmp("div",argv[1])==0){printf("%d / %d =%d\n",x,y,x/y);}else {printf("none\n");}
}
这就是通过不同的选项实现不同的功能。
3.1 环境变量
概念:
在操作系统中用来指定操作系统运行环境的一些参数
不是一个,而是一堆彼此之间没有直接关系。系统的环境变量,本质就是系统直接开辟空间,给他名字和内容即可。
3.2 PATH环境变量
echo $PATH:打印环境变量的路径
为什么我们自己写的程序不加路径无法被找到,还要加上./才行呢?
因为我们的命令没有被添加到bash路径中。
我们可以采用以下两种方法
3.3 系统指令查看环境变量
echo $[环境变量]
env
查看系统全面的环境变量
- 自己定义一个环境变量
export 【要定义的内容】
3.4用代码获取环境变量
刚刚在提到main函数的参数,第三个参数就是环境变量表,我们就可以把他打印出来
int main(int argc,char* argv[],char *env[])//命令行参数个数,命令行参数表,环境变量表
{for(int i=0;env[i];i++){printf("%d---------------------------------%s\n",i,env[i]);}return 0;
}
第二种使用 getenv