CN102467452B - 一种静态存储分配的局部非静态数据的存储空间分配方法 - Google Patents
一种静态存储分配的局部非静态数据的存储空间分配方法 Download PDFInfo
- Publication number
- CN102467452B CN102467452B CN201010546810.9A CN201010546810A CN102467452B CN 102467452 B CN102467452 B CN 102467452B CN 201010546810 A CN201010546810 A CN 201010546810A CN 102467452 B CN102467452 B CN 102467452B
- Authority
- CN
- China
- Prior art keywords
- function
- data
- chained list
- storage space
- static
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及编译系统中静态存储分配中对于局部非静态数据的存储空间的分配,实现了一种以函数调用关系链为组织形式的更有效、更快速的局部非静态数据的存储空间分配方法,可用于采用静态存储分配的嵌入式编译系统的开发设计中。本方法包括以下步骤:建立函数调用关系链,为被多个函数调用关系链调用的函数的局部非静态数据分配不可被覆盖数据存储空间,以函数调用关系链为单位为被单一函数调用关系链调用的函数的局部非静态数据分配可被覆盖数据存储空间。
Description
技术领域
本发明涉及编译器领域中静态存储分配中对于局部非静态数据进行存储空间分配的一种分配方法。
背景技术
在编译开发工具中,一个重要的处理步骤就是数据存储空间的分配。对于编译系统一般有静态存储分配、栈式存储分配和堆式存储分配三种分配方式。
静态存储分配方法是在程序生命周期中,数据对象的数据存储空间被分配到固定的位置,这种分配方法需要数据对象的数量和大小在编译时刻已知。
栈式存储分配方法是在栈上为数据对象分配数据空间,对于数据的使用通过起始地址加偏移来实现,这样就可以在程序运行期间根据需要为数据对象分配相应的数据空间。栈式存储分配使得递归和动态数组成为可能。
堆式存储方法是最灵活最昂贵的存储分配方法,数据对象可以在任何时刻,以任意次序分配和释放。它允许程序在一个称为存储池的堆中分配空间,堆分配既可以由编程者自己控制,也可以由编译系统或者加载器进行运行时控制,这给编程者使用数据存储空间带来了极大的灵活性。
早期的编译系统,一般都采用静态存储分配方法,目前的大部分编译系统,除了全局变量和局部静态变量外,一般不再采用静态数据存储空间分配方法进行数据空间分配,但是对于某些嵌入式芯片,由于其功能的限制,其编译系统中对于所有的数据空间仍采用了静态存储分配方法。
发明内容
目前已有的静态存储分配方法中,对于局部非静态数据的分配,是以函数为单位来进行分配操作。本发明的目的在于实现一种以函数调用关系链为组织形式的更有效、更快速的局部非静态数据的存储空间分配方法。
本发明的目的通过以下技术实现,步骤如下(见图1):
1.读入中间目标代码文件中的函数信息,建立函数链表,在函数链表的节点中存储函数的所有信息;
2.建立可分配数据空间链表:根据配置文件或输入参数中设置的可分配的数据空间信息,使用内存节点结构体记录每一块可被分配的数据存储空间,并将其放在可分配数据空间链表中。
3.建立函数调用关系链(图2):
(1)遍历函数链表,分析每个函数的函数体代码,将其调用的函数名称用链表(或集合)记录下来形成被调用函数记录;
(2)遍历函数链表,根据上面步骤(1)形成的记录,找出没有被任何函数调用过的函数(即没有出现在上面步骤中形成的记录中的函数),将其作为每个函数调用关系链表的根函数,将其指针放入根函数链表的节点中,并给予一个数字编号;
(3)从每个根函数开始,采用广度优先搜索建立每个函数与其调用的函数间的连接,形成函数调用关系链,即通过查询函数链表,将被调用函数的指针或位置信息填入调用函数的结构体中(重复调用只记录一次),并通过在被调用函数中记录函数调用关系链的根函数的编号,来确定该函数是否被多个函数调用关系链调用,每次被调用函数中记录的当前根函数的编号转换时,其内部记录的调用其的函数调用关系链的个数增加1,函数的调用关系链个数的初始值为0。
4.为被多个函数调用关系链调用的函数的局部非静态数据分配数据存储空间:
(1)遍历函数链表,如果函数记录的调用关系链的个数大于1,执行下面的步骤(2)-(4);
(2)从可分配数据存储空间链表中找得合适的存储块进行相应的分配;
(3)将分配的数据存储空间从可分配数据存储空间链表中去除;
(4)并将相关的分配信息记录入永久分配数据存储空间链表中。
5.为每个函数调用关系链的函数的局部非静态数据分配可被覆盖数据存储空间,从每个函数调用关系链的根函数开始,执行下列步骤(图3):
(1)若当前函数的局部非静态数据已经分配数据存储空间,则返回;
(2)将当前可分配数据存储空间链表生成一副本,在副本中按照下面的步骤为函数的局部非静态数据分配数据存储空间;
(3)从当前函数调用关系链的已分配数据存储空间链表中查找是否有被当前函数直接或间接调用的函数的分配数据存储空间的信息(该调用关系可以通过步骤3中生成的信息中获得),如果有,则将其与当前可分配数据存储空间副本中重合的部分填入一个新建的临时不可覆盖数据存储空间链表中;
(4)从当前可分配数据存储空间链表副本中去除步骤(3)中生成的临时不可覆盖数据存储空间链表中记录的所有的存储空间,然后在剩余的存储空间中为当前函数的局部非静态数据分配数据存储空间,并将相关分配信息记录入当前函数调用关系链的已分配数据存储空间链表中,并将当前函数分配的数据存储空间从当前可分配数据存储空间链表副本中去除;
(5)将步骤(3)中生成的临时不可覆盖数据存储空间链表合并到步骤(4)操作后的当前可分配数据存储空间链表副本中(合并后,临时不可覆盖数据存储空间链表为空);
(6)将步骤(5)操作后的当前可分配数据存储空间链表副本作为子函数的当前可分配数据存储空间链表,然后递归执行步骤(1)-(6),为当前函数调用的函数中未进行局部非静态数据存储分配的函数分配合适的数据存储空间,直到当前函数调用关系链中所有的函数的局部非静态数据都分配了数据存储空间为止;
(7)遍历当前函数调用关系链的已分配数据存储空间链表,合并整理出当前函数调用关系链使用的数据存储空间,从可分配数据存储空间链表中去除该部分数据空间;
(8)如果还有未进行局部非静态数据分配的函数调用关系链,按照上面步骤继续在可分配数据存储空间链表中进行分配。
附图说明
图1静态存储分配中函数局部非静态数据的存储空间分配流程
图2函数调用关系链示例,其中图中的小方框代表函数,小方框之间的连线代表调用关系,箭头指向被调用函数。
图3静态存储分配中被单一函数调用关系链调用的函数局部非静态数据存储空间分配流程
具体实施方式
实施本发明需要建立适当的数据结构,分别表示函数节点,空间分配信息节点等,建立函数链表,记录被调用函数查询名的查询表,记录函数调用关系链根函数信息的链表,可分配数据存储空间链表和其它一些辅助链表,这些表可以以链表形式组织,为了提高效率,也可以将部分表以哈希表、集合表的形式组织。建立上述数据结构后,就可以参照本发明实施具体的局部非静态数据存储空间的分配。步骤如下:
1.读入中间目标代码文件中的函数信息,存入函数链表function_list;
2.读入可分配数据空间信息,存入可分配数据空间链表data_mem_list;
3.建立函数调用关系链(图2):
(1)遍历函数链表function_list,分析每个函数的函数体代码,将其调用的函数名称用集合called_function_set记录下来形成被调用函数记录;
(2)遍历函数链表function_list,通过查询called_function_set,找出没有出现在called_function_set中的函数,将其作为每个函数调用关系链表的根函数,将其指针放入根函数链表root_function_list的节点中,并给予一个数字编号;
(3)从root_function_list中记录的每个根函数开始,采用广度优先搜索建立每个函数与其调用的函数间的连接,形成函数调用关系链,即通过查询函数链表function_list,将被调用函数的指针信息填入function_list中调用函数的结构体的被调用函数信息表sub_function_iter_list中(重复调用只记录一次),并通过在function_list链表中被调用函数的结构体中记录函数调用关系链的根函数的编号,来确定该函数是否被多个函数调用关系链调用,每次被调用函数中记录的当前根函数的编号转换时,其内部记录的调用其的函数调用关系链的个数chain_num增加1,chain_num的初始值为0。
4.为被多个函数调用关系链调用的函数的局部非静态数据分配数据存储空间:
(1)遍历函数链表function_list,如果函数记录的调用关系链的个数chain_num大于1,执行下面的步骤(2)-(4);
(2)从可分配数据存储空间链表data_mem_list中找得合适的存储块进行相应的分配;
(3)将分配的数据存储空间从可分配数据存储空间链表data_mem_list中去除;
(4)并将相关的分配信息记录入永久分配数据存储空间链表permanent_alloc_mem_list中。
5.为每个函数调用关系链的函数的局部非静态数据分配可被覆盖数据存储空间,遍历根函数链表root_function_list,从每个函数调用关系链的根函数开始,执行下列步骤(图3):
(1)若当前函数的局部非静态数据已经分配数据存储空间,则返回;
(2)将当前可分配数据存储空间链表current_data_mem_list(对于根函数,该链表为data_mem_list)生成一副本current_data_mem_duplicate_list,在副本中按照下面的步骤为函数的局部非静态数据分配数据存储空间;
(3)从当前函数调用关系链的已分配数据存储空间链表tmp_alloc_mem_list中查找是否有被当前函数直接或间接调用的函数的分配数据存储空间的信息,如果有,则将其与当前可分配数据存储空间链表副本中重合的部分填入一个新建的临时不可覆盖数据存储空间链表tmp_used_mem_list中;
(4)从当前可分配数据存储空间链表副本current_data_mem_duplicate_list中去除临时不可覆盖数据存储空间链表tmp_used_mem_list中记录的所有的存储空间,然后在剩余的存储空间中为当前函数的局部非静态数据分配数据存储空间,并将相关分配信息记录到当前函数调用关系链的已分配数据存储空间链表tmp_alloc_mem_list中,并将当前函数分配的数据存储空间从当前可分配数据存储空间链表副本current_data_mem_duplicate_list中去除;
(5)将步骤(3)中生成的临时不可覆盖数据存储空间链表tmp_used_mem_list合并到步骤(4)操作后的当前可分配数据存储空间链表副本current_data_mem_duplicate_list中,合并后,临时不可覆盖数据存储空间链表tmp_used_mem_list为空;
(6)将步骤(5)操作后的当前可分配数据存储空间链表副本current_data_mem_duplicate_list作为其子函数的current_data_mem_list,然后递归执行步骤(1)-(6),为当前函数调用的函数中未进行局部非静态数据存储分配的函数分配合适的数据存储空间,直到当前函数调用关系链中所有的函数的局部非静态数据都分配了数据存储空间为止;
(7)遍历当前函数调用关系链的已分配数据存储空间链表tmp_alloc_mem_list,合并整理出当前函数调用关系链使用的数据存储空间,从可分配数据存储空间链表data_mem_list中去除该部分数据空间;
(8)如果还有未进行局部非静态数据分配的函数调用关系链,按照上面步骤继续在可分配数据存储空间链表data_mem_list中进行分配。
Claims (8)
1.一种静态存储分配的局部非静态数据的存储空间分配方法,其特征在于步骤如下:
(1).读入中间目标代码文件中的函数信息,建立函数链表,在函数链表的节点中存储函数信息;
(2).建立可分配数据空间链表,根据配置文件或输入参数中设置的可分配的数据空间信息,记录每一块可被分配的数据存储空间,并将其放在可分配数据空间链表中;
(3).建立函数调用关系链;
(4).为被多个函数调用关系链调用的函数的局部非静态数据分配不可被覆盖数据存储空间;
(5).从每个函数调用关系链的根函数开始,以函数调用关系链为单位为被单一函数调用关系链调用的函数的局部非静态数据分配可被覆盖数据存储空间。
2.如权利要求1所述的一种静态存储分配的局部非静态数据的存储空间分配方法,其特征在于步骤(3)进一步包括以下步骤:
a)遍历函数链表,记录被调用的函数的函数名,建立被调用函数表;
b)根据步骤a)形成的记录,找出每个函数调用关系链表的根函数,给予一个数字编号;
c)从每个根函数开始,形成函数调用关系链,将被调用函数的指针或位置信息填入调用函数的结构体中,并通过在被调用函数中记录函数调用关系链的根函数的编号,来确定该函数是否被多个函数调用关系链调用。
3.如权利要求1所述的一种静态存储分配的局部非静态数据的存储空间分配方法,其特征在于步骤(4)具体如下:
1)遍历函数链表,如果函数记录的调用关系链的个数大于1,执行步骤2)-4);
2)从可分配数据存储空间链表中找得合适的存储块进行相应的分配;
3)将分配的数据存储空间从可分配数据存储空间链表中去除;
4)将相关的分配信息记录入永久分配数据存储空间链表中。
4.如权利要求1或2所述的一种静态存储分配的局部非静态数据的存储空间分配方法,其特征在于每次被调用函数中记录的当前根函数的编号转换时,其内部记录的调用其的函数调用关系链的个数增加1,每个函数的调用关系链的个数的初始设定值为0。
5.如权利要求1所述的一种静态存储分配的局部非静态数据的存储空间分配方法,其特征在于判断一个函数是否被多个函数调用关系链调用的方法为:检查其内部记录的函数调用关系链的个数是否大于1。
6.如权利要求1所述的一种静态存储分配的局部非静态数据的存储空间分配方法,其特征在于步骤(5)具体如下:
a)若当前函数的局部非静态数据已经分配数据存储空间,返回;
b)将当前可分配数据存储空间链表生成一副本,在副本中按照步骤c)-h)为函数的局部非静态数据分配数据存储空间;
c)从当前函数调用关系链的已分配数据存储空间链表中查找是否有被当前函数直接或间接调用的函数的分配数据存储空间的信息,如果有,则将其与当前可分配数据存储空间副本中重合的部分填入一个新建的临时不可覆盖数据存储空间链表中;
d)从当前可分配数据存储空间链表副本中去除步骤c)中生成的临时不可覆盖数据存储空间链表中记录的所有的存储空间,在剩余的存储空间中为当前函数的局部非静态数据分配数据存储空间,将相关分配信息记录入当前函数调用关系链的已分配数据存储空间链表中,并将当前函数分配的数据存储空间从当前可分配数据存储空间链表副本中去除;
e)将步骤c)中生成的临时不可覆盖数据存储空间链表合并到步骤d)操作后的当前可分配数据存储空间链表副本中;
f)将步骤e)操作后的当前可分配数据存储空间链表副本作为子函数的当前可分配数据存储空间链表,然后递归执行步骤a)-f),为当前函数调用的函数中未进行局部非静态数据存储分配的函数分配合适的数据存储空间,直到当前函数调用关系链中所有的函数的局部非静态数据都分配了数据存储空间为止;
g)遍历当前函数调用关系链的已分配数据存储空间链表,合并整理出当前函数调用关系链使用的数据存储空间,从可分配数据存储空间链表中去除该部分数据空间;
h)如果还有未进行局部非静态数据分配的函数调用关系链,按照上面步骤继续在可分配数据存储空间链表中进行分配。
7.如权利要求1所述的一种静态存储分配的局部非静态数据的存储空间分配方法,其特征在于为了避免为一个函数的局部非静态数据分配数据存储空间时,覆盖其直接或间接调用的已经进行了分配的函数的局部非静态数据的数据存储空间,为每个函数调用关系链建立已分配数据存储空间链表,确保不会产生不合法的覆盖。
8.如权利要求1所述的一种静态存储分配的局部非静态数据的存储空间分配方法,其特征在于位于同一函数调用关系链上的相互之间没有调用关系的函数的局部非静态数据的存储空间之间能互相覆盖,位于同一函数调用关系链上的相互之间具有调用关系的函数的局部非静态数据的存储空间之间不能互相覆盖,位于不同函数调用关系链上的任意两个函数的局部非静态数据的数据存储空间之间不能互相覆盖。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010546810.9A CN102467452B (zh) | 2010-11-16 | 2010-11-16 | 一种静态存储分配的局部非静态数据的存储空间分配方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010546810.9A CN102467452B (zh) | 2010-11-16 | 2010-11-16 | 一种静态存储分配的局部非静态数据的存储空间分配方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102467452A CN102467452A (zh) | 2012-05-23 |
CN102467452B true CN102467452B (zh) | 2014-08-27 |
Family
ID=46071112
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201010546810.9A Active CN102467452B (zh) | 2010-11-16 | 2010-11-16 | 一种静态存储分配的局部非静态数据的存储空间分配方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102467452B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10311025B2 (en) | 2016-09-06 | 2019-06-04 | Samsung Electronics Co., Ltd. | Duplicate in-memory shared-intermediate data detection and reuse module in spark framework |
US11811895B2 (en) | 2016-09-06 | 2023-11-07 | Samsung Electronics Co., Ltd. | Automatic data replica manager in distributed caching and data processing systems |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112783439A (zh) * | 2020-12-29 | 2021-05-11 | 重庆真逆思维科技有限公司 | 一种云平台数据可用区空间分配发现工作方法 |
CN116661910B (zh) * | 2023-08-01 | 2023-09-22 | 北京中电华大电子设计有限责任公司 | 一种应用调用的方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1728106A (zh) * | 2004-07-26 | 2006-02-01 | 中兴通讯股份有限公司 | 一种应用程序故障的定位方法 |
CN101131635A (zh) * | 2006-08-24 | 2008-02-27 | 凌阳科技股份有限公司 | 动态链接函数库与主应用程序共享静态链接函数库的方法 |
CN101303666A (zh) * | 2008-06-25 | 2008-11-12 | 北京中星微电子有限公司 | 一种嵌入式系统中内存资源的使用方法及装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7010783B2 (en) * | 2002-03-18 | 2006-03-07 | Sun Microsystems, Inc. | Method and apparatus for deployment of high integrity software using reduced dynamic memory allocation |
-
2010
- 2010-11-16 CN CN201010546810.9A patent/CN102467452B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1728106A (zh) * | 2004-07-26 | 2006-02-01 | 中兴通讯股份有限公司 | 一种应用程序故障的定位方法 |
CN101131635A (zh) * | 2006-08-24 | 2008-02-27 | 凌阳科技股份有限公司 | 动态链接函数库与主应用程序共享静态链接函数库的方法 |
CN101303666A (zh) * | 2008-06-25 | 2008-11-12 | 北京中星微电子有限公司 | 一种嵌入式系统中内存资源的使用方法及装置 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10311025B2 (en) | 2016-09-06 | 2019-06-04 | Samsung Electronics Co., Ltd. | Duplicate in-memory shared-intermediate data detection and reuse module in spark framework |
US11811895B2 (en) | 2016-09-06 | 2023-11-07 | Samsung Electronics Co., Ltd. | Automatic data replica manager in distributed caching and data processing systems |
Also Published As
Publication number | Publication date |
---|---|
CN102467452A (zh) | 2012-05-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102722432B (zh) | 追踪内存访问的方法和装置 | |
Augustsson et al. | Parallel graph reduction with the (v, g)-machine | |
CN102467452B (zh) | 一种静态存储分配的局部非静态数据的存储空间分配方法 | |
CN103577308B (zh) | 移动设备的日志文件的获取方法 | |
US20090327377A1 (en) | Copying entire subgraphs of objects without traversing individual objects | |
CN101604241A (zh) | 一种嵌入式系统的代码生成方法 | |
CN105824759B (zh) | 数据储存装置以及快闪存储器控制方法 | |
CN102023885A (zh) | 一种存储Java卡运行时环境字节码的方法及系统 | |
CN101452396A (zh) | 结合静态优化的动态二进制翻译方法 | |
CN102810184A (zh) | 一种动态执行工作流的方法、装置及企业系统 | |
CN104142819B (zh) | 一种文件处理方法及装置 | |
CN101763415A (zh) | 一种数据库的b树索引的生成方法及装置 | |
CN103500170A (zh) | 一种报表生成方法及系统 | |
CN105447035A (zh) | 数据扫描方法及装置 | |
Weinstock et al. | An efficient algorithm for heap storage allocation | |
Daylight et al. | Memory-access-aware data structure transformations for embedded software with dynamic data accesses | |
US7565497B1 (en) | Coarse write barrier control mechanism | |
CN103514098B (zh) | 用于回收存储空间的方法和系统 | |
CN109240702A (zh) | 一种多线程模式下的快速段式编址配置和访问方法 | |
CN103164340B (zh) | 对象的存储方法及装置、终端 | |
CN116107578A (zh) | 一种执行智能合约的方法、装置、电子设备和存储介质 | |
CN102541654A (zh) | 一种高效的内存管理方法和装置 | |
Cheadle et al. | Non-stop Haskell | |
CN105242978B (zh) | 多线程条件下cpu高速缓存行失效的处理方法及装置 | |
CN110990018B (zh) | 一种嵌入式系统的编译方法及编译系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C41 | Transfer of patent application or patent right or utility model | ||
TR01 | Transfer of patent right |
Effective date of registration: 20151117 Address after: 201203, Shanghai, Pudong New Area, Liang Xiu Road, No. 112, block Y1, room 305-306, room three Patentee after: HUADA SEMICONDUCTOR CO., LTD. Address before: 100102 Beijing City, Chaoyang District Lize two Road No. 2, Wangjing science and Technology Park A block five layer Patentee before: Beijing CEC Huada Electronic Design Co., Ltd. |