进程优先级
基本概念
CPU资源分配的先后顺序就是进程的优先权,优先权存在的原因是因为CPU资源有限,
查看系统进程
- UID:执行者身份
- PID:进程代号
- PPID:父进程代号
- PRI:进程的优先级,值越小优先级越高
- NI:进程的nice值
PRI && NI
PRI,是进程的优先级,其值越小进程的优先级越高;NI,nice值,表示进程优先级的修正数值;PRI值越小越先被执行,加入NI之后,PRI(new)=PRI(old)+nice,PRI(old)值为80;调整优先级的也就是调整nice值;nice的取值范围是(-20,19)
top命令更改已存在进程的nice
- sudo top
- r->输入PID->输入待修改的nice值
将nice修改为-10,结果如下
其他概念
竞争性:系统进程数目众多,而CPU只有少量,甚至1个,所以进程之间具有竞争性;为了高效完成任务,更合理地竞争相关资源,便具有了优先级
独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行:多个进程在多个CPU下,同时进行运行,称之为并行
并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
环境变量
基本概念
环境变量,操作系统为了满足不同的应用环境,而预先在系统内设置了一大批全局变量,这些变量在整个系统中可以被其他进程访问
环境变量是指在操作系统中用来指定操作系统运行环境的参数,通常具有特殊用途,在系统中具有全局特性
如果要执行一个程序或指令,需要先找到,然后再执行
举个栗子:
执行mytest.c,需要先进行make指令,然后在当前的目录中执行程序
从上面的指令行中会发现一个疑问:为什么在最后执行程序时,是./后加路径;而在执行ll指令时前面却什么都不加,并且二者都是可执行程序,这是为什么呢???
Linux操作系统安装指令的路径中所包含的指令,一般是在默认搜索路径下进行的,默认情况下不需要加任何有关路径; ./代表当前路径,是为了让系统找到程序,并执行它
可以将./test指令也放到系统安装指令中,这样其也会变成默认的
sudo cp 指令 /usr/bin
通常不建议这样操作,可能会污染系统的指令池
建议采取环境变量PATH的方式,系统之所以可以找到指令,是因为PATH是系统的命令搜索路径:
每个:之间的是系统默认的搜索路径,指令会先在第一条路径中寻找,找不到换下一条路径,依次类推
将指令放到默认搜索路径中: export PATH=$PATH:指令所在路径
常见环境变量
PATH:指定命令的搜索路径
上面便是系统默认的搜索路径
HOME:指定用户的工作目录(登录Linux时默认的目录)
USER:标识当前Linux用户
这里通过指令来获取的Linux用户,接下来尝试使用函数来获取Linux用户
char *getenv(const char *name);
该函数可以搜索环境变量,返回指向变量的指针
USER最大的意义是:可以表示当前Linux的使用用户;将上面的代码进行修改,进一步体现USER的意义
程序本身就是进程,mycmd也会变成进程并且是程序的子进程;环境变量具有全局属性,所以mycmd会继承USER的属性
SHELL:命令行解释器,当前shell,值为 /bin/bash
环境变量相关命令
echo:显示环境变量值
export:设置新的环境变量
env:显示所有环境变量
unser:清除环境变量
set:显示本地定义的shell变量和环境变量
查看环境变量
指令获取
echo $name //name 环境变量名称
为什么同样是显示环境变量,第一个可以,第二个却不行呢???
其实是因为,val并不是环境变量,而是本地变量,所以第二个并不会打印;也可以采用上面指令的方式进行验证
既然val不是环境变量,那就将其转化为环境变量;export val
./mycmd,就是进程;bash就是一个系统进程, ./mycmd也就是它的子进程,由于环境变量具有全局性,也就继承了bash的环境变量
val=1,本质是本地变量,只能在当前进程内有效
环境变量的组织方式
命令行参数
argc表示命令行中指令的个数;char *argv[]是指针数组,用来指向命令行中的数组
对代码进一步更改
再次观察是不是与指令后加选项一模一样,本质上就是这样的
通过代码获取环境变量
采用命令行方式获取环境变量
这里的 char*env[]指针数组指向的不是命令行,反而是系统中的环境变量,通过指针可以将全部环境变量打印出来
结果如下: