微信公众号和微网站,亚运会110周年庆典在杭州举行,wordpress模板怎么修改页面内容,网站建设与程序编辑目录
预备知识
进程地址空间
什么是进程地址空间
为什么要存在进程地址空间和页表
缺页中断 预备知识
我们在学习语言的时候#xff0c;一般都会了解到内存区域划分#xff0c;下面了解一下Linux的内存区域划分。 通过上图#xff0c;我们了解到 1、堆区向上增长…目录
预备知识
进程地址空间
什么是进程地址空间
为什么要存在进程地址空间和页表
缺页中断 预备知识
我们在学习语言的时候一般都会了解到内存区域划分下面了解一下Linux的内存区域划分。 通过上图我们了解到 1、堆区向上增长栈区向下增长。 2、环境变量和命令行参数无论是表还是内容都在栈区的上面。 3、先有命令行参数表再有环境变量。 在Linux中每次打印的地址都一样windows每次访问地址都是随机的。而Linux是一样的。 静态变量只初始化一次(默认初始化)并不随函数的调用而释放一般在初始化数据区域中。 从系统的角度来看语言中定义的静态变量(不论是全局还是局部)已经是全局变量了只是局部的静态变量受到作用域限制本质上程序运行期间一直存在的因为程序运行期间代码和数据会一直伴随着。 进程地址空间
我们来看一个现象 同一个地址通过不同进程去访问得到两个不同的值。
说明这个地址是虚拟地址(线性地址)而非物理地址。
编程语言中的地址都是虚拟地址。
我们在学习语言时了解到的内存分区实际上不是内存而是进程地址空间。 每一个进程都要有进程地址空间。 程序变为进程后每一个进程都有进程地址空间与语言无关。所有编译型语言都必须符合此规则(每个进程都要有进程地址空间)。
首先我们解决一下这个问题 通过研究发现每一个进程在创建的时候操作系统都要为其维护一个专属的进程地址空间再通过一种哈希映射的思想维护一张表用来将操作系统从进程处拿到的虚拟地址转化为物理地址再通过物理地址去访问数据。 这样的设计方式也可以解释为什么fork创建子进程后为什么返回值可以让父子进程不同本质是父子进程各自的映射表中将同一个虚拟地址映射到两个不同的物理内存中去。 进程task_struct代码和数据
task_struct是每个进程独有的代码是只读的数据修改时可以写时拷贝所以进程是独立的。
什么是进程地址空间 进程地址空间本质就是特定的内核数据结构对象。 每一个进程都会拥有一个进程地址空间。 在32位操作系统下进程地址空间的大小是[04GB]。 操作系统通过先描述,再组织的方式管理进程的地址空间。 进程地址空间本质就是数据结构节点Linux中此节点名称为mm_struct。 mm_struct中记录该进程地址空间的字段通过这些字段来做区域划分管理每个区域的变化。
区域内的各个地址空间都可以使用。
代码和数据都存储在物理内存中进程地址空间中的都是虚拟地址。
上述图中的哈希映射表称之为页表。 一个程序要运行时首先创建PCB处理好PCB内部信息比如pid、优先级、进程地址空间。然后将代码和数据加载到内存中操作系统要访问数据时通过该进程的进程地址空间拿到虚拟地址利用页表将虚拟地址转化为物理地址通过物理地址拿到数据。 其中CPU内部的CR3寄存器存储页表的物理地址MMU硬件单元管理着整个映射地址、转换地址的工作。 为什么要存在进程地址空间和页表 1、将物理内存从无序变为有序让进程以统一的视角看待内存。 2、将进程管理和内存管理解耦合 3、进程地址空间和页表组合的设计是保护内存安全的重要手段。 磁盘将可执行程序加载到内存中数据是不连续的。如果操作系统直接管理不连续的物理地址效率很低。所以我们将这个程序对应页表的虚拟地址设计成连续的连续的虚拟地址映射到不连续的物理地址上进程管理与内存管理之间没有关系操作系统通过页表将虚拟-物理地址相互联系所以我们管理连续的虚拟地址就管理了物理地址提高了效率。 进程访问数据时页表会帮我们检测访问数据地址的合法性如果不合法或者转化物理地址失败操作系统就会将此进程拦截阻止该进程甚至终止该进程。如一旦访问野指针或越界操作系统会终止该进程。但终止该进程不会影响到其他进程因为是进程自己的页表拦截了自己。所以页表不仅仅有地址转化的工作还有检测访问合法地址的机制。 缺页中断 我们申请内存时可能刚申请完的内存不立即使用如果存在这种情况从我们申请成功到真正使用内存的这一段时间里操作系统就不好管理这部分内存毕竟是用户的也不可能销毁但是用户如果一直不用操作系统是无法对这部分内存做处理的操作系统的效率就会降低。 操作系统基于效率考虑设计了以下机制 用户在申请内存后操作系统首先在该进程的进程地址空间中的对应区域上面申请空间然后返回给用户一个虚拟地址等到用户真正要使用这部分内存时操作系统首先会在页表中去查询若页表中没有该虚拟地址与物理地址的映射关系时操作系统就会先中断用户使用该进程的操作在物理地址上面先申请空间在页表中添加虚拟地址与物理地址的映射关系。再启动该用户使用内存操作操作系统继续访问页表通过页表映射关系找到物理内存然后操作系统为用户执行对应操作即可。这个中断操作称为缺页中断。 此机制保证了内存的使用率提升malloc/new的速度。