尋找做項(xiàng)目的網(wǎng)站網(wǎng)絡(luò)營(yíng)銷的基本特征有哪七個(gè)
目錄
一、內(nèi)核中小內(nèi)存、頻繁分配和釋放場(chǎng)景
二、slab是內(nèi)存池化技術(shù)
三、內(nèi)核中使用slab對(duì)象池的地方
四、slab內(nèi)核設(shè)計(jì)
?
????????使用比頁(yè)小的內(nèi)存,內(nèi)核的處理方式使用slab
一、內(nèi)核中小內(nèi)存、頻繁分配和釋放場(chǎng)景
- slab首先會(huì)向伙伴系統(tǒng)一次性申請(qǐng)一個(gè)或者多個(gè)物理內(nèi)存頁(yè)面,正是這些物理內(nèi)存頁(yè)組成了slab內(nèi)存池。
- slab內(nèi)存池會(huì)將這些連續(xù)的物理內(nèi)存頁(yè)面劃分成多個(gè)大小相同的小內(nèi)存塊,同一種slab內(nèi)存池下,劃分出來(lái)的內(nèi)存塊尺寸是一樣的。
- 比如內(nèi)核經(jīng)常使用的核心數(shù)據(jù)結(jié)構(gòu)
????????task_struct mm_struct ,struct page ,struct file socket對(duì)象等。
二、slab是內(nèi)存池化技術(shù)
- 當(dāng)內(nèi)核需要頻繁分配和釋放內(nèi)核對(duì)象時(shí),就可以直接從相應(yīng)的slab對(duì)象池中申請(qǐng)和釋放內(nèi)核對(duì)象,避免了鏈路較長(zhǎng)的內(nèi)存分配與釋放技術(shù),極大的提升性能。
- 利用CPU高速緩存 提高訪問(wèn)速度。當(dāng)一個(gè)對(duì)象被直接釋放回slab時(shí),這個(gè)內(nèi)核對(duì)象還是熱的,仍然駐留在CPU高速緩存中。如果這時(shí),繼續(xù)向SLAB對(duì)象池申請(qǐng)對(duì)象,SLAB對(duì)象池就會(huì)把這個(gè)剛剛釋放,駐留在高速緩存中的對(duì)象分配給內(nèi)核使用,訪問(wèn)起來(lái)速度會(huì)更快。
- 伙伴系統(tǒng)只能分配2^ORDER物理內(nèi)存頁(yè),這會(huì)引起占用高速緩存以及TLB的空間較大,導(dǎo)致一些不重要的數(shù)據(jù)駐留在CPU高速緩存行中占用寶貴的緩存空間,而重要的數(shù)據(jù)被置換中內(nèi)存中,slab對(duì)象池針對(duì)小內(nèi)存分配場(chǎng)景??梢杂行У谋苊膺@一點(diǎn)。
- 調(diào)用伙伴系統(tǒng)的操作會(huì)對(duì)CPU高速緩存L1CACHE中的Instruction Cache和 Data Cache有污染,因?yàn)榛锇橄到y(tǒng)的長(zhǎng)鏈路調(diào)用,相關(guān)的一些指令和數(shù)據(jù)必然會(huì)填充到Instruction Cache 和 Data Cache 中,從而將頻繁使用的一些指令和數(shù)據(jù)擠壓出去,造成緩存污染。
- 使用slab對(duì)象池可以充分利用CPU高速緩存,避免多個(gè)對(duì)象同一cache line的征用。
三、內(nèi)核中使用slab對(duì)象池的地方
?
-
fork 內(nèi)核需要使用task_struct專屬的slab對(duì)象池分配task_struct對(duì)象
tsk = alloc_task_struct_node(node)
-
為進(jìn)程創(chuàng)建虛擬內(nèi)存空間是,內(nèi)核使用mm_struct專屬的slab對(duì)象池分配mm_struct對(duì)象。
struct mm_struct * mm = allocate_mm()
-
向高速緩存page cache查找對(duì)應(yīng)的文件緩存頁(yè)時(shí),內(nèi)核需要使用struct page專屬的slab對(duì)象池分配
?struct page *page = __page_cache_alloc(gfp_mask)
-
使用open打開文件時(shí),內(nèi)核需要使用struct file 專屬的slab對(duì)象池分配 struct file對(duì)象
?struct file *flip = alloc_empty_file()
-
socket對(duì)象
newsock = sock_alloc();
四、slab內(nèi)核設(shè)計(jì)
- slab對(duì)象池可根據(jù)情況向伙伴系統(tǒng)一次性申請(qǐng)一頁(yè)或多個(gè)內(nèi)存頁(yè)。?
- 對(duì)象的object size可以是任意的,并不是內(nèi)存對(duì)齊的,CPU訪問(wèn)沒(méi)有對(duì)齊的內(nèi)存比訪問(wèn)對(duì)齊的內(nèi)存速度要慢一倍。不能簡(jiǎn)單按照尺寸object size來(lái)劃分內(nèi)存塊,需要考慮對(duì)象內(nèi)存地址要按照 word size進(jìn)行對(duì)齊。
- 內(nèi)核為了應(yīng)對(duì)內(nèi)存讀寫越界場(chǎng)景,在內(nèi)存周圍插入了一段不可訪問(wèn)的內(nèi)存區(qū)域,這些內(nèi)存區(qū)域使用特定字節(jié)0xbb填充,當(dāng)進(jìn)程訪問(wèn)到內(nèi)存是0xbb時(shí),表示已經(jīng)越界訪問(wèn)了,這段內(nèi)存區(qū)域在slab術(shù)語(yǔ)為 red zone??梢岳斫鉃榧t色警戒區(qū)。
?
學(xué)習(xí)參考
https://xxetb.xetslk.com/s/9SQuY
?
?