目录
进程优先级
概念
进程优先级是指进程访问资源(cpu)的优先级顺序。
存在意义:进程访问的资源是有限的,而进程通常是大量的。有些进程是需要优先被执行的,通过修改优先级就可以提高系统的性能。
查看优先级
Linux中PRI表示优先级,PRI越低优先级越高。
ps -l:可以查看进程PRI
- UID : 代表执行者的身份
- PID : 代表这个进程的代号
- PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
- PRI :代表这个进程可被执行的优先级,其值越小越早被执行
- NI :代表这个进程的nice值
修改PRI不能直接修改,需要修改NI来间接修改PRI。每个进程的PRI初始都是80,但NI可能不一样,最终PRI的值==80+NI的值。这样做是因为修改优先级时进程可能正在cpu的调度队列中或正在被调用,修改优先级会影响到时间片,而时间片又会影响cpu的调度,所以修改NI后进程的优先级不会立即更改,会在本轮调度后被修改。
修改优先级
创建一个进程来修改。
top进入一个展示进程使用资源的地方(类似于windows的任务管理器),输入r->输入NI的值,就可以修改进程优先级。
top后输入r
NI修改为10
ps加a选项才可以查看用户的进程。PRI的值变为了90,也就是80+10。NI的值是有范围的-20至19,40个级别,如果修改值超出范围就会取边缘的值(-20或19)。
命令行参数
是什么
我们写代码的main函数是有参数的:int main(int argc, char* argv[])。argv是一个字符串的数组,argc是这个字符串的个数。我们在Linux中编译好代码,执行二进制文件会在命令行上输入 ./[文件名] 来运行,argv存放的就是我们在命令行上输入的内容。
测试
可以看到argv内存放着命令行参数的内容,argv在上面的代码中其实不只有一个元素,它在存放命令行内容后又多加了一个NULL指针,通过代码来查看。
作用
执行代码时我们也可以加入选项
argv会以空格来分割字符串,这其实就和我们使用的指令十分相似,我们通过不同的选项让argv拿到不同的值,执行不同的功能。
最简单的if else代码功能:
argv和argc的数据是从哪里来的?
命令行是由bash提供的,我们创建的进程也是由bash来创建的。在命令行输入执行程序命令,bash就会创建一个argv来存放字符串,上一篇内容里提到过父进程的数据是可以被子进程访问到的,所以进程中main的参数是由父进程提供的。
环境变量
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。它的功能是让用户在执行一些操作(进程)或拿到操作系统的某些数据时,不用看到底层的实现,快速完成这些操作(如我们使用的指令,本质都是在执行进程)。
PATH
指令中70%都是c代码,但我们在执行这些进程和我们自己写的进程时是不一样的。执行指令只需要文件名即可,执行自己写的程序就需要带上路径。那现在我们想要将自己的代码和指令一样只需要文件名就可以执行,要如何办到?
是什么
PATH是一个环境变量,它的作用是指定指令的搜索路径。
echo $[环境变量]:查看环境变量的内容。
我们常用的指令在/usr/bin目录下,而PATH中也有/usr/bin目录(PATH内的路径以:为分隔符),接下来来验证这一点。
修改环境变量
修改环境变量十分简单,直接拿变量名赋值路径即可。
这里直接赋值我们的当前路径,结果PATH内就只有当前的这一个路径,想要拿回原本的内容直接重新登录就可以。
这是因为环境变量是内存级的,它的数据都是默认在配置文件中,在每次登录时bash会从配置文件中获取环境变量的信息放到内存里。
现在我们在运行myprocess就不需要指定路径了,因为bash会在PATH内的路径去寻找可执行程序。现在虽然myprocess可以当作指令使用,但只能在这回登录使用下回登录就不存在了,要想让他一直存在就需要在配置文件里添加当前路径。配置文件:~/.bash_profile
现在重新登录也可以直接运行myprocess
env
env:查看所有环境变量
PWD:记录当前目录的路径,pwd指令就是直接使用的这个环境变量。
将PATH赋值为空依旧可以执行pwd。
HOME:保存当前用户的家目录,于 ~ 一样。
通过上面三个环境变量可以更直观的感受到,环境变量就是让我们快速的执行一些可执行程序或拿到一些数据,更加方便对操作系统的使用。
添加和删除环境变量
export [环境变量]=[内容]:添加一个本地环境变量。
unset [环境变量]:删除环境变量
本地变量:不加export添加的就是本地变量
本地环境变量只能使用set来查看。
set:显示本地定义的shell变量和环境变量
本地变量想变为环境变量,直接export [本地变量名]就可以。
组织方式
bash是从配置文件中获取的环境变量,然后放在一个字符数组(environ)内组织起来。
可以看出它的组织方式于main函数的argv是一样的,同样的main函数也可以获取它,因为子进程可以访问到父进程的数据。
我们也可以不使用声明的方式,环境变量是main的第三个参数。
通过上的代码测试可以反映处两点,一是环境变量是具有全局属性的,它可以被子进程继承;二是子进程是无法看到本地变量,本地变量独属于bash。