一旦boot loader運(yùn)行了我們的單體程序,我們說(shuō)boot loader就不存在了,那此時(shí)boot loader所占用的內(nèi)存空間也就釋放出來(lái)了,如圖 2所示。從圖中可以看出內(nèi)存中的閑置空間加大了。那閑置空間被我們的單體程序用來(lái)做什么呢?做堆!在單體程序中的操作系統(tǒng)部分,會(huì)提供一定的管理模塊來(lái)管理這塊堆,并提供API(Application Programming Interface,應(yīng)用程序編程接口)讓我們調(diào)用,從而實(shí)現(xiàn)從堆中分配或是釋放內(nèi)存,這些API類似于C語(yǔ)言中的malloc ()/free ()。堆在管理上有一個(gè)特點(diǎn),從堆中分配出來(lái)的內(nèi)存應(yīng)當(dāng)是以某一大小字節(jié)為邊界的。比如,如果CPU中的double類型是占用內(nèi)存最多的數(shù)據(jù)類型且是8字節(jié),那么堆分配出來(lái)的內(nèi)存就必須保證是以8字節(jié)為邊界的。這一點(diǎn)請(qǐng)讀者想一想為什么?除了采用動(dòng)態(tài)的內(nèi)存分配,在嵌入式系統(tǒng)中通常還會(huì)采用固定大小內(nèi)存塊的分配方法,這種分配方法的好處是非常的快,而且這種內(nèi)存在使用的過(guò)程中不會(huì)產(chǎn)生內(nèi)存碎片。
圖 2
堆我們說(shuō)過(guò)了,那接下來(lái)我們看一看如果我們的單體程序繼續(xù)運(yùn)行,會(huì)出現(xiàn)什么樣的內(nèi)存布局。我們知道,通常我們的單體程序在初始化時(shí)往往需要?jiǎng)?chuàng)建多個(gè)任務(wù)來(lái)實(shí)現(xiàn)其應(yīng)用功能。對(duì)于每一個(gè)任務(wù),它一塊內(nèi)存是私有的,那就是棧!當(dāng)任務(wù)運(yùn)行時(shí),其需要用棧來(lái)做為函數(shù)調(diào)用時(shí)的參數(shù)傳遞空間,以及用棧來(lái)存儲(chǔ)函數(shù)內(nèi)的局部變量。假設(shè)我們的單體程序需要?jiǎng)?chuàng)建兩個(gè)任務(wù)A和B,這需要通過(guò)調(diào)用操作系統(tǒng)中的任務(wù)創(chuàng)建函數(shù)來(lái)達(dá)到這一目的。操作系統(tǒng)所提供的任務(wù)創(chuàng)建API往往需要我們指定任務(wù)棧的大小,有的甚至可以指定棧內(nèi)存空間。一旦任務(wù)創(chuàng)建的API被調(diào)用,那么操作系統(tǒng)會(huì)調(diào)用堆分配API為任務(wù)分配棧,此時(shí)的內(nèi)存布局如圖 3所示。任務(wù)創(chuàng)建完了以后,各任務(wù)就可以根據(jù)應(yīng)用程序邏輯的需要審請(qǐng)堆空間以實(shí)現(xiàn)其業(yè)務(wù)邏輯。
技術(shù)專區(qū)
看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人
(function(){
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
if (curProtocol === 'https') {
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
}
else {
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
}
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
})();
評(píng)論