一. 环境变量:
- 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数;
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。 - 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。
- 常见环境变量:
PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash - 作用:
- 通过环境变量配置系统运行环境参数可以使系统环境配置起来更加灵活。
- 可以通过环境参数给一个进程传递参数。
二. 操作指令:
env : 查看所有的环境参数
set : 查看所有的变量
echo : 打印指定变量的的值
export : 声明一个环境变量
unset : 删除一个变量
int main( int argc ,char* argv[] ,char* env[]) :
argv : 保存程序运行参数;
env : 保存环境变量;
argv : main函数的命令行参数的个数。
extern char** environ ; 使用全局变量;
char* getenv( const char* name); 通过指定的名字获取环境变量的值。
三. 虚拟地址内存管理:
先看一段代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{
pid_t id = fork();
if(id < 0)
{
perror("fork");
return 0;
}
else if(id == 0){ //child,子进程肯定先跑完,也就是子进程先修改,完成之后,父进程再读取
g_val=100; //修改
printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
}
else{ //parent
sleep(3);
printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
}
sleep(1);
return 0;
}
运行结果:
可知,父子进程,输出地址是一致的,但是变量内容不一样:
- 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量,但地址值是一样的,说明该地址绝对不是物理地址。
- 在Linux地址下,这种地址叫做虚拟地址。
- 我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理。
虚拟地址空间与物理空间:
常见的虚拟地址管理方法:
- 分页式:内存地址 = 段号 + 段内偏移量;
- 分段式:内存地址 = 页号 + 页内偏移量;
- 段页式:将内存地址先进行分段管理,再在每个段里进行分页式管理。
- 虚拟地址组成:段号 + 段内页号 + 段内偏移量;
注意:
- 虚拟地址空间:操作系统为进程描述的一个连续的,完整的地址空间—mm_ struct。
- 每个进程都有自己独立的虚拟地址空间,访问的都是虚拟地址,
- 但是可以通过页表将虚拟地址映射转换为物理内存地址,进而访问物理内存区域。
- 通过页表映射转换实现了数据在物理内存中的离散式存储-提高了内存利用率。
- 通过页表中进行地址访问限制,实现了内存访问的控制
- 并且每个进程都有独立的虚拟地址空间,访问的都是自己的虚拟地址,因此进程之间具有独立性。