环境变量、程序地址空间

环境变量、程序地址空间



一、环境变量

环境变量:也是一种变量,是一种保存系统运行环境参数的变量;便于运行环境参数的配置,进程之间的数据通信(子进程的环境变量就是从父进程而来的)
命令操作:env-查看环境变量,set-查看所有变量,echo-查看指定变量,export-设置环境变量,unset-删除环境变量
典型环境变量:
  PATH:程序运行的默认搜索路径–在命令行终端中输入命令名称可以直接执行对应名称的命令程序,实际上是因为shall捕捉到输入的命令名称之后,然后去PATH环境变量指定的路径下去找这个程序,找到了就运行,找不到就报命令没有找到的错误
env:查看环境变量
在这里插入图片描述
环境变量接口:

char *getenv(const char *name);--通过名称获取值;
int setenv(const char *name,const char *value,int overwrite);/int putenv(char *string);

代码如下(示例):

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 int main()
  5 {
  6     char *env1 = getenv("MYVAL1");
  7     if(env1 == NULL){
  8         printf("not fount MYVAL1\n");
  9     }else{
 10         printf("%d\n",env1);
 11     }
 12     char *env2 = getenv("MYVAL2");
 13     if(env2 == NULL){
 14         printf("not fount MYVAL2\n");
 15     }else{
 16         printf("%d\n",env2);
 17     }
 18     while(1)sleep(1);
 19     return 0;
 20 }

其父进程为bash程序
在这里插入图片描述
铺垫:shell中运行的程序,父进程都是shell;或者反过来说,shell中运行的进程都是shell的子进程
代码如下(示例):

getenv()extern char**environ;    main(int argc,char*argv[],char*env[]);

main函数有三个参数–程序运行参数的个数,程序运行参数字符串地址,环境变量的字符串地址

二、程序地址空间

地址:通常所说的地址,都是内存的地址,是内存单元的编号

实际上在进程中,程序访问的这些地址(变量地址)实际上是一个假地址将其称之为–虚拟地址;
我们所说的程序地址空间实际上叫做进程的虚拟地址空间
虚拟地址空间实际上是系统给进程所描述的一个假的地址空间,是一个mm_struct结构体
并且每个进程都有自己独立的虚拟地址空间–也就是有自己的mm_struct内存描述

系统会为每一个进程都描述一个假的地址空间,进程访问的都是虚拟地址,访问内存数据的时候,先将虚拟地址转换为物理地址然后访问
系统为每个进程都描述一块完整的,连续的,线性的虚拟地址空间,实际物理内存用的时候再给进程分配,这样的话,对于每个进程自己的感觉,看起来都有一块完整的连续的内存可以使用
给每个进程虚拟一个地址空间,让进程访问完整连续的地址,但是这些虚拟地址在使用的时候通过页表映射一块物理内存地址,进行访问物理内存,通过映射的这种方式,实现了数据在物理内存上的离散式存储,提高内存利用率

在这里插入图片描述
总结:
    虚拟地址空间,是系统为每个进程通过mm_struct结构体虚拟的一个地址空间,使用虚拟地址空间的目的是为了让进程能够访问一块连续的,完整的地址,并且经过页表映射到物理内存之后,可以实现数据在物理内存上的离散式存储,提高内存利用率,并且在页表中可以进行内存访问控制。

虚拟地址如何通过页表获取物理地址的呢???
内存管理方式:
  分段式内存管理:将地址空间分为多段(代码段,数据段…)便于编译器进行地址管理
  分段式虚拟地址组成:段号+段内的地址偏移量;在系统中有一个段表:一个个段表项(段号,物理内存段起始地址)

在这里插入图片描述
分页式内存管理:将地址空间分为多个小块(页),实现数据离散式存储,提高内存利用率
  分页式虚拟地址组成:页号+页内偏移量;在系统中有一个页表(页号,物理内存块起始地址,权限控制,缺页中断位…)

在这里插入图片描述
段页式:将虚拟地址空间进行分段,在每个分段内进行分页式管理,集合了分段分页的优点进行内存管理缺页中断:缺页中断表示当前地址要访问的数据不在物理内存中。交换内存:当物理内存不够使用的时候,则将物理内存中不活跃的数据,保存到磁盘的交换分区中,腾出的物理内存可以给新的程序数据使用什么样的数据是不活跃的数据,或者说应该把那些数据放在交换分区上?
最久未使用–LRU,最少未使用

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李憨憨_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值