进程(二)----环境变量、地址空间访问

进程优先级:一个进程对与CPU资源获取的优先权

为什么要有优先级?(让操作系统运行的更加良好)
交互式进程:直接与用户进行交互的进程,(要求最好能够更加有限的被CPU处理)。
批处理进程:在后台默默做循环工作的进程。
环境变量:配置系统运行环境参数的变量。
环境变量优点使系统运行环境配置更加简单灵活,可以通过设置环境变量给一个进程传递参数信息。(不用再去修改配置文件,重新加载配置文件,而是直接设置直接生效)

环境变量的操作

查看环境变量:env/set(查看所有变量,包含环境变量)/echo直接打印某一环境变量
设置环境变量:export
删除环境变量:unset
环境变量是具有继承性的:子进程也拥有父进程的环境变量
典型:PATH- - - - -系统命令程序的默认搜索路径

代码中环境变量的操作

  • main函数的第三个参数 int main(int argc,char *argv[ ],char *env[ ])…env保存环境变量
  • 通过一个全局变量eexern char **environ;…environ保存环境变量
  • char *getenv(const char *name);…通过环境变量名称获取一个指定环境变量的数据

变量的声明:就是告诉编译器,有这个变量的存在(但是这个变量不一定是我们自己定义的,这个声明使用的变量通常是一个本文件之外的全局变量 a.c / b.c)
变量的定义:告诉编译器这个变量是什么样子的
exetrn char **enciron;在本文件中声明有这个变量/然而这个变量的具体内容实际上是外部的,是标准库中存的。

程序地址空间

地址:对内存单元的编号
程序时不占用内存的,运行起来的程序被加载到内存,才会占有内存。

  • 进程地址空间- - - -一个全局变量,在子进程中修改后,打印100,但父进程中依然打印1, 数据不同,表示肯定没有使用同一块内存空间(一块内存空间不可能存储两个数据),父子进程打印的数据不同但是地址却是相同的- - - - - 矛盾
  • 实际上进程中访问的地址都是虚拟地址,而我们所说的程序地址空间实际上是一个进程的虚拟地址空间;
    虚拟一个地址空间:其实就是一个结构体 mm_struct;- - - - - 是一个对内存空间的描述- - - - -通过这个描述向进程虚拟出一个完整的、连续的内存空间;为了能够直接访问物理内存
    size :示内存大小
    code_start/code_end:描述代码段的起始与结束,通过这两个信息就可以描述一块空间。

进程直接访问物理内存:

  • 1、进程中的代码使用都是连续的地址,若直接使用连续的物理内存会造成内存的浪费;
  • 2、直接访问物理内存会因为缺乏内存访问控制导致进程的不安全。
    进程(二)----环境变量、地址空间访问

如何通过虚拟地址访问物理内存?

  • 操作系统为进程创建mm_struct虚拟地址空间的同时,也创建了一个页表用于映射虚拟地址与物理地址的关系;
  • 进程使用虚拟地址空间,通过页表映射物理内存,可以实现进程中数据在物理内存上的离散式存储,通过这种方式提高内存的利用率;
  • 在页表中可以直接针对某个地址设置,这个地址的访问权限(这个地址是只读的),通过这种方式实现内存访问控制

为什么要使用虚拟地址空间?

  • 这些虚拟地址最终通过页表映射到物理内存上实现数据离散式存储(提高内存访问率);
  • 在页表中实现内存的访问控制。