main执行前后和其对应的内存区域

本文解析了程序启动前后的主要执行流程,包括初始化系统资源、全局变量处理等内容,并介绍了五种内存区域的作用与区别。

在main执行之前和之后执行的代码可能是什么?

main函数执行之前,主要就是初始化系统相关资源:

设置栈指针
  初始化静态 static 变量和 global 全局变量,即 .data 段的内容
  将未初始化部分的全局变量赋初值:
        数值型 short , int , long 等为 0 , bool 为 FALSE ,指针 为 NULL 等等,即 .bss 段的内容
  全局对象初始化,在 main 之前调用构造函数,这是可能会执行前的一些代码
  将main函数的参数 argc , argv 等传递给 main 函数,然后才真正运行 main 函数 : 
  __attribute__((constructor))

main函数执行之后:

全局对象的析构函数会在main函数之后执行;

  可以用 atexit 注册一个函数,在程序终止的时候被调用;

  __attribute__((destructor)
  1. 关于五大内存区域
bss段:
  bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。
  bss是英文Block Started by Symbol的简称。
  bss段属于静态内存分配。 
  总结:存放未初始化的全局变量
  
data段:
  数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。
  数据段属于静态内存分配。 
  总结:存放已初始化的全局变量和static变量
  
text段:
  代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。
  这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序)。
  在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
  总结: 存放程序执行代码的一块内存区域和字符串常量
  
堆(heap):
  堆是用于存放进程
有一个调度模拟程序 DAG(NetWorkx):Task节点 pre_dma_time: dma前搬移的时间 vproc # 任务执行时间 pl_mem: #需要的PL2内存 post_dma_time: dma后搬移的时间 minStartTime # 任务最早就绪时间,不能早于这个时间点执行 maxEndTime # 任务最晚结束时间,确保任务不能晚于此时刻点完成执行, dagStartTime #所属子图处理任务的时间,只用于计算子图时延 mem_apply_list # 申请SL2内存的列表,列表的元素为申请内存的大小,在任务开始执行申请所有内存 mem_release_list # 释放SL2内存的列表,列表的元素为释放内存的大小,在任务开始执行释放所有内存 任务的增量内存为:sum(mem_apply_list) - sum(mem_release_list) core_type # 任务执行的核类型,只能在对应的核类型上执行。 DagId: 节点所归属子图Id 一个运行环境有DSP, CE, BAU等异构核,对应核数核类型列表core_num_list = [30, 4, 10], core_type_list = ['DSP', 'CE', 'BAU'] 以4个核组成一个MP, 不足MP的按照实际个数组织成MP,一个MP内有高优先级CU(HCU),个数HCuCnt,有低优先级CU(LCU),个数LCuCnt。有PLSize的loc内存。MP内共享一个DMA。DMA执行任务的数据搬移,前搬移或者后搬移 调度器管理上述的MP(本质上为核),其他类型的核。 每个Qos一个就绪队列。当前Qos最大16. 任务运行状态为:就绪,被调度器选中,调度器选择MP,MP内的DMA执行任务的前搬移,前搬移完成后选择MP内最早空闲的核进行任务执行,任务执行完成后,DMA进行后任务后搬移,完成后释放资源。更新任务的依赖关系。 1:任务就绪:任务的依赖关系满足,且当前时间大于等于任务的minStartTime,任务按照对应的Qos进入就绪队列。 2:调度器调度任务:根据Qos从大到小,按照先入先出的规则挑选任务 3:调度器选择MP:根据任务的QosQosThrd,Qos大于QosThrd则,调度到高优先级CU,否则调度到低优先级CU,选择对应优先级平面剩余CU数最多的MP(根据核类型选择),申请对应优先级CU, 对应优先级CU数-1,申请PL2内存,(mp的PL2size减少任务消耗的pl_mem), 之后进入MP的DMA搬移任务队列中。 4:DMA执行搬移队列中的搬移任务,若是前搬移完成,则任务选择MP内最早空闲的核进行执行,若是后半已完成,则释放CU,CU数+1,释放任务占据的PL2。DMA进行任务的数据搬移核上执行任务为流水关系,比如 核正在执行task1的任务,DMA可能在执行task0的后搬移,之后继续进行task2的前搬移。 DMA搬移的时间相对于任务的执行时间比较短,一般情况下task2的前搬移执行完成后,核在执行task0,需要等到有空闲核(task0执行完成),task2才有机会在核上执行,所以DMA核是同时在执行不同任务的不同阶段。需要分别维护时间。 5:任务执行:前搬移完成后,挑选MP内最早空闲的核,完成后任务进入DMA的任务搬移队列。 6:DMA进行任务的后搬移后,释放CU资源(mp的对应优先级CU加1),释放PL2资源(mp的PL2size增加任务消耗的pl_mem),更新本任务的后级任务的依赖关系。同时触发调度器调度就绪的任务。 记录任务被调度的几个关键节点(任务Id,任务执行的核Id,任务就绪时间,DMA前搬移完成时间,任务执行完成时间,DMA后搬移完成时间) 输入:Dag。core_num_list([3,4,6]表示每类处理器的个数),core_type_list[0,1,2]. 用Python实现,给出完整可运行的代码。不要有遗漏。
最新发布
04-04
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值