承接进程概念内容,本篇博客是进程概念这模块最后一篇文章。
目录
1.环境变量
2.程序地址空间
2.1总结
3.内存管理方式
3.1分段式内存管理
3.2分页式内存管理
3.3段页式内存管理
概念:保存当前程序运行参数的变量。
优点:即时生效,让运行环境配置更加灵活;(用过环境变量可以给运行中的程序传递数据)
终端shell中的变量存在两种:环境变量和普通变量。
环境变量具有进程直接共有的特性,当普通变量没有。
在了解程序地址空间之前,我们需要明白内存地址空间的内容:对内存区域的编号(以字节为单位)。
比起称呼为程序地址空间,其实称呼为进程地址空间更加贴切,因为运行起来的程序才会占据内存。
一份程序的地址空间的分配如下图大概所示:
这部分空间便是我们的用户空间,在这份空间之上还存在内核空间。
然后我们来看一段代码及它的运行结果:
从这段代码出发,我们可以很清楚的看出,对于变量a,呈现出两种不同的值,并且加以打印a的地址后,我们发现明显是同一个块地址。
而对于同一块地址,怎么会打印出两种不同的值?这很明显是有违常理的,所以这便是我们接下来要进行介绍的内容:一个进程中,所访问到的所有变量地址都是操作系统所描述的一个虚拟地址,并非真正的物理地址。
虚拟地址的出现,有其特地的价值。因为在实际存储中,如果直接以进程存储到实际中的物理地址之中,由于进程的存储大多是连续的,所以直接在硬件上存储的话,也需要开辟连续的地址空间。
这就导致一个问题的产生:每一个进程都需要自己的连续空间,物理地址上被不断开辟连续空间,会造成其余不连续的空间无法使用。
如此存储,很明显的会造成硬件使用率不够完全,造成很严重的资源浪费问题,所以推出了一个概念叫做虚拟地址。
虚拟地址的作用便是:进程在其上开辟连续的空间,可以使得进程在虚拟地址上以连续空间存储,而实际上并非在实际的物理地址上连续,并建立虚拟地址和物理地址之间特殊的映射关系,使进程存储的内容不丢失。
这样进行操作很直观的好处:满足了进程对连续空间的需求,尽可能完全了使用了硬件的存储空间,提高碎片化内存利用率,并且实现了内存访问的控制。
对于虚拟空间,它的本质其实是一种结构体(mm_struct),描述了一份地址的起止和变量……
对于程序地址空间,其实是操作系统为每一个进程描述的一个虚拟地址空间,进程中每个变量的地址都是虚拟地址,虚拟地址经过页表映射之后,得到物理地址,进而访问物理地址。
对于内存管理方式存在三种管理方式:
内容:将一个整体的地址空间划分为多个段(代码段、数据段、堆区、栈……)
作用:更加利于编译器对地址的管理
重要的两个要素:段表和地址组成;虚拟地址组成:段号和段内的偏移量;段表:是一种数据结构,其中描述的信息,段号,物理内存的一个起始地址。
于是通过虚拟地址中的段号可以在段表中查询到对应的物理内存起始地址,其中的物理内存起始地址加上段内偏移量,便是该内容真正的物理内存。
内容:将一个整体的地址空间划分为大量的小的分页page(当前一般默认是4096字节为一页)
作用:实现数据的离散存储,提高内存的利用率
重要的两个要素:页表和虚拟地址;页表:页号,物理内存起始地址,缺页位中断位,访问权限位……
通过虚拟地址中的页号,在页表中找到对应的页表项,得到一个物理内存块的起始地址,加上页内偏移量就是实际的访问位置。
和分段式不同的地方在于应用方向不同,分段式利于地址管理,分页式更加倾向于碎片化管理,提高内存利用与内存访问控制。
内容:详见地址空间进行分段,然后在每个分段内使用分页进行管理(集合了分段式和分页式内存管理的优势)