【Linux 内存管理】1 进程地址空间 - VMA

1、进程地址空间概述

  • 进程地址空间(process address space)是指进程可寻址的虚拟地址空间。
  • 在64位的处理器中,进程可以寻址256TB的用户态地址空间,但是进程没权限去寻址内核空间的虚拟地址,只能通过系统调用的方式间接访问。而用户空间的进程地址空间则和可以被合法访问,地址空间称为内存区域(memory area)。
  • 进程可以通过内核的内存管理机制动态地添加和删除这些内存区域,这些内存区域在Linux内核采用VMA数据结构来抽象描述。
  • 每个内存区域具有相关的权限,如可读、可写或者可执行权限。若一个进程访问了不在有效范围的内存区域,或者非法访问了内存区域,或者以不正确的方式访问了内存区域,那么处理器会报告缺页异常。在Linux内核的缺页异常处理中会处理这些情况,严重的会报告Sement Fault,并终止该进程。

进程地址空间 - 内存区域

  1. 代码段映射,可执行文件中包含只读并可执行的程序头,如代码段和init段等。
  2. 数据段映射,可执行文件中包含可读/可写的程序头,如数据段和未初始化数据段等。
  3. 用户进程栈,通常位于用户空间的最高地址,从上往下延申。
    • 它包含栈帧,里边包含局部变量和函数调用参数等。
    • 注不要和内核栈混淆,进程的内核栈独立存在并由内核维护,主要用于上下文切换
  4. mmap区域,位于用户栈下面,主要用于mmap系统调用,如映射一个文件的内容到进程地址空间等。
  5. 堆区域,malloc函数分配的进程虚拟地址就是这段区域。
  • 进程地址空间里的每个区域相互不重叠。
  • 进程地址空间分配的虚拟地址一样,也不会内存区域重叠
  • 进程地址空间是每个进程可以寻址的虚拟地址空间,每个进程在执行时都仿佛拥有了整个CPU内存资源。

64位Linux虚拟内存空间整体布局

在这里插入图片描述

2、mm_struct 数据结构

struct mm_struct {
    struct vm_area_struct *mmap;                                //进程里所有VMA形成的一个单链表头
    struct rb_root mm_rb;                                       //进程里所有VMA管理的红黑树
    unsigned long (*get_unmapped_area) (struct file *filp,      //在进程地址空间中搜索有效线性地址空间的方法
                    unsigned long addr, unsigned long len,      //用于判断虚拟内存空间是否有足够的空间,返回一段没映射过的空间起始地址,
                    unsigned long pgoff, unsigned long flags);  //与具体架构相关
    unsigned long mmap_base;                                    //指向mmap空间的起始地址,在32位下mmap起始地址为0x4000 0000      
    pgd_t *pgd;                                                 //指向进程的PGD页表(一级页表)。
    atomic_t mm_users;                                          //记录正在使用该进程地址空间的进程数目,如果两个线程共享该地址空间,则为2.
    int map_count;                                            //记录该进程所拥有的 VMA 的总数
    atomic_t mm_count;                                          //mm_struct 结构的主引用计数
    spinlock_t page_table_lock;                                 //
    struct rw_semaphore mmap_sem;                               //保护VMA的一个读写信号量
    struct list_head mmlist;                                    //所有的mm_struct数据结构都链接到一个双向链表中,该链表头为init_mm内存描述符(init进程的地址空间)
    unsigned long total_vm;                                     //已经使用的进程地址空间总和   
    unsigned long start_code,end_code,start_data,end_data;      //代码段/数据段的起始地址和结束地址  
    unsigned long start_brk, brk, start_stack;                  //堆空间的起始地址和当前堆中VMA的结束地址
    ...    
};
  • 首先每个进程有一个进程控制块即 task_struct 结构体,来完整描述一个进程的所有信息,在加载程序的时,内核会创建task_struct结构体,
  • 然后每个独立的进程都有自己的虚拟空间即 mm成员指向的mm_struct数据结构。
  • task_struct 结构体包含一个mm_struct 结构体成员,
    • mm_struct结构体包含一个vm_area_struct结构体成员mmap,
    • 然后mmap成员指向一个VMA链表,管理所有VMA。
      在这里插入图片描述
内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

兔斯基灬木木

感谢各位,总结不易,多多支持!

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

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

打赏作者

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

抵扣说明:

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

余额充值