进程的内存使用分配
一个进程的虚拟地址空间主要由两个数据结来描述。一个是最高层次的:mm_struct,一个是较高层次的:vm_area_structs。最高层次的mm_struct结构描述了一个进程的整个虚拟地址空间。较高层次的结构vm_area_truct描述了虚拟地址空间的一个区间(简称虚拟区)。每个进程只有一个mm_struct结构,在每个进程的task_struct结构中,有一个指向该进程的结构。可以说,mm_struct结构是对整个用户空间的描述。
下图是进程中内存的分配状态

每一个进程都会有自己独立的mm_struct,这样每一个进程都会有自己独立的地址空间,这样才能互不干扰。当进程之间的地址空间被共享的时候,我们可以理解为这个时候是多个进程使用一份地址空间,这就是线程。
而在二进制程序运行时,通常情况需要首先做如下操作:
- 释放原先进程所使用的资源
- 将应用程序映射到虚拟地址空间中
- text段 包含程序的可执行代码。start_code和end_code指定该段在地址空间中驻留的区域
- 预先初始化的数据(在编译时间指定了具体值的变量)位于start_data和end_data之间,映射自可执行文件的对应段。
- 堆空间 用于动态内存分配,在虚拟地址空间中,start_brk和brk指定边界
- 栈 位置有start_stack定义,几乎所有的计算机的栈都是自动向下增长
- 程序的参数和环境也将映射到虚拟地址空间中,分别位于arg_start和arg_end之间,以及env_start和env_end之间
- 设置进程的指令指针和其他特定于体系结构的寄存器,以便在调度器选择该进程时开始执行程序的main 函数。
本文来自博客园,作者:明月时勿余,转载请注明原文链接:https://www.cnblogs.com/myswy/p/16511732.html

浙公网安备 33010602011771号