1.环境变量
变量是计算机系统用于保存可变值的数据类型,我们可以直接通过变量名称来提取到对应的变量值。在 Linux 系统中,环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家(HOME)、邮件存放位置(MAIL)等。(注:Linux 系统中环境变量的名称一般都是大写的,这是一种约定俗成的规范。)
常见环境变量
PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL :当前Shell,它的值通常是/bin/bash。
Linux 系统能够正常运行并且为用户提供服务,需要数百个环境变量来协同工作,但是,我们没有必要逐一学习每个变量,这里给大家列举了 10 个非常重要的环境变量,如表 1 所示。
1.1查看环境变量
echo $NAME //NAME:你的环境变量名称
如果想让我们的程序也不用带路径就直接运行可以将我们文件的位置放到环境变量下:
export PATH=$PATH:/usr/local/bin
#配置完后可以通过echo $PATH查看配置结果。
#生效方法:立即生效
#有效期限:临时改变,只能在当前的终端窗口中有效,当前窗口关闭后就会恢复原有的path配置
#用户局限:仅对当前用户
查看所以的环境变量:
env
和环境变量相关的命令
- echo: 显示某个环境变量值
- export: 设置一个新的环境变量
- env: 显示所有环境变量
- unset: 清除环境变量
- set: 显示本地定义的shell变量和环境变量
环境变量的组织方式
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
1.2 通过代码如何获取环境变量
- 命令行第三个参数
- 通过第三方变量environ获取
通过系统调用获取或设置环境变量
putenv
getenv
注意:子进程的环境变量都是从父进程来的,且默认子进程会继承父进程的所以环境变量。
2.程序地址空间
通过以下代码我们可以测试以下地址的排列是不是正确
注意:上面这个不是真的内存!!! 它是进程虚拟地址空间。
下面验证一下:
运行结果
我们发现,输出出来的变量值和地址是一模一样的,很好理解呀,因为子进程按照父进程为模版,父子并没有对变量进行进行任何修改。
可是将代码稍加改动:
运行结果:
我们发现,父子进程,输出地址是一致的,但是变量内容不一样!能得出如下结论:
- 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量
- 但地址值是一样的,说明,该地址绝对不是物理地址!
- 在Linux地址下,这种地址叫做 虚拟地址
- 我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理
- OS必须负责将 虚拟地址 转化成 物理地址
2.1 进程地址空间
程序的地址空间准确的应该说成 进程地址空间
在这里插入图片描述
为什么要有地址空间:
1.通过添加一层软件层,完成有效的对进程操作内存进行风险管理(权限管理), 本质的目的是为了保护物理内存已经各个进程的数据安全。
2.将内存申请和内存使用的概念在时间上划分清楚,通过虚拟地址空间,来屏蔽底层申请内存的过程,达到进读写内存和OS进行内存管理操作,进行软件上面的分离。
3.站在CPU和应用层的角度,进程可以统一看做统一使用4GB的空间,而且每个空间区域的相对位置,是比较确定的!
2.2活动队列 & 过期队列
活动队列:
- 时间片还没有结束的所有进程都按照优先级放在该队列
- nr_active: 总共有多少个运行状态的进程
- queue[140]: 一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以,数组下标就是优先级!
- 从该结构中,选择一个最合适的进程,过程是怎么的呢?
从0下表开始遍历queue[140]
找到第一个非空队列,该队列必定为优先级最高的队列
拿到选中队列的第一个进程,开始运行,调度完成!
遍历queue[140]时间复杂度是常数!但还是太低效了!
- bitmap[5]:一共140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个比特位表示队列是否为空,这样,便可以大大提高查找效率!
过期队列
- 过期队列和活动队列结构一模一样
- 过期队列上放置的进程,都是时间片耗尽的进程
- 当活动队列上的进程都被处理完毕之后,对过期队列的进程进行时间片重新计算
2.3 active指针和expired指针
- active指针永远指向活动队列
- expired指针永远指向过期队列
- 可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直都存在的。
- 在合适的时候,只要能够交换active指针和expired指针的内容,就相当于有具有了一批新的活动进程!