一种实时操作系统动态内存的管理方法及装置与流程

文档序号:30137355发布日期:2022-05-21 02:09阅读:243来源:国知局
一种实时操作系统动态内存的管理方法及装置与流程

1.本发明涉及操作系统领域,尤其涉及一种实时操作系统动态内存的管理方法及装置。


背景技术:

2.嵌入式实时操作系统注重实时性,其内存管理方式上往往不会采用通用操作系统分段、分页式、虚拟内存等复杂管理方式,目前实时操作系统中内存管理方式上,常见的做法是预先定义好block大小及数量,例如256kb/128组、512kb/128组、1024kb/64组等等,用户在申请内存时,例如申请64kb,系统先从最邻近的block大小组中256kb查找是否有空闲空间,若有,则分配成功,若没有,则继续到上一级更大的block 512kb中查找空闲空间,如此循环,直至所有block组查找完毕或找到空闲空间为止。
3.该内存管理方式内存利用率低、空间浪费严重,随着软件功能的迭代开发,对内存块大小、数量需求的变更,内存管理需要不断适配,维护困难。


技术实现要素:

4.有鉴于此,本发明实施例提供了一种实时操作系统动态内存的管理方法及装置,其技术方案包括:当前内存块空闲且不小于申请内存的大小时,从该内存块分配内存;当前内存块忙碌或小于申请内存大小时,从动态内存的第一个内存块分配内存。本发明的技术方案分配动态内存时不用遍历多个内存块,分配速度快,实时性好,功能维护简便。
5.第一方面,本发明实施例提供了一种实时操作系统动态内存的管理方法,包括:获取申请内存大小;当前内存块空闲且大于或等于所述申请内存大小时,从所述当前内存块中分配内存,所述当前内存块为当前的内存控制块对应的内存块,每个内存控制块对应一个内存块;当所述当前内存块忙碌或小于所述申请内存大小时,从动态内存中第一个内存控制块对应的内存块中分配内存。
6.由上,通过根据内存控制块全局指针从当前内存块分配内存,且在当前内存块忙碌或小于申请内存大小时从动态内存的第一个内存块分配内存,使整个内存分配过程中不用遍历多个内存块,分配速度快,实时性好,功能维护简便。
7.在本发明第一方面的一种可能实施方式中,内存控制块至少包括:前向指针、后向指针、内存块状态、内存块大小、该内存控制块的起始地址;内存控制块按物理位置顺序组成控制块链表,一个内存控制块的前向指针和后向指针分别指向该控制块链表中下一个和上一个的内存控制块。
8.由上,通过内存控制块和控制块链表管理内存块,便于快速确定当前的内存控制块。
9.在本发明第一方面的一种可能实施方式中,还包括:当从所述当前内存块中分配完内存后所述当前内存块中剩余的内存块大于一个内存控制块空间时,增加一个内存控制块管理所述剩余的内存块;以及把新增加的内存控制块作为所述当前的内存控制块。
10.由上,把当前内存块分配后剩余的内存块返回到空闲内存状态,且分配的内存块和返回的内存块均不受内存大小级别控制,提高了内存利用率。
11.在本发明第一方面的一种可能实施方式中,还包括:当从所述当前内存块中分配完内存后所述当前内存块中剩余的内存块不大于一个内存控制块空间、且所述当前内存块为动态内存中最后一个内存块时,把所述第一个内存控制块作为所述当前的内存控制块。
12.由上,当前内存块中剩余的内存块不大于一个内存控制块空间、且当前内存块为动态内存中最后一个内存块时,通过把内存控制块全局指针指向控制块链表中第一个内存控制块,提高了内存分配的速度。
13.在本发明第一方面的一种可能实施方式中,从第一个内存控制块对应的内存块中分配内存,包括:当第一个内存控制块中的内存块状态为空闲时,从第一个内存控制块对应的内存块中进行内存分配,否则返回分配失败。
14.由上,通过从当前内存块分配内存失败时从动态内存的第一个内存块分配内存,使整个内存分配过程中不用遍历多个内存块,分配速度快,实时性好,功能维护简便。
15.在本发明第一方面的一种可能实施方式中,还包括:设置内存控制块全局指针,指向所述当前的内存控制块。
16.由上,通过内存控制块全局指针快速确定当前的内存控制块。
17.在本发明第一方面的一种可能实施方式中,还包括:当释放内存块的相邻内存块中有空闲内存块时,把空闲内存块与释放内存块合并,并更新相关的内存控制块。
18.由上,通过把释放内存块与相邻的空闲内存块合并,减少内存碎片,进一步提高内存的利用率。
19.第二方面,本发明实施例提供了一种实时操作系统动态内存的管理装置,包括第一获取模块、第二获取模块、当前分配模块和第一分配模块;所述第一获取模块用于获取申请内存大小;所述当前分配模块用于当前内存块空闲且大于或等于所述申请内存大小时,从所述当前内存块中分配内存,所述当前内存块为当前的内存控制块对应的内存块,每个内存控制块对应一个内存块;所述第一分配模块用于当所述当前内存块忙碌或小于所述申请内存大小时,从动态内存中第一个内存控制块对应的内存块中分配内存。
20.由上,通过根据内存控制块全局指针从当前内存块分配内存,且在当前内存块忙碌或小于申请内存大小时从动态内存的第一个内存块分配内存,使整个内存分配过程中不用遍历多个内存块,分配速度快,实时性好,功能维护简便。
21.在本发明第二方面的一种可能实施方式中,内存控制块至少包括:前向指针、后向指针、内存块状态、内存块大小、该内存控制块的起始地址;内存控制块按物理位置顺序组成控制块链表,一个内存控制块的前向指针和后向指针分别指向该控制块链表中下一个和上一个的内存控制块。
22.由上,通过内存控制块和控制块链表管理内存块,便于快速确定当前的内存控制块。
23.在本发明第二方面的一种可能实施方式中,所述当前分配模块还用于当从所述当前内存块中分配完内存后所述当前内存块中剩余的内存块大于一个内存控制块空间时,增加一个内存控制块管理所述剩余的内存块;以及把新增加的内存控制块作为所述当前的内存控制块。
24.由上,把当前内存块分配后剩余的内存块返回到空闲内存状态,且分配的内存块和返回的内存块均不受内存大小级别控制,提高了内存利用率。
25.在本发明第二方面的一种可能实施方式中,所述当前分配模块还用于当从所述当前内存块中分配完内存后所述当前内存块中剩余的内存块不大于一个内存控制块空间、且所述当前内存块为动态内存中最后一个内存块时,把所述第一个内存控制块作为所述当前的内存控制块。
26.由上,当前内存块中剩余的内存块不大于一个内存控制块空间、且当前内存块为动态内存中最后一个内存块时,通过把内存控制块全局指针指向控制块链表中第一个内存控制块,提高了内存分配的速度。
27.在本发明第二方面的一种可能实施方式中,所述第一分配模块具体用于当第一个内存控制块中的内存块状态为空闲时,从第一个内存控制块对应的内存块中进行内存分配,否则返回分配失败。
28.由上,通过从当前内存块分配内存失败时从动态内存的第一个内存块分配内存,使整个内存分配过程中不用遍历多个内存块,分配速度快,实时性好,功能维护简便。
29.在本发明第二方面的一种可能实施方式中,所述当前分配模块还用于设置内存控制块全局指针,指向所述当前的内存控制块。
30.由上,通过内存控制块全局指针快速确定当前的内存控制块。
31.在本发明第二方面的一种可能实施方式中,还包括内存释放模块,用于当释放内存块的相邻内存块中有空闲内存块时,把空闲内存块与释放内存块合并,并更新相关的内存控制块。
32.由上,通过把释放内存块与相邻的空闲内存块合并,减少内存碎片,进一步提高内存的利用率。
33.第三方面,本发明实施例提供了一种计算设备,包括,
34.总线;
35.通信接口,其与所述总线连接;
36.至少一个处理器,其与所述总线连接;以及
37.至少一个存储器,其与所述总线连接并存储有程序指令,所述程序指令当被所述至少一个处理器执行时使得所述至少一个处理器执行本发明第一方面任一所述实施方式。
38.第四方面,本发明实施例提供了一种计算机可读存储介质,其上存储有程序指令,所述程序指令当被计算机执行时使得所述计算机执行申请第一方面任一所述实施方式。
附图说明
39.图1a为本发明的一种实时操作系统动态内存的管理方法实施例一的流程示意图;
40.图1b为本发明的一种实时操作系统动态内存的管理方法实施例一的当前内存块分配方法的流程示意图;
41.图1c为本发明的一种实时操作系统动态内存的管理方法实施例一的第一个内存块分配方法的流程示意图;
42.图2a为本发明的一种实时操作系统动态内存的管理方法实施例二的流程示意图;
43.图2b为本发明的一种实时操作系统动态内存的管理方法实施例二的内存释放方
法的流程示意图;
44.图3为本发明的动态内存初始化和分配结果的示意图;
45.图4为本发明的内存释放结果的示意图;
46.图5为本发明的一种实时操作系统动态内存的管理装置实施例一的结构示意图;
47.图6为本发明的一种实时操作系统动态内存的管理装置实施例二的结构示意图;
48.图7为本发明各实施例的一种计算设备的结构示意图。
具体实施方式
49.在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
50.在以下的描述中,所涉及的术语“第一\第二\第三等”或模块a、模块b、模块c等,仅用于区别类似的对象,或用于区别不同的实施例,不代表针对对象的特定排序,可以理解地,在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本发明实施例能够以除了在这里图示或描述的以外的顺序实施。
51.在以下的描述中,所涉及的表示步骤的标号,如s110、s120
……
等,并不表示一定会按此步骤执行,在允许的情况下可以互换前后步骤的顺序,或同时执行。
52.除非另有定义,本文所使用的所有的技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本发明实施例的目的,不是旨在限制本发明。
53.实时系统为长时间占用内存的进程分配固定内存,为实时动态占用内存的进程分配动态内存。虽然空间顺序上动态内存申请释放顺序可能存在颠倒的情况,但总体上表现为“先申请先释放”。例如,对于同一个任务来说,先接收到的消息通常挂载在消息内存链表前部,后接收到的消息通常挂载在消息链表尾部,消息处理上通常从消息链表的最前端开始,所以内存使用上所表现出来的顺序就是先申请先释放。对于按优先级抢占式任务调度,例如,高优先级任务抢占低优先级任务,会导致内存申请与释放过程中某一段顺序有所颠倒,但内存使用整体表现仍符合“先申请先释放”规律。
54.本发明各实施例一种实时操作系统动态内存的管理方法及装置,其技术方案包括:当前待分配的当前内存块空闲且不小于申请内存的大小时,从该内存块分配内存;当前内存块忙碌或小于申请内存大小时,从动态内存的第一个内存块分配内存。本发明的技术方案在分配动态内存时不用遍历多个内存块,分配速度快,实时性好,功能维护简便。
55.首先介绍本发明的内存控制块(memory control block,mcb)、控制块链表、全局内存控制块指针。
56.每个内存控制块对应一个控制块,内存控制块管理对应的内存块,根据内存控制块分配内存。内存控制块至少包括以下字段:
57.后向指针stp_prev_mcb
ꢀꢀꢀ
/*指向前一个内存控制块*/
58.前向指针stp_next_mcb
ꢀꢀꢀ
/*指向下一个内存控制块*/
59.内存块状态mcb_status
ꢀꢀꢀꢀ
/*内存控制块对应的内存块的状态*/
60.内存块大小mem_size
ꢀꢀꢀꢀꢀ
/*内存控制块对应的内存块大小*/
61.起始地址buffer_addr
ꢀꢀꢀꢀꢀ
/*内存控制块的起始地址*/。
62.内存控制块按物理位置顺序组成控制块链表,一个内存控制块的前向指针和后向指针分别指向控制块链表中下一个和上一个的内存控制块。
63.全局内存控制块指针g_mem_alloc_ptr指向当前的内存控制块,当前的内存控制块对应当前内存块,即当前待分配的内存块。
64.下面基于1a图至图4介绍本发明的一种实时操作系统动态内存的各管理方法实施例。
65.在一种实时操作系统动态内存的管理方法实施例一中,内存控制块全局指针指向当前的内存控制块,当前的内存控制块对应的当前内存块,当前内存块空闲且不小于申请内存的大小时,从当前内存块分配内存,且剩余的内存块大于一个内存控制块空间时,增加新的内存控制块描述该剩余的内存块;当前内存块忙碌或小于申请内存大小时,把内存控制块全局指针指向动态内存中第一个内存控制块,并从其中分配内存。一种实时操作系统动态内存的管理方法实施例一在分配动态内存时不用遍历多个内存块,分配速度快,实时性好,功能维护简便,且能有效提高内存利用率,避免空间浪费。
66.图1a示出了本发明的一种实时操作系统动态内存的管理方法实施例一的流程,其包括步骤s110至s150。
67.步骤s110:获取申请内存大小len。
68.其中,申请内存为实时系统的进程申请的动态内存,为实时系统为实时性操作申请的内存。
69.步骤s120:根据内存控制块指针g_mem_alloc_ptr获取当前内存块大小。
70.其中,全局内存控制块指针g_mem_alloc_ptr指向的当前的内存控制块mcb_n,当前的内存控制块mcb_n对应内存块称为当前内存块,为当前待分配的内存块。
71.步骤s130:判断当前内存块是否空闲且大于或等于申请内存大小len。
72.其中,当前内存块是否空闲且大于或等于申请内存大小len时,执行步骤s140,否则运行步骤s150。
73.步骤s140:返回当前的内存控制块mcb_n的起始地址buffer_addr作为内存申请结果,并更新控制块链表中相关内存控制块的信息和调整全局内存控制块指针g_mem_alloc_ptr。
74.其中,在更新控制块链表中相关内存控制块的信息时,在当前内存块中减去申请内存和一个内存控制块空间后还剩余内存块时,增加一个内存控制块管理该剩余内存块。
75.本步骤的详细方法请参照一种实时操作系统动态内存的管理方法实施例一的当前内存块分配流程。
76.步骤s150:把全局内存控制块指针g_mem_alloc_ptr指向控制块链表中第一个内存控制块,从其对应的内存块分配内存。
77.其中,控制块链表中第一个内存控制块为内存控制块mcb_0,其地址为动态内存的起始地址,内存控制块mcb_0对应的内存块为动态内存的第一个内存块。
78.本步骤的详细方法请参照一种实时操作系统动态内存的管理方法实施例一的第一个内存块分配流程。
79.由上,实时系统的动态内存基本上先申请先释放的规律,在尝试从当前内存块分
配内存时,动态内存的第一个内存块大概率已经释放。所以在从当前内存块分配内存失败时,直接回到动态内存的第一个内存块进行分配,而不是遍历各空闲内存块,提高内存分配的速度,从而提升实时系统的时效性。
80.图1b示出了本发明的一种实时操作系统动态内存的管理方法实施例一的当前内存块分配流程,其包括步骤s1410至s1460。
81.步骤s1410:把当前的内存控制块mcb_n的内存块状态mcb_status设置为忙碌,返回当前的内存控制块mcb_n的起始地址buffer_addr作为内存分配结果。
82.步骤s1420:判断当前内存块是否大于申请内存大小len与一个内存控制块空间的和。
83.其中,当前内存块大于申请内存大小len与一个内存控制块空间的和时,执行步骤s1430,否则执行步骤s1440
84.步骤s1430:在控制块链表中增加一个新的内存控制块,并更新当前的内存控制块mcb_n和其下一个内存控制块的信息,设置全局内存控制块指针g_mem_alloc_ptr指向为新增的内存控制块。
85.其中,在控制块链表中新的内存控制块位于当前的内存控制块mcb_n和下一个内存控制块之间,新的内存控制块的前向指针stp_next_mcb指向当前的内存控制块mcb_n的下一个内存控制块,其后向指针stp_prev_mcb指向当前的内存控制块mcb_n,其内存块状态mcb_status为空闲,其内存块大小mem_size为当前内存块减去申请内存大小len与一个内存控制块空间后剩下的内存块,其起始地址buffer_addr为当前内存块减去申请内存大小len后剩下的内存块的起始地址。
86.其中,当前的内存控制块mcb_n的前向指针stp_next_mcb更新为新的内存控制块的起始地址buffer_addr;当前的内存控制块mcb_n的下一个内存控制块的后向指针stp_prev_mcb更新为新的内存控制块的起始地址buffer_addr。
87.需要强调的是,当前的内存控制块mcb_n是控制块链表中最后一个内存控制块时,则无须更新当前的内存控制块mcb_n的下一个内存控制块的信息,新的内存控制块的前向指针stp_next_mcb为空。
88.由上,增加一个内存控制块描述剩余的内存块,且剩余的内存块无需按照等级切割,提高了内存使用效率。
89.步骤s1440:判断当前的内存控制块mcb_n是否为最后一个内存控制块。
90.其中,当前的内存控制块mcb_n是最后一个内存控制块时,执行步骤s1450,否则执行步骤s1460.
91.步骤s1450:全局内存控制块指针g_mem_alloc_ptr指向第一个内存控制块。
92.步骤s1460:全局内存控制块指针g_mem_alloc_ptr指向当前的内存控制块mcb_n的下一个内存控制块。
93.图1c示出了本发明的一种实时操作系统动态内存的管理方法实施例一的第一个内存块分配流程,其包括步骤s1510至s1550。
94.步骤s1510:全局内存控制块指针g_mem_alloc_ptr指向内存控制块mcb_0,即控制块链表中的第一个内存控制块。
95.步骤s1510:判断内存控制块mcb_0的内存块状态是否为空闲。
96.其中,如果内存控制块mcb_0的内存块状态为空闲,则执行步骤s1530,否则执行步骤s1550
97.步骤s1530:判断内存控制块mcb_0对应的内存块是否大于或等于申请内存大小len。
98.其中,如果内存控制块mcb_0对应的内存块大于或等于申请内存大小len时,则执行步骤s1540,否则执行步骤s1550。
99.步骤s1540:把动态内存的第一内存块当做当前内存块进行分配。
100.其中,本步骤的详细方法同本发明的一种实时操作系统动态内存的管理方法实施例一的当前内存块分配方法。
101.步骤s1550:返回内存分配失败。
102.由上,从当前内存块分配内存失败时,直接回到该第一个内存块,而不是遍历各空闲内存块,提高内存分配的速度,从而提升实时系统的时效性。
103.本发明还对一种实时操作系统动态内存的管理方法实施例一的第一个内存块分配方法提供一种变体方法,当判断第一个内存控制块的内存块状态为忙碌或小于申请内存大小len时,不执行步骤s1550返回分配失败,而查找其他内存控制块,且当存在不小于申请内存大小len的空闲内存块时,从该内存块中分配内存,如果存在的空闲内存块均小于申请内存大小len的空闲内存块时,反馈内存分配失败。该变体方法为可选方法,当申请内存的进程对时效性要求不严格的情况下,可以按照该变体方法分配内存。
104.由上,当从动态内存的第一个内存块中分配内存失败时,遍历其他可用内存块来分配内存,提高内存分配成功率。
105.综上,在一种实时操作系统动态内存的管理方法实施例一中,内存控制块全局指针指向当前的内存控制块,当前的内存控制块对应的当前内存块,当前内存块空闲且不小于申请内存的大小时,从当前内存块分配内存,且剩余的内存块大于一个内存控制块空间时,增加新的内存控制块描述该剩余的内存块减去一个内存控制块空间后内存块;当前内存块忙碌或小于申请内存大小时,把内存控制块全局指针指向动态内存中第一个内存控制块,并从其中分配内存。一种实时操作系统动态内存的管理方法实施例一不用遍历多个内存块,分配速度快,实时性好,功能维护简便,且能有效提高内存利用率,避免空间浪费。
106.下面结合图2a至图4介绍本发明的一种实时操作系统动态内存的管理方法实施例二。
107.一种实时操作系统动态内存的管理方法实施例二继承了一种实时操作系统动态内存的管理方法实施例一的所有实施方法,具有一种实时操作系统动态内存的管理方法实施例一的优点。在一种实时操作系统动态内存的管理方法实施例一的基础上增加了内存释放方法,对相邻的空闲内存块进行合并,减少内存碎片,进一步提高内存使用效率。
108.图2a示出了本发明的一种实时操作系统动态内存的管理方法实施例二的流程,其包括步骤s210至s250。
109.步骤s210:实时系统启动时为占用内存时间长的进程预留固定内存。
110.其中,动态内存主要用于实时系统的实时性操作申请的内存,不适合占用内存时间长的进程申请内存,所以为占用内存时间长的进程预留固定内存。
111.步骤s220:初始化第一个内存控制块,用于描述整个动态内存。
112.其中,在实时系统启动时把整个动态内存用第一个内存控制块描述,即用内存控制块mcb_0描述,此时控制块链表只包括内存控制块mcb_0。
113.图3示出了动态内存初始化和分配的结果。
114.其中,图3左边第一个图为整体动态内存示意图,按照该图内存控制块mcb_0的初始化结果如下:
115.后向指针stp_prev_mcb=null;
116.前向指针stp_next_mcb=null;
117.内存块状态mcb_status=free_status(空闲);
118.内存块大小mem_size=整体动态内存大小mem_pool_size-内存控制块空间;
119.起始地址buffer_addr=内存控制块空间+整体动态内存的起始地址mem_pool_start_addr。
120.内存控制块全局指针g_mem_alloc_ptr指向整体动态内存的起始地址mem_pool_start_addr。
121.步骤s230:根据实时系统进程的内存申请要求从动态内存中分配内存。
122.其中,本步骤的内存分配方法参照一种实时操作系统动态内存的管理方法实施例一。
123.其中,图3左边第二个图示出了第一次内存分配后结果,内存控制块mcb_0的内存状态变为忙碌,同时因为分配完内存后剩下内存块大于一个内存控制块空间,所以增加了内存控制块mcb_1,内存控制块mcb_1的内存状态为空闲,内存控制块全局指针g_mem_alloc_ptr指向内存控制块mcb_1的起始地址。
124.其中,图3右边第一个图示出了又进行3次内存分配后结果,因为这3次每次分配完内存后剩下内存块均大于一个内存控制块空间,所以顺序增加了内存控制块mcb_2、mcb_3和mcb_4,内存控制块mcb_1至内存控制块mcb_3的内存状态为忙碌,内存控制块mcb_4的内存状态为空闲,内存控制块全局指针g_mem_alloc_ptr指向内存控制块mcb_4的起始地址。
125.步骤s240:当实时系统进程释放内存时,对控制块链表中相邻的空闲内存块进行合并。
126.其中,本步骤的内存分配方法参照一种实时操作系统动态内存的管理方法实施例二的内存释放流程。
127.由上,通过对控制块链表中相邻的空闲内存块进行合并,减少内存碎片,进一步提高内存使用效率。
128.图2b示出了本发明的一种实时操作系统动态内存的管理方法实施例二的内存释放流程,其包括步骤s2410至s2450。
129.步骤s2410:判断当前释放的内存控制块mcb_m的下一个内存控制块的内存状态是否空闲。
130.其中,如果内存控制块mcb_m的下一个内存控制块的内存状态空闲,则执行步骤s2420,否则执行步骤s2430
131.步骤s2420:把内存控制块mcb_m的下一个内存控制块合并到内存控制块mcb_m中,并更新相关内存控制块。
132.其中,把内存控制块mcb_m的下一个内存控制块合并到内存控制块mcb_m中本质上
就是把内存控制块mcb_m和其下一个内存控制块分别对应的内存块合并。
133.其中,内存控制块mcb_m的信息进行如下更新:
134.内存控制块mcb_m的内存块大小mem_size增加一个内存控制块的空间与内存控制块mcb_m的下一个内存控制块的内存块大小mem_size的和;
135.把内存控制块mcb_m的前向指针stp_next_mcb设置为内存控制块mcb_m的下一个内存控制块的前向指针stp_next_mcb。
136.其中,把内存控制块mcb_m的前向指针stp_next_mcb当前指向的内存控制块的后向指针stp_prev_mcb指向内存控制块mcb_m。
137.步骤s2430:判断内存控制块mcb_m的上一个内存控制块的内存状态是否为空闲。
138.其中,如果内存控制块mcb_m的上一个内存控制块的内存状态空闲,则执行步骤s2440,否则执行步骤s2450
139.步骤s2440:把内存控制块mcb_m的上一个内存控制块合并到内存控制块mcb_m中,并更新相关内存控制块。
140.其中,把内存控制块mcb_m的上一个内存控制块合并到内存控制块mcb_m中本质上就是把内存控制块mcb_m和其上一个内存控制块分别对应的内存块合并。
141.其中,内存控制块mcb_m的信息进行如下更新:
142.内存控制块mcb_m的内存块大小mem_size增加一个内存控制块的空间与内存控制块mcb_m的上一个内存控制块的内存块大小mem_size的和;
143.把内存控制块mcb_m的后向指针stp_prev_mcb设置为内存控制块mcb_m的上一个内存控制块的后向指针stp_prev_mcb。
144.其中,把内存控制块mcb_m的后向指针stp_prev_mcb当前指向的内存控制块的前向指针stp_next_mcb指向内存控制块mcb_m。
145.步骤s2450:把内存控制块mcb_m内存状态设置空闲。
146.图4示出了一种实时操作系统动态内存的管理方法实施例二的内存释放的结果。
147.其中,图4左边第一张图为内存控制块mcb_0和内存控制块mcb_2对应的内存块释放的结果,因为内存控制块mcb_1还未释放,没有相邻的空闲内存块,所以未进行内存合并。
148.其中,图4左边第二张图为内存控制块mcb_1对应的内存块释放的结果,因为相邻的内存控制块mcb_0和内存控制块mcb_2对应的内存块已经空闲,所以把内存控制块mcb_0、mcb_1和mcb_2进行了合并。
149.其中,图4右边第一张图对内存控制块mcb_3后的内存控制块对应的内存块又按照一种实时操作系统动态内存的管理方法实施例一的方法进行了若干次分配,直至控制链表最后一个内存控制块mcb_i对应的内存块无法满足分配要求,把内存控制块全局指针g_mem_alloc_ptr指向内存控制块mcb_0,即控制块链表中第一个内存控制块。
150.综上,一种实时操作系统动态内存的管理方法实施例二在一种实时操作系统动态内存的管理方法实施例一的基础上,增加了内存释放的方法,对相邻的空闲内存块进行合并,减少内存碎片,进一步提高内存使用效率。
151.下面基于图5至图6介绍本发明的各装置实施例。
152.图5示出了本发明的一种实时操作系统动态内存的管理装置实施例一的结构,其包括:第一获取模块510、第二获取模块520、判断模块530、当前分配模块540和第一分配模
块550。
153.第一获取模块510用于获取申请内存大小len。其详细工作原理和有点请参照一种实时操作系统动态内存的管理方法实施例一的步骤s110。
154.第二获取模块520用于根据内存控制块指针g_mem_alloc_ptr获取当前内存块大小。其详细工作原理和有点请参照一种实时操作系统动态内存的管理方法实施例一的步骤s120。
155.判断模块530用于判断当前内存块是否空闲且大于或等于申请内存大小len。其详细工作原理和有点请参照一种实时操作系统动态内存的管理方法实施例一的步骤s130。
156.当前分配模块540用于返回当前的内存控制块mcb_n的起始地址buffer_addr作为内存申请结果,并更新控制块链表中相关内存控制块的信息和调整全局内存控制块指针g_mem_alloc_ptr。其详细工作原理和有点请参照一种实时操作系统动态内存的管理方法实施例一的步骤s140。
157.第一分配模块550用于把全局内存控制块指针g_mem_alloc_ptr指向控制块链表中第一个内存控制块,从其对应的内存块分配内存。其详细工作原理和有点请参照一种实时操作系统动态内存的管理方法实施例一的步骤s150。
158.图6示出了本发明的一种实时操作系统动态内存的管理装置实施例二的结构,在一种实时操作系统动态内存的管理装置实施例一的基础上增加:内存保留模块610、初始化模块620和内存释放模块640。
159.内存保留模块610用于实时系统启动时为占用内存时间长的进程预留固定内存。其详细工作原理和有点请参照一种实时操作系统动态内存的管理方法实施例二的步骤s210。
160.初始化模块620用于初始化第一个内存控制块,用于描述整个动态内存。其详细工作原理和有点请参照一种实时操作系统动态内存的管理方法实施例二的步骤s220。
161.内存释放模块640用于当实时系统进程释放内存时对控制块链表中相邻的空闲内存块进行合并。其详细工作原理和有点请参照一种实时操作系统动态内存的管理方法实施例二的步骤s240。
162.本发明还提供的一种计算设备,下面图7详细介绍。
163.该计算设备700包括,处理器710、存储器720、通信接口730、总线740。
164.应理解,该图所示的计算设备700中的通信接口730可以用于与其他设备之间进行通信。
165.其中,该处理器710可以与存储器720连接。该存储器720可以用于存储该程序代码和数据。因此,该存储器720可以是处理器710内部的存储单元,也可以是与处理器710独立的外部存储单元,还可以是包括处理器710内部的存储单元和与处理器710独立的外部存储单元的部件。
166.可选的,计算设备700还可以包括总线740。其中,存储器720、通信接口730可以通过总线740与处理器710连接。总线740可以是外设部件互连标准(peripheral component interconnect,pci)总线或扩展工业标准结构(efstended industry standard architecture,eisa)总线等。所述总线740可以分为地址总线、数据总线、控制总线等。为便于表示,该图中仅用一条线表示,但并不表示仅有一根总线或一种类型的总线。
167.应理解,在本发明实施例中,该处理器710可以采用中央处理单元(central processing unit,cpu)。该处理器还可以是其它通用处理器、数字信号处理器(digital signal processor,dsp)、专用集成电路(application specific integrated circuit,asic)、现成可编程门阵列(field programmable gate array,fpga)或者其它可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。或者该处理器710采用一个或多个集成电路,用于执行相关程序,以实现本发明实施例所提供的技术方案。
168.该存储器720可以包括只读存储器和随机存取存储器,并向处理器710提供指令和数据。处理器710的一部分还可以包括非易失性随机存取存储器。例如,处理器710还可以存储设备类型的信息。
169.在计算设备700运行时,所述处理器710执行所述存储器720中的计算机执行指令执行各方法实施例的操作步骤。
170.应理解,根据本发明实施例的计算设备700可以对应于执行根据本发明各实施例的方法中的相应主体,并且计算设备700中的各个模块的上述和其它操作和/或功能分别为了实现本实施例各方法的相应流程,为了简洁,在此不再赘述。
171.本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
172.所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
173.在本发明所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
174.所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
175.另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
176.所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。
而前述的存储介质包括,u盘、移动硬盘、只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。
177.本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时用于执行各方法实施例的操作步骤。
178.本发明实施例的计算机存储介质,可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是,但不限于,电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括,具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
179.计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
180.计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括、但不限于无线、电线、光缆、rf等等,或者上述的任意合适的组合。
181.可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如java、smalltalk、c++,还包括常规的过程式程序设计语言—诸如“c”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络,包括局域网(lan)或广域网(wan),连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
182.注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,均属于本发明保护范畴。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1