0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

malloc和內(nèi)存池技術(shù)的區(qū)別 內(nèi)存池技術(shù)性能優(yōu)化方案

電子設(shè)計(jì) ? 來源:面包板社區(qū) ? 作者:一口Linux ? 2021-03-02 15:29 ? 次閱讀

大家生活中肯定都有這樣的經(jīng)驗(yàn),那就是大眾化的產(chǎn)品都比較便宜,但便宜的大眾產(chǎn)品就是一個(gè)詞,普通;而可以定制的產(chǎn)品一般都價(jià)位不凡,這種定制的產(chǎn)品注定不會(huì)在大眾中普及,因此定制產(chǎn)品就是一個(gè)詞,獨(dú)特。

有的同學(xué)可能會(huì)有疑問,你不是要聊技術(shù)嗎?怎么又說起消費(fèi)了?

原來技術(shù)也有大眾貨以及定制品。

通用 VS 定制

作為程序員(C/C++)我們知道申請(qǐng)內(nèi)存使用的是malloc,malloc其實(shí)就是一個(gè)通用的大眾貨,什么場(chǎng)景下都可以用,但是什么場(chǎng)景下都可以用就意味著什么場(chǎng)景下都不會(huì)有很高的性能。

malloc性能不高的原因一在于其沒有為特定場(chǎng)景做優(yōu)化,除此之外還在于malloc看似簡(jiǎn)單,但是其調(diào)用過程是很復(fù)雜的,一次malloc的調(diào)用過程可能需要經(jīng)過操作系統(tǒng)的配合才能完成。 那么調(diào)用malloc時(shí)底層都發(fā)生了什么呢?簡(jiǎn)單來說會(huì)有這樣典型的幾個(gè)步驟:

malloc開始搜索空閑內(nèi)存塊,如果能找到一塊大小合適的就分配出去

如果malloc找不到一塊合適的空閑內(nèi)存,那么調(diào)用brk等系統(tǒng)調(diào)用擴(kuò)大堆區(qū)從而獲得更多的空閑內(nèi)存

malloc調(diào)用brk后開始轉(zhuǎn)入內(nèi)核態(tài),此時(shí)操作系統(tǒng)中的虛擬內(nèi)存系統(tǒng)開始工作,擴(kuò)大進(jìn)程的堆區(qū),注意額外擴(kuò)大的這一部分內(nèi)存僅僅是虛擬內(nèi)存,操作系統(tǒng)并沒有為此分配真正的物理內(nèi)存

brk執(zhí)行結(jié)束后返回到malloc,從內(nèi)核態(tài)切換到用戶態(tài),malloc找到一塊合適的空閑內(nèi)存后返回

以上就是一次內(nèi)存申請(qǐng)的完整過程,我們可以看到,一次內(nèi)存申請(qǐng)過程其實(shí)是非常復(fù)雜的,關(guān)于這個(gè)問題的詳細(xì)討論你可以參考這里。 既然每次分配內(nèi)存都要經(jīng)過這么復(fù)雜的過程,那么如果程序大量使用malloc申請(qǐng)內(nèi)存那么該程序注定無法獲得高性能。 幸好,除了大眾貨的malloc,我們還可以私人定制,也就是針對(duì)特定場(chǎng)景自己來維護(hù)內(nèi)存申請(qǐng)和分配,這就是高性能高并發(fā)必備的內(nèi)存池技術(shù)。

內(nèi)存池技術(shù)有什么特殊的嗎? 有的同學(xué)可能會(huì)說,等等,那malloc和這里提到的內(nèi)存池技術(shù)有什么區(qū)別呢? 第一個(gè)區(qū)別在于我們所說的malloc其實(shí)是標(biāo)準(zhǔn)庫(kù)的一部分,位于標(biāo)準(zhǔn)庫(kù)這一層;而內(nèi)存池是應(yīng)用程序的一部分。

其次在于定位,我們自己實(shí)現(xiàn)的malloc其實(shí)也是定位通用性的,通用性的內(nèi)存分配器設(shè)計(jì)實(shí)現(xiàn)往往比較復(fù)雜,但是內(nèi)存池技術(shù)就不一樣了,內(nèi)存池技術(shù)專用于某個(gè)特定場(chǎng)景,以此優(yōu)化程序性能,但內(nèi)存池技術(shù)的通用性是很差的,在一種場(chǎng)景下有很高性能的內(nèi)存池基本上沒有辦法在其它場(chǎng)景也能獲得高性能,甚至根本就不能用于其它場(chǎng)景,這就是內(nèi)存池這種技術(shù)的定位。

那么內(nèi)存池技術(shù)是怎樣優(yōu)化性能的呢?

內(nèi)存池技術(shù)原理 簡(jiǎn)單來說,內(nèi)存池技術(shù)一次性獲取到大塊內(nèi)存,然后在其之上自己管理內(nèi)存的申請(qǐng)和釋放,這樣就繞過了標(biāo)準(zhǔn)庫(kù)以及操作系統(tǒng):

也就是說,通過內(nèi)存池,一次內(nèi)存的申請(qǐng)?jiān)僖膊挥萌ダ@一大圈了。 除此之外,我們可以根據(jù)特定的使用模式來進(jìn)一步優(yōu)化,比如在服務(wù)器端,每次用戶請(qǐng)求需要?jiǎng)?chuàng)建的對(duì)象可能就那幾種,那么這時(shí)我們就可以在自己的內(nèi)存池上提前創(chuàng)建出這些對(duì)象,當(dāng)業(yè)務(wù)邏輯需要時(shí)就從內(nèi)存池中申請(qǐng)已經(jīng)創(chuàng)建好的對(duì)象,使用完畢后還回內(nèi)存池。 因此我們可以看到,這種為某些應(yīng)用場(chǎng)景定制的內(nèi)存池相比通用的比如malloc內(nèi)存分配器會(huì)有大的優(yōu)勢(shì)。 接下來我們就著手實(shí)現(xiàn)一個(gè)。

實(shí)現(xiàn)內(nèi)存池的考慮 值得注意的是,內(nèi)存池實(shí)際上有很多的實(shí)現(xiàn)方法,在這里我們還是以服務(wù)器端編程為例來說明。 假設(shè)你的服務(wù)器程序非常簡(jiǎn)單,處理用戶請(qǐng)求時(shí)只使用一種對(duì)象(數(shù)據(jù)結(jié)構(gòu)),那么最簡(jiǎn)單的就是我們提前申請(qǐng)出一堆來,使用的時(shí)候拿出一個(gè),使用完后還回去:

怎么樣,足夠簡(jiǎn)單吧!這樣的內(nèi)存池只能分配特定對(duì)象(數(shù)據(jù)結(jié)構(gòu)),當(dāng)然這樣的內(nèi)存池需要自己維護(hù)哪些對(duì)象是已經(jīng)被分配出去的,哪些是還沒有被使用的。 但是,在這里我們可以實(shí)現(xiàn)一個(gè)稍微復(fù)雜一些的,那就是可以申請(qǐng)不同大小的內(nèi)存,而且由于是服務(wù)器端編程,那么一次用戶請(qǐng)求過程中我們只申請(qǐng)內(nèi)存,只有當(dāng)用戶請(qǐng)求處理完畢后一次性釋放所有內(nèi)存,從而將內(nèi)存申請(qǐng)釋放的開銷降低到最小。 因此,你可以看到,內(nèi)存池的設(shè)計(jì)都是針對(duì)特定場(chǎng)景的。 現(xiàn)在,有了初步的設(shè)計(jì),接下來就是細(xì)節(jié)了。

數(shù)據(jù)結(jié)構(gòu) 為了能夠分配大小可變的對(duì)象,顯然我們需要管理空閑內(nèi)存塊,我們可以用一個(gè)鏈表把所有內(nèi)存塊鏈接起來,然后使用一個(gè)指針來記錄當(dāng)前空閑內(nèi)存塊的位置,如圖所示:

從圖中我們可以看到,有兩個(gè)空閑內(nèi)存塊,空閑內(nèi)存之間使用鏈表鏈接起來,每個(gè)內(nèi)存塊都是前一個(gè)的2倍,也就是說,當(dāng)內(nèi)存池中的空閑內(nèi)存不足以分配時(shí)我們就向malloc申請(qǐng)內(nèi)存,只不過其大小是前一個(gè)的2倍:

其次,我們有一個(gè)指針free_ptr,指向接下來的空閑內(nèi)存塊起始位置,當(dāng)向內(nèi)存池分配內(nèi)存時(shí)找到free_ptr并判斷當(dāng)前內(nèi)存池剩余空閑是否足夠就可以了,有就分配出去并修改free_ptr,否則向malloc再次成倍申請(qǐng)內(nèi)存。 從這里的設(shè)計(jì)可以看出,我們的內(nèi)存池其實(shí)是不會(huì)提供類似free這樣的內(nèi)存釋放函數(shù)的,如果要釋放內(nèi)存,那么會(huì)一次性將整個(gè)內(nèi)存池釋放掉,這一點(diǎn)和通用的內(nèi)存分配器是不一樣。 現(xiàn)在,我們可以分配內(nèi)存了,還有一個(gè)問題是所有內(nèi)存池設(shè)計(jì)不得不考慮的,那就是線程安全,這個(gè)話題你可以參考這里。

線程安全 顯然,內(nèi)存池不應(yīng)該局限在單線程場(chǎng)景,那我們的內(nèi)存池要怎樣實(shí)現(xiàn)線程安全呢? 有的同學(xué)可能會(huì)說這還不簡(jiǎn)單,直接給內(nèi)存池一把鎖保護(hù)就可以了。

這種方法是不是可行呢?還是那句話,It depends,要看情況。 如果你的程序有大量線程申請(qǐng)釋放內(nèi)存,那么這種方案下鎖的競(jìng)爭(zhēng)將會(huì)非常激烈,線程這樣的場(chǎng)景下使用該方案不會(huì)有很好的性能。 那么還有沒有一種更好的辦法嗎?答案是肯定的。

線程局部存儲(chǔ) 既然多線程使用線程池存在競(jìng)爭(zhēng)問題,那么干脆我們?yōu)槊總€(gè)線程維護(hù)一個(gè)內(nèi)存池就好了,這樣多線程間就不存在競(jìng)爭(zhēng)問題了。 那么我們?cè)撛鯓訛槊總€(gè)線程維護(hù)一個(gè)內(nèi)存池呢? 線程局部存儲(chǔ),Thread Local Storage正是用于解決這一類問題的,什么是線程局部存儲(chǔ)呢? 簡(jiǎn)單說就是,我們可以創(chuàng)建一個(gè)全局變量,因此所有線程都可以使用該全局變量,但與此同時(shí),我們將該全局變量聲明為線程私有存儲(chǔ),那么這時(shí)雖然所有線程依然看似使用同一個(gè)全局變量,但該全局變量在每個(gè)線程中都有自己的副本,變量指向的值是線程私有的,相互之間不會(huì)干擾。

關(guān)于線程局部存儲(chǔ),可以參考這里。 假設(shè)這個(gè)全局變量是一個(gè)整數(shù),變量名字為global_value,初始值為100,那么當(dāng)線程A將global_value修改為200時(shí),線程B看到的global_value的值依然為100,只有線程A看到的global_value為200,這就是線程局部存儲(chǔ)的作用。

線程局部存儲(chǔ)+內(nèi)存池 有了線程局部存儲(chǔ)問題就簡(jiǎn)單了,我們可以將內(nèi)存池聲明為線程局部存儲(chǔ),這樣每個(gè)線程都只會(huì)操作屬于自己的內(nèi)存池,這樣就再也不會(huì)有鎖競(jìng)爭(zhēng)問題了。

注意,雖然這里給出了線程局部存儲(chǔ)的設(shè)計(jì),但并不是說加鎖的方案就比不上線程局部存儲(chǔ)方案,還是那句話,一切要看使用場(chǎng)景,如果加鎖的方案夠用,那么我們就沒有必要絞盡腦汁的去用其它方案,因?yàn)榧渔i的方案更簡(jiǎn)單,代碼也更容易維護(hù)。 還需要提醒的是,這里只是給出了內(nèi)存池的一種實(shí)現(xiàn)方法,并不是說所有內(nèi)存池都要這么設(shè)計(jì),內(nèi)存池可以簡(jiǎn)單也可復(fù)雜,一切要看實(shí)際場(chǎng)景,這一點(diǎn)也需要注意。

其它內(nèi)存池形式 到目前為止我們給出了兩種內(nèi)存池的設(shè)計(jì)方法,第一種是提前創(chuàng)建出一堆需要的對(duì)象(數(shù)據(jù)結(jié)構(gòu)),自己維護(hù)好哪些對(duì)象(數(shù)據(jù)結(jié)構(gòu))可用哪些已被分配;第二種可以申請(qǐng)任意大小的內(nèi)存空間,使用過程中只申請(qǐng)不釋放,最后一次性釋放。這兩種內(nèi)存池天然適用于服務(wù)器端編程。 最后我們?cè)賮斫榻B一種內(nèi)存池實(shí)現(xiàn)技術(shù),這種內(nèi)存池會(huì)提前申請(qǐng)出一大段內(nèi)存,然后將這一大段內(nèi)存切分為大小相同的小內(nèi)存塊:

然后我們自己來維護(hù)這些被切分出來的小內(nèi)存塊哪些是空閑的哪些是已經(jīng)被分配的,比如我們可以使用棧這種數(shù)據(jù)結(jié)構(gòu),最初把所有空閑內(nèi)存塊地址push到棧中,分配內(nèi)存是就pop出來一個(gè),用戶使用完畢后再push回棧里。

從這里的設(shè)計(jì)我們可以看出,這種內(nèi)存池有一個(gè)限制,這個(gè)限制就是說程序申請(qǐng)的最大內(nèi)存不能超過這里內(nèi)存塊的大小,否則不足以裝下用戶數(shù)據(jù),這需要我們對(duì)程序所涉及的業(yè)務(wù)非常了解才可以。 用戶申請(qǐng)到內(nèi)存后根據(jù)需要將其塑造成特定對(duì)象(數(shù)據(jù)結(jié)構(gòu))。 關(guān)于線程安全的問題,可以同樣采用線程局部存儲(chǔ)的方式來實(shí)現(xiàn):

一個(gè)有趣的問題 除了線程安全,這里還有一個(gè)非常有趣的問題,那就是如果線程A申請(qǐng)的對(duì)象被線程B拿去釋放,我們的內(nèi)存池該怎么處理呢? 這個(gè)問題之所以有趣是因?yàn)槲覀儽仨氈涝搩?nèi)存屬于哪個(gè)線程的局部存儲(chǔ),但申請(qǐng)的內(nèi)存本身并不能告訴你這樣的信息。 有的同學(xué)可能會(huì)說這還不簡(jiǎn)單,不就是一個(gè)指針到另一個(gè)指針的映射嗎,直接用map之類存起來就好了,但問題并沒有這么簡(jiǎn)單,原因就在于如果我們切分的內(nèi)存塊很小,那么會(huì)存在大量?jī)?nèi)存塊,這就需要存儲(chǔ)大量的映射關(guān)系,有沒有辦法改進(jìn)呢? 改進(jìn)方法是這樣的,一般來說,我們申請(qǐng)到的大段內(nèi)存其實(shí)是會(huì)按照特定大小進(jìn)行內(nèi)存對(duì)齊,我們假設(shè)總是按照4K字節(jié)對(duì)齊,那么該大段內(nèi)存的起始地址后12個(gè)bit(4K = 2^12)為總是0,比如地址0x9abcd000,同時(shí)我們也假設(shè)申請(qǐng)到的大段內(nèi)存大小也是4K:

那么我們就能知道該大段內(nèi)存中的各個(gè)小內(nèi)存塊起始地址除了后12個(gè)bit位外都是一樣的:

這樣拿到任意一個(gè)內(nèi)存的地址我們就能知道對(duì)應(yīng)的大段內(nèi)存的起始地址,只需要簡(jiǎn)單的將后12個(gè)bit置為0即可,有了大段內(nèi)存的起始地址剩下的就簡(jiǎn)單了,我們可以在大段內(nèi)存中的最后保存對(duì)應(yīng)的線程局部存儲(chǔ)信息:

這樣我們對(duì)任意一個(gè)內(nèi)存塊地址進(jìn)行簡(jiǎn)單的位運(yùn)算就可以得到對(duì)應(yīng)的線程局部存儲(chǔ)信息,大大減少了維護(hù)映射信息對(duì)內(nèi)存的占用。

總結(jié) 內(nèi)存池是高性能服務(wù)器中常見的一種優(yōu)化技術(shù),在這里我們介紹了三種實(shí)現(xiàn)方法,值得注意的是,內(nèi)存池實(shí)現(xiàn)沒有統(tǒng)一標(biāo)準(zhǔn),一切都要根據(jù)具體場(chǎng)景定制,因此我們可以看到內(nèi)存池設(shè)計(jì)是有針對(duì)性的,當(dāng)然其反面就是不具備通用性。

編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2942

    瀏覽量

    73727
  • 局部存儲(chǔ)
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    5453
  • malloc
    +關(guān)注

    關(guān)注

    0

    文章

    52

    瀏覽量

    56
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是動(dòng)態(tài)線程?動(dòng)態(tài)線程的簡(jiǎn)單實(shí)現(xiàn)思路

    因此,動(dòng)態(tài)可監(jiān)控線程一種針對(duì)以上痛點(diǎn)開發(fā)的線程管理工具。主要可實(shí)現(xiàn)功能有:提供對(duì) Spring 應(yīng)用內(nèi)線程實(shí)例的全局管控、應(yīng)用運(yùn)行時(shí)動(dòng)態(tài)變更線程參數(shù)以及線程
    的頭像 發(fā)表于 02-28 10:42 ?529次閱讀

    內(nèi)存溢出與內(nèi)存泄漏:定義、區(qū)別與解決方案

    內(nèi)存溢出與內(nèi)存泄漏:定義、區(qū)別與解決方案? 內(nèi)存溢出和內(nèi)存泄漏是計(jì)算機(jī)科學(xué)中常見的問題,在開發(fā)和
    的頭像 發(fā)表于 12-19 14:10 ?2091次閱讀

    線程的創(chuàng)建方式有幾種

    線程是一種用于管理和調(diào)度線程的技術(shù),能夠有效地提高系統(tǒng)的性能和資源利用率。它通過預(yù)先創(chuàng)建一組線程并維護(hù)一個(gè)工作隊(duì)列,將任務(wù)提交給線程來處理,從而減少線程的創(chuàng)建和銷毀次數(shù),避免了線程
    的頭像 發(fā)表于 12-04 16:52 ?747次閱讀

    線程的運(yùn)轉(zhuǎn)流程圖 技術(shù)實(shí)踐案例解析

    作為一名Java開發(fā)人員,技術(shù)或多或少在業(yè)務(wù)代碼中使用。常見的包括線程、連接等。也是因?yàn)镴ava語言超級(jí)豐富的基建,基本上這些化能
    的頭像 發(fā)表于 11-24 10:22 ?402次閱讀
    線程<b class='flag-5'>池</b>的運(yùn)轉(zhuǎn)流程圖 <b class='flag-5'>池</b>化<b class='flag-5'>技術(shù)</b>實(shí)踐案例解析

    技術(shù)的應(yīng)用實(shí)踐

    作為一名Java開發(fā)人員,技術(shù)或多或少在業(yè)務(wù)代碼中使用。常見的包括線程、連接等。也是因?yàn)镴ava語言超級(jí)豐富的基建,基本上這些化能
    的頭像 發(fā)表于 11-24 10:22 ?443次閱讀
    <b class='flag-5'>池</b>化<b class='flag-5'>技術(shù)</b>的應(yīng)用實(shí)踐

    內(nèi)存主要解決的問題

    內(nèi)存的定義 1.技術(shù) 是在計(jì)算機(jī)技術(shù)中經(jīng)常使用的一種設(shè)計(jì)模式,其內(nèi)涵在于:將程序中需要
    的頭像 發(fā)表于 11-13 15:23 ?626次閱讀
    <b class='flag-5'>內(nèi)存</b><b class='flag-5'>池</b>主要解決的問題

    nginx內(nèi)存源碼設(shè)計(jì)

    造輪子內(nèi)存原因引入 作為C/C++程序員, 相較JAVA程序員的一個(gè)重大特征是我們可以直接訪問內(nèi)存, 自己管理內(nèi)存, 這個(gè)可以說是我們的特色, 也是我們的苦楚了. java可以有虛擬
    的頭像 發(fā)表于 11-13 11:51 ?640次閱讀
    nginx<b class='flag-5'>內(nèi)存</b><b class='flag-5'>池</b>源碼設(shè)計(jì)

    malloc 申請(qǐng)內(nèi)存的兩種方式

    我們知道malloc() 并不是系統(tǒng)調(diào)用,也不是運(yùn)算符,而是 C 庫(kù)里的函數(shù),用于動(dòng)態(tài)分配內(nèi)存。 malloc 申請(qǐng)內(nèi)存的時(shí)候,會(huì)有兩種方式向操作系統(tǒng)申請(qǐng)堆
    的頭像 發(fā)表于 11-13 11:42 ?2413次閱讀
    <b class='flag-5'>malloc</b> 申請(qǐng)<b class='flag-5'>內(nèi)存</b>的兩種方式

    malloc在Linux上執(zhí)行的是哪個(gè)系統(tǒng)調(diào)用

    malloc底層為什么是內(nèi)存 malloc大家都用過,其是庫(kù)函數(shù)。我們都知道庫(kù)函數(shù)在不同的操作系統(tǒng)中其實(shí)執(zhí)行的是系統(tǒng)調(diào)用,那么malloc
    的頭像 發(fā)表于 11-13 10:36 ?885次閱讀
    <b class='flag-5'>malloc</b>在Linux上執(zhí)行的是哪個(gè)系統(tǒng)調(diào)用

    內(nèi)存的使用場(chǎng)景

    為什么要用內(nèi)存 為什么要用內(nèi)存?首先,在7 * 24h的服務(wù)器中如果不使用內(nèi)存,而使用
    的頭像 發(fā)表于 11-10 17:19 ?618次閱讀
    <b class='flag-5'>內(nèi)存</b><b class='flag-5'>池</b>的使用場(chǎng)景

    如何實(shí)現(xiàn)一個(gè)高性能內(nèi)存

    ,按照慣例先說內(nèi)存的應(yīng)用場(chǎng)景。 為什么我們需要內(nèi)存? 因?yàn)?b class='flag-5'>malloc等分配內(nèi)存的方式,需要
    的頭像 發(fā)表于 11-10 11:11 ?588次閱讀
    如何實(shí)現(xiàn)一個(gè)高<b class='flag-5'>性能</b><b class='flag-5'>內(nèi)存</b><b class='flag-5'>池</b>

    線程基本概念與原理

    一、線程基本概念與原理 1.1 線程概念及優(yōu)勢(shì) C++線程簡(jiǎn)介 線程是一種并發(fā)編程技術(shù),它能有效地管理并發(fā)的線程、減少資源占用和提高
    的頭像 發(fā)表于 11-10 10:24 ?444次閱讀

    了解連接、線程內(nèi)存、異步請(qǐng)求

    技術(shù) 技術(shù)能夠減少資源對(duì)象的創(chuàng)建次數(shù),提?程序的響應(yīng)性能,特別是在?并發(fā)下這種提?更加明顯。使用
    的頭像 發(fā)表于 11-09 14:44 ?1038次閱讀
    了解連接<b class='flag-5'>池</b>、線程<b class='flag-5'>池</b>、<b class='flag-5'>內(nèi)存</b><b class='flag-5'>池</b>、異步請(qǐng)求<b class='flag-5'>池</b>

    高并發(fā)內(nèi)存項(xiàng)目實(shí)現(xiàn)

    相關(guān)知識(shí) 1、技術(shù) 技術(shù)就是程序先向系統(tǒng)申請(qǐng)過量的資源,并將這些資源管理起來,避免頻繁的申請(qǐng)和釋放資源導(dǎo)致的開銷。 內(nèi)存
    的頭像 發(fā)表于 11-09 11:16 ?624次閱讀
    高并發(fā)<b class='flag-5'>內(nèi)存</b><b class='flag-5'>池</b>項(xiàng)目實(shí)現(xiàn)

    什么是內(nèi)存

    1什么是內(nèi)存 1.1技術(shù) 所謂“技術(shù)”,就是程序先向系統(tǒng)申請(qǐng)過量的資源,然后自己管理,
    的頭像 發(fā)表于 11-08 16:26 ?777次閱讀
    什么是<b class='flag-5'>內(nèi)存</b><b class='flag-5'>池</b>