目录
一、进程优先级
- cpu资源分配的先后顺序,就是指进程的优先权(priority)
- 优先权高的进程有优先执行的权利。配置进程优先权对多任务环境的 Linux 很有用,可以改善系统性能。
- 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。
1.1 查看系统进程
在Linux系统中,使用ps -l 命令则会类似输出以下几个内容:
我们很容易注意到其中的几个重要信息,如下:
- UID:代表执行者的身份。
- PID:代表这个进程的代号。
- PPID:代表这个进程是由哪个进程发展衍生而来的。亦即父进程的代号。
- PRI:代表这个进程可被执行的优先级,其值越小越早被执行。
- NI:代表这个进程的 nice 值。
1.2 PRI 和 NI
- PRI 也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被 CPU 执行的先后顺序,此值越小,进程的优先级别越高。
- NI即我们呢所要说的 nice 值了,其表示进程可被执行的优先级的修正值。
- PRI 值越小越快被执行,那么加入 nice 值后,将会使得 PRI 变为:PRI(old)+nice。
- 而 PRI(old) 总为 80。所以我们修改优先级其实只是给操作系统一个优先建议,并不是绝对的调整。
- 这样,当 nice 值为负值的时候,那么该程序将会将优先级变小,即其优先级会变高,则其越快被执行
- 所以,调整进程优先级,在Linux下,就是调整 nice 值。
- nice 其取值范围是 -20至19,一共40个级别。
使用 top 命令更改已存在进程的 nice 值
- 输入 top
- 输入 r -->输入进程 pid --->输入 nice 值
其他概念
- 竞争性:系统进程数目众多,而 CPU 资源室友少量,甚至一个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
- 独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。
- 并行:多个进程在多个 CPU 下分别,同时进行运行,这称之为并行。
- 并发:多个进程在CPU下采用进程切换的方式,在一段时间内,让多个进程都得以推进,称之为并发。
二、环境变量
- 环境变量:一般是指在操作系统中用来指定操作系统运行环境的一些参数
- 如:我们在编写 C/C++ 代码的时候,在链接的时候,从来不知道我们所链接的动静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
- 环境变量通常具有某些特殊用途,还有在系统中通常具有全局特性。
2.1 常见环境变量
- PATH: 指定命令的搜索路径
- HOME:指定用户的主工作目录(即用户登录到 Linux 系统中时,默认的目录)
- SHELL:当前 Shell ,它的值通常是 /bin/bash。
查看环境变量方法:
echo $name //环境变量名称。
测试 PATH
首先我们先创建一个 hello.c 文件
这时,我们会发现,如果执行我们的 test.c 文件
会带上./ 才能成功运行,而一些系统的命令,我们不需要带路径,就可以直接进行运行。
如果我不想带上路径呢,执行我生成的可执行文件跟我系统文件一样可以直接运行呢?
查看环境变量的方法:
echo $NAME //NAME:你的环境变量名称
set 命令
我们系统中的可执行文件为什么可以直接执行?
比如 ls 命令,直接就可以执行。
因为 ls 在 PATH 的众多路径下,所以我们执行 ls ,就会去这些目录下找,如果找到了,就可以直接执行。
所以,我们要做的就是把 test 文件所在的路径添加到 PATH 环境变量中,这样就不用在 test 之前加上 ./ 了
这样,我们当前目录的环境变量就设置好了。
2.2 环境变量相关的命令
- echo:显示某个环境变量值
- export:设置一个新的环境变量
- env:显示所有环境变量
- unset:清除环境变量
- set:显示本地定义的 shell 变量和环境变量
环境变量的组织方式
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个'\0'结尾的环境字符串
2.3 通过代码获取环境变量
- 命令行第三个参数
- 通过第三方变量 environ 获取
但是我们通常不会使用上面的两种方法。因为其打印的最终是字符串,我们可以使用更为简单的函数。
直接使用 getenv 获取我们所需要的环境变量
2.4 环境变量的全局性
但是这里有一个问题,这里的环境变量是谁给我们提供的
答案是:这些是环境变量是由父进程那继承而来的。
例如,我们往 bash 中导入一个环境变量 然后查找该环境变量
因为bash是当前执行文件的父进程。证明如下:
所以,我们可以在当前 bash下 的文件中获得该环境变量。 默认环境变量默认就是 bash 下的变量
所以,得出以下三个结论
- 子进程的环境变量是从父进程而来的
- 默认,所有环境变量都会被子进程继承
- 环境变量通常是具有全局属性的 (本质是子进程进行了继承)。
我们现在直接在命令行中输入一个变量。
这样,一个变量 brant 就定义出来了,此时上面的 brant 是一个局部变量。
单单使用 echo 是无法显示的变量名的。
此时我们可以使用 set 命令将变量列出
set 的作用是显示所有的环境变量和局部变量
得出一个结论:
在命令行中我们可以定义两种变量,一种是局部变量,一种是环境(全局)变量。
而加上 export 就可以将其设置为环境变量。
关于环境变量的设置,我们每次登录系统都会重新为我们创建一个 bash ,只要我们不更改配置文件的中设置,在当前会话中是可以随意设置环境变量的。所以,建议大家大但尝试。
三、命令行参数
命令行参数:即在命令行执行程序时,传入的选项。
在上面我们知道了 env 是环境变量,那 main 函数中前两个参数是干什么的呢?
我们先写这样一段代码,来看看 main()函数中的前两个参数有什么用处.
然后我们根据提示,输入选项。
看上面的现象可能并不知道这个参数有什么用 我们看一下下面的代码,就能发现添加选项的作用:
所以,命令行参数最大的作用就是可以让我们通过输入不同的选项来执行不同的子功能。