成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux 內(nèi)存分配流程及 Kmalloc 解析

系統(tǒng) Linux
在 start_kernel 內(nèi)核初始化函數(shù)中,一共調(diào)用 86 個函數(shù)去初始化,其中有一個 mm_init 函數(shù),用以初始化內(nèi)存。

[[429035]]

上一次咱們分析了 Linux 的啟動流程和初始化流程,今天主要分析一下內(nèi)存方面的初始化和常見的內(nèi)存分配方式。

在 start_kernel 內(nèi)核初始化函數(shù)中,一共調(diào)用 86 個函數(shù)去初始化,其中有一個 mm_init 函數(shù),用以初始化內(nèi)存。

  1. start_kernel 
  2.     |--->mm_init 
  3.         |--->mem_init 

linux4.14/init/main.c

在 mem_init 函數(shù)中會初始化伙伴系統(tǒng)和 slab 分配器。

先說兩個概念:

外部碎片:有一段小內(nèi)存,夾在兩個大內(nèi)存中間,兩個大內(nèi)存已經(jīng)被分配給進程,這一段小內(nèi)存由于過小,不夠申請者使用,就一直空閑。

內(nèi)部碎片:一個進程申請了一段內(nèi)存,可是這個進程從來沒有全部使用,一直有最后的一段內(nèi)存沒有使用。

為了解決這兩個問題,就出現(xiàn)了伙伴系統(tǒng)和 slab 分配器?;锇橄到y(tǒng)解決外部碎片問題,slab 分配器解決內(nèi)部碎片問題。

1、伙伴系統(tǒng)基于頁分配,一次分配多頁,這樣就不會出現(xiàn)夾在中間的小內(nèi)存。

2、slab 分配器基于字節(jié)來分配,特別適用于需要頻繁分配幾十個字節(jié)的結(jié)構(gòu)體,我們經(jīng)常使用的 kmalloc 就是基于 slab 分配器。

3、其實所有的分配方式最底層都是伙伴系統(tǒng),它先分配好一段大的內(nèi)存,然后 slab 再從其中分配小的內(nèi)存。

具體分析請看鏈接:

https://www.cnblogs.com/arnoldlu/p/8251333.html

這里列出了常見的內(nèi)存分配 API 接口。

其中最常用的就是 malloc 和 kmalloc,區(qū)別在于一個在用戶空間,一個在內(nèi)核空間,并且 kmalloc 的使用需要注意競爭,需要指明 flag 。

  1. void *kmalloc(size_t sizeint flags); 

內(nèi)核編程(驅(qū)動編程)一定要注意競爭問題,重要的數(shù)據(jù)或者內(nèi)存使用前后一定要加鎖。

在 kmalloc 的使用過程中,常用標(biāo)志位:GFP_KERNEL、GFP_ATOMIC、GFP_USER、GFP_HIGHUSER、GFP_NOIO、GFP_NOFS。

前兩個最常用,GFP_KERNEL 代表在使用 kmalloc 分配內(nèi)存時,如果內(nèi)存準(zhǔn)備不足,會等待,也就是會睡眠。GFP_ATOMIC 代表使用 kmalloc 分配內(nèi)存時,如果內(nèi)存準(zhǔn)備不足,會立刻返回,不會引起睡眠,適合在中斷上下文或者進程上下文中使用。

補充:

1、基于 slab 分配器,出現(xiàn)了 slob 和 slub 分配器。在多核大系統(tǒng)大內(nèi)存中,一般使用 slub 分配器,在極小的嵌入式系統(tǒng)中,一般使用 slob 分配器(只有600多行代碼)。

2、有的人可能知道 Linux 有一個 bootmem 分配器,這個是在Linux初始化過程中的一個臨時分配器,他會在 setup_arch 函數(shù)中初始化,然后在 mm_init 中關(guān)掉,只是在伙伴系統(tǒng)出現(xiàn)之前的臨時使用。

bootmem 分配器按塊進行分配,顆粒度很大,不夠精細,比較浪費內(nèi)存。bootmem 分配器只會在 start_kernel 函數(shù)和mm_init 函數(shù)之前存在,中間的函數(shù)會調(diào)用它進行內(nèi)存分配。

  1. start_kernel 
  2.     |--->setup_arch 
  3.         |--->paging_init 
  4.             |--->bootmem_init 

 

責(zé)任編輯:武曉燕 來源: 嵌入式Linux系統(tǒng)開發(fā)
相關(guān)推薦

2010-09-25 14:12:50

Java內(nèi)存分配

2012-01-11 10:45:57

JavaJVM

2019-09-04 15:31:04

JVM內(nèi)存String

2023-10-18 13:31:00

Linux內(nèi)存

2010-09-26 14:55:46

JVM內(nèi)存監(jiān)控

2013-10-12 13:01:51

Linux運維內(nèi)存管理

2013-10-12 11:15:09

Linux運維內(nèi)存管理

2025-06-09 04:00:00

2010-03-09 13:10:08

Linux特殊用戶權(quán)限

2023-10-17 00:01:34

Linux操作系統(tǒng)

2023-04-03 08:25:02

Linux內(nèi)存slub

2021-07-30 07:22:51

JVM虛擬機棧 Stack

2022-01-07 13:50:55

語言內(nèi)存代碼

2023-12-22 07:55:38

Go語言分配策略

2010-02-22 08:58:35

JVM內(nèi)存模型垃圾收集

2021-07-14 10:00:32

Python內(nèi)存測量

2021-04-24 09:02:36

Linux 內(nèi)存分配

2023-12-27 13:55:00

C++內(nèi)存分配機制new

2021-03-30 10:50:18

Linux內(nèi)存命令

2021-02-28 13:22:54

Java內(nèi)存代碼
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品成人一区二区三区吃奶 | 成人在线精品视频 | 精精国产xxxx视频在线播放7 | 国产成人精品区一区二区不卡 | 91视频在线看 | 日韩一区二区三区在线视频 | 毛片一级片 | 欧美日韩亚洲视频 | 一区二区三区免费 | 欧美精品一区二区在线观看 | 国产1区在线| 日本黄色不卡视频 | 日韩一区二区三区在线观看 | 美女高潮网站 | 99pao成人国产永久免费视频 | www.887色视频免费 | 午夜免费福利电影 | www.夜夜骑 | 91视频一区二区三区 | 一区二区精品 | 日韩精品一区二 | 日韩一区二区在线视频 | 少妇无套高潮一二三区 | 久久精品国产精品青草 | 美女在线国产 | 欧美日韩国产精品一区 | 久久丁香 | 日韩国产欧美在线观看 | 中文字幕在线一区 | 视频在线一区二区 | 伦理片97 | 国产高清精品一区二区三区 | 九九综合九九 | 国产伦精品一区二区三区照片91 | 亚洲欧美成人影院 | 毛片入口 | 欧美一区免费在线观看 | 波多野结衣一区二区三区 | 久久高清国产 | 国产黑丝av| 国产美女福利在线观看 |