目录
- 一,进程切换
- 二,进程优先级
- 1. 什么是优先级
- 2. 权限 vs 优先级
- 3. 为什么要有优先级
- 4. 优先级的查看方式
- 三,命令行参数
- 1. 什么是命令行参数
- 2. 为什么要有命令行参数
- 3. 是谁做的
- 四,环境变量
- 1. 基本概念
- 2. 常见环境变量
- 3. 查看环境变量
- 4. 对环境变量的再理解
- 5. getenv和putenv
- 6. 内建命令
一,进程切换
在操作系统内部,进程切换是一个复杂的过程,在这个过程中CPU里的寄存器发挥了及其重要的作用:
如图,有两个进程:进程1和进程2
当进程1被CPU调度时,CPU中的所有寄存器会保留进程1的临时数据,CPU内部的所有的寄存器中的临时数据,叫做进程的上下文。
假设进程1的时间片到了,不再被调度了,进程1就会被剥离,此时会把寄存器中的上下文内容保存到pcb中,换上进程2。
但是我们要考虑进程1还会恢复啊,就要从上一次进程1运行到的地方继续执行。
结论:
进程在切换,最重要的一件事情是:上下文数据的保护和恢复!
对CPU内的寄存器的理解:
1. 寄存器本身是硬件,具有数据的存储能力,CPU的寄存器硬件只有一套!!
2. CPU内部的数据,可以有多套,有几个进程,就有几套和该进程对应的上下文数据。
3. 寄存器!寄存器的内容。
二,进程优先级
1. 什么是优先级
优先级:指定进程获取CPU资源的先后顺序。
1. 在运行队列的头部,进程的优先级较高,在队列尾部,优先级较低。
2. 优先级其实是进程中task struct进程控制块的若干个内部字段(属性)。
3. Linux中优先级数字越小,优先级越高。
2. 权限 vs 优先级
权限:能不能的问题
优先级:已经能了,而是获取资源的顺序问题
3. 为什么要有优先级
进程访问的资源(CPU)始终都是有限的。系统中的进程数量大部分情况都是有较多的。
操作系统关于调度和优先级的原则:
1. 现在使用的0S大部分是分时操作系统(基于时间片进行调度轮转),调度时要保证基本的公平。
2. 如果进程因为长时间不被调度,就造成了饥饿问题。
4. 优先级的查看方式
使用指令: ps -al
上图中有两个重要的数据:
使用 top 指令更改nice值,进而改变进程优先级:
进入top后按"r" -> 输入进程PID -> 输入nice值.
注意:
1. nice值不能让你任意调整,而是有范围的![-20,19],一共40个级别。
2. 每次调整优先级的值,都是从进程默认的优先级值开始的。
三,命令行参数
1. 什么是命令行参数
代码演示:
2. 为什么要有命令行参数
本质:命令行参数本质是交给我们程序不同的选项,用来定制不同的程序功能。
比如指令中会携带很多的选项。
代码演示:
3. 是谁做的
先说明一个前提:
父进程的数据,默认能被子进程看到并访问!
代码验证:
修改一下代码并且连续运行这个程序:
这个id是1246790的进程是谁啊?
结论:
1. 命令行中启动的程序,都会变成进程,这些进程都是bash 的子进程。
2. 所以上面图中的"./myprocess”(路径+程序名称),默认是输入给父进程bash的。
这个bash会对命令行字符串进行解释,从而生成那个char * argv[] (那张表)而子进程是可以看见那张表的,进而把它们作为参数。
四,环境变量
1. 基本概念
1. 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
2. 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
3. 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。
2. 常见环境变量
PATH : 指定命令的搜索路径 。
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)。
SHELL : 当前Shell,它的值通是/bin/bash。
我们以PATH变量为例,对环境变量进行理解:
查看环境变量里的内容,使用指令:
echo $环境变量
系统中很多的配置,在我们登录Linux系统的时候,已经被加载到了bash进程中(内存)。
查看PATH环境变量,会出现很多路径,这些路径以冒(:)号为分隔符。
整个长串,表示的是: bash在执行命令的时候,因为要把命令的二进制文件加载到内存,所以需要先找到命令,这一长串就是bash内部维护的命令的默认搜索路径(会依次搜索)。
所以现在我们可以知道,为什么在使用指令(1s,pwd…)的时候可以不用加路径,因为它们所在的路径 /usr/bin 是在 bash 的环境变量中的。
这里演示方式2:
结论:
1. 直接对PATH变量进行赋值会直接覆盖原有的内容!
2.P ATH这种环境变量是内存级的,如果不小心直接把它覆盖了,不用担心,关闭Xshe1l,重新启动又会恢复!!
正确的把指定路径添加到环境变量的操作:
注意:
(1) 最开始的环境变量不是在内存中,而是在系统的对应的配置文件中!
(2) 在我们登录Linux系统的时候,这些文件会被加载到了bash进程的上下文中,所以要想永久修改环境变量,就要修改这些配置文件!
其他环境变量的使用:
3. 查看环境变量
查看系统的所有环境变量,使用指令:env
也可以自定义环境变量:
导入一个环境变量,使用指令:
export 环境变量=内容
取消自定义环境变量,使用指令:
unset 环境变量
4. 对环境变量的再理解
首先看一下系统定义的一个全局环境变量:
用代码打印出环境变量:
结论:
那些环境变量,默认在bash内部,./myprocess
是bash的子进程,所以环境变量也是可以被子进程拿到的!!
原理如下:
结论:
bash进程启动的时候,默认会给我子进程形成两张表:
1.argv[]命令行参数表:来自用户输入的命令行
2.env[]环境变量表:来自0S的配置文件
bash通过各种方式把这两张表交给子进程!!!
所以,既然可以把命令行参数表传给main函数,那传环境变量表当然也可以。
第二种打印环境变量的方式:
(注:main函数最多传三个参数)
5. getenv和putenv
环境变量具有系统级的全局属性,因为环境变量本身会被子进程继承下去。
getenv: 根据环境变量名,直接拿到一个环境变量内容
使用man手册查看:
使用方式:
putenv: 改变或增加一个环境变量
6. 内建命令
子进程导入一些数据和对数据的修改是不会被父进程看见的,因为进程具有独立性。