談談malloc

李肖遙 2023-08-08 22:07
? ? 關注、星標公眾號,直達精彩內容

來源:網絡素材




面試的時候經常會被問到 malloc 的實現。從操作系統層面來說,malloc 確實是考察面試者對操作系統底層的存儲管理理解的一個很好的方式,涉及到虛擬內存、分頁/分段等。下面逐個細說。

1. 虛擬內存

首先需要知道的是程序運行起來的話需要被加載的物理內存中,具體到計算機硬件就是內存條。操作系統啟動的時候先把自己加載到物理內存的固定位置(一般為底部),物理內存的其他位置就用來運行用戶程序。程序就是一堆指令,程序運行可以簡單抽象為把指令加載到內存中,然后 CPU 將指令從內存載入執行。

1. 為什么需要虛擬內存?

CPU 對內存的尋址最簡單的方式就是直接使用物理內存地址,這種方式一般叫做物理尋址。早期的 PC 使用物理尋址,而且像數字信號處理器、嵌入式微控制器也使用物理尋址。物理尋址的好處是簡單,壞處也有很多,比如:

不安全:操作系統的地址直接暴露給用戶程序,用戶程序可以破壞操作系統。這種解決方案是采用特殊的硬件保護。

同時運行多個程序比較困難:多個用戶程序如果都直接引用物理地址,很容易互相干擾。那么是不是可以通過不斷交換物理內存和磁盤來保證物理內存某一時間自由一個程序在運行呢?當時是可以的,但是這引入很多不必要和復雜的工作。

用戶程序大小受限:受制于物理內存大小。我們現在的錯覺是應用程序大小都小于物理內存,這主要是因為現在 PC 的物理內存都比較大。實際上只有 1G 物理內存的 PC 是可以運行 2G 的應用程序的。


綜合上面各種缺點,虛擬內存出現了。

2. 虛擬內存概覽

虛擬內存的基本思想是:每個程序擁有獨立的地址空間(也就是虛擬內存地址,或者稱作虛擬地址),互不干擾。地址空間被分割成多個塊,每一塊稱作一頁(page),每一頁有連續的地址范圍。虛擬地址的頁被映射到物理內存(通過 MMU,Memory Management Unit),但是并不是所有的頁都必須在內存中才能運行程序。當程序引用到一部分在物理內存中的地址空間時,由硬件立刻執行必要的映射。當程序引用到一部分不在物理內存中的地址空間時,由操作系統負責將確實的部分裝入物理內存。虛擬地址尋址(也叫做虛擬尋址)的示意圖如下。



3.虛擬內存實現

1.虛擬內存大小

一般是和 CPU 字長相關,比如 32 位對應的虛擬地址空間大小為:0 ~ 2^31。

2. MMU

CPU 將虛擬地址發送給 MMU,然后 MMU 將虛擬地址翻譯成物理地址,再尋址物理內存。那么虛擬地址和物理地址具體是怎么映射的呢?完成映射還需要另一個重要的數據結構的參與:頁表(page table)。頁表完成虛擬地址和物理地址的映射,MMU 每次翻譯的時候都需要讀取頁表。頁表的一種簡單表示如下。



這里頁大小為 p 位。虛擬內存的頁和物理內存的頁大小一樣。虛擬地址的高 n-p 位,又叫做虛擬頁號(Virtual Page Number, VPN),用來索引物理頁號(Physical Page Number,PPN),最后將 PPN 和低 p 位組合在一起就得到了物理地址。

3. 頁表的兩個問題

前面說到用 VPN 來做頁表索引,也就是說頁表的大小為虛擬地址位數 / 頁的大小。比如 32 位機器,頁大小一般為 4K ,則頁表項有 2^32 / 2^12 = 2^20 條目。如果機器字長 64 位,頁表項就更多了。那么怎么解決呢?一般有兩種方法:

  1. 倒排頁表。物理頁號做索引,映射到多個虛擬地址。通過虛擬地址查找的時候就需要通過虛擬地址的中間幾位來做索引了。

  2. 多級頁表。以兩級頁表為例。一級頁表中的每個 PTE (page table entry)映射虛擬地址空間的一個 4MB 的片,每一片由1024 個連續的頁面組成。一級 PTE 指向二級頁表的基址。這樣 32 位地址空間使用 1024 個一級 PTE 就可以表示。需要的二級頁表總條目還是 2^32 / 2^12 = 2^20 個。這里的關鍵在于如果一級 PTE i 中的頁面都未被分配,一級 PTE 就為空。多級頁面的一個簡單示意圖如下。



多級頁表減少內存占用的關鍵在于:

  1. 如果一級頁表中的一個 PTE 為空,那么相應的二級頁表就根本不會存在。這是一種巨大的潛在節約。

  2. 只有一級頁表才需要常駐內存。虛擬內存系統可以在需要時創建、頁面調入或者調出二級頁表,從而減輕內存的壓力。

第二個問題是頁表是在內存中,而 MMU 位于 CPU 芯片中,這樣每次地址翻譯可能都需要先訪問一次內存中的頁表(CPU L1,L2,L3 Cache Miss 的時候訪問內存),效率非常低下。對應的解決方案是引入頁表的高速緩存:TLB(Translation Lookaside Buffer)。加入 TLB,整個虛擬地址翻譯的過程如下兩圖所示。




關于虛擬內存還有一些內容比如 page fault 處理,這里就不再贅述了。

2. 分段

1. 分段概述

前面介紹了分頁內存管理,可以說通過多級頁表,TLB 等,分頁內存管理方法已經相當不錯了。那么分頁有什么缺點呢?

共享困難:通過共享頁面來實現共享當然是可以的。這里的問題在于我們要保證頁面上只包含可以共享的內容并不是一件容易的事兒,因為進程空間是直接映射到頁面上的。這樣一個頁面上很可能包含不能共享的內容(比如既包含代碼又包含數據,代碼可以共享,而數據不能共享)。早期的 PDP-11 實現的一種解決方法是為指令和數據設置分離的地址空間,分別稱為 I 空間和 D 空間(其實這已經和分段很像了)。

程序地址空間受限于虛擬地址:我們將程序全部映射到一個統一的虛擬地址的問題在于不好擴張。不如我們程序的地址按先代碼放在一起,然后把數據放在一起,然后再放 XXX,這樣其中某一部分的空間擴張起來都會影響到相鄰的空間,非常不方便。

上面的問題一個比較直觀的解決方法是提供多個獨立的地址空間,也就是段(segment)。每個段的長度視具體的段不同而不同,而且是可以在運行期動態改變的。因為每個段都構成了一個獨立的地址空間,所以它們可以獨立的增長或者減小而不會影響到其他的段。如果一個段比較大,把它整個保存到內存中可能很不方便甚至是不可能的,因此可以對段采用分頁管理,只有那些真正需要的頁面才會被調入內存。



采用分段和分頁結合的方式管理內存,一個地址由兩個部分組成:段和段內地址。段內地址又進一步分為頁號和頁偏移。在進行內存訪問時,過程如下:

  1. 根據段號找到段描述符(存放段基址)。

  2. 檢查該段的頁表是否在內存中。如果在,則找到它的位置,如果不在,則產生段錯誤。

  3. 檢查所請求的虛擬頁面的頁表項,如果該頁面不在內存中則產生缺頁中斷,如果在內存中就從頁表項中取出這個頁面在內存中的起始地址。

  4. 將頁面起始地址和偏移量進行拼接得到物理地址,然后完成讀寫。

2. 進程的段

每個 Linux 程序都有一個運行時內存映像,也就是各個段的布局,簡單如下圖所示。



注意上圖只是一個相對位置圖,實際上這些段并不是相鄰的。主要的段包括只讀代碼段、讀寫段、運行時堆、用戶棧。在分配棧、堆段運行時地址的時候,鏈接器會使用空間地址空間布局隨機化(ASLR),但是相對位置不會變。上圖中 .data 等是對應進程中的不同數據的 section ,或者叫做節。簡介如下。

  • .text: 已編譯程序的機器代碼。

  • .rodata: 只讀數據。

  • .data: 已初始化的全局和靜態變量。局部變量保存在棧上。

  • .bss: 未初始化的全局和靜態變量,以及所有被初始化為 0 的全局或者靜態變量。在目標文件中這個節不占據實際的空間,它僅僅是一個占位符。

3. malloc 實現

1. 堆內存管理

我們常說的 malloc 函數是 glibc 提供的庫函數。glibc 的內存管理使用的方法是 ptmalloc,除此之后還有很多其他內存管理方案,比如 tcmalloc (golang 使用的就是 tcmalloc)。

ptmalloc 對于申請內存小于 128KB 時,分配是在堆段,使用系統調用 brk() 或者 sbrk()。如果大于 128 KB 的話,分配在映射區,使用系統調用 mmap()。

2. brk, sbrk

在堆段申請的話,使用系統調用 brk 或者 sbrk。

int brk(const void *addr); void *sbrk(intptr_t incr);

brk 將 brk 指針放置到指定地址處,成功返回 0,否則返回 -1。sbrk 將 brk 指針向后移動指定字節,返回依賴于系統實現,或者返回移動前的 brk 位置,或者返回移動后的 brk 位置。下面使用 sbrk 實現一個巨簡單的 malloc。

void *malloc(size_t size) {

void *p = sbrk(0);

void *request = sbrk(size);

if (request == (void*) -1) {

return NULL; // sbrk failed.

} else {

assert(p == request); // Not thread safe.

return p;

}

}

3. mmap

linux 系統調用 mmap 將一個文件或者其它對象映射進內存。

#include

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

mmap 的 flags 可選多種參數,當選擇 MAP_ANONYMOUS 時,不需要傳入文件描述符,malloc 使用的就是 MAP_ANONYMOUS 模式。mmap 申請的內存在操作系統的映射區。比如 32 位系統,映射區從 3G 虛擬地址粗向下生長,但是因為程序的其他段也會占用空間(比如代碼段必須以特定的地址開始),所以并不能申請 3G 的大小。

4. malloc 和物理內存有關系嗎?

可以說沒關系,malloc 申請的地址是線性地址,申請的時候并沒有進行映射。訪問到的時候觸發缺頁異常,這個時候才會進行物理地址映射。

5. ptmalloc

Malloc實現原理:

因為brk、sbrk、mmap都屬于系統調用,若每次申請內存,都調用這三個,那么每次都會產生系統調用,影響性能;其次,這樣申請的內存容易產生碎片,因為堆是從低地址到高地址,如果高地址的內存沒有被釋放,低地址的內存就不能被回收。

所以malloc采用的是內存池的管理方式(ptmalloc),Ptmalloc 采用邊界標記法將內存劃分成很多塊,從而對內存的分配與回收進行管理。為了內存分配函數malloc的高效性,ptmalloc會預先向操作系統申請一塊內存供用戶使用,當我們申請和釋放內存的時候,ptmalloc會將這些內存管理起來,并通過一些策略來判斷是否將其回收給操作系統。這樣做的最大好處就是,使用戶申請和釋放內存的時候更加高效,避免產生過多的內存碎片。

chunk 內存塊的基本組織單元

在 ptmalloc 的實現源碼中定義結構體 malloc_chunk 來描述這些塊。malloc_chunk 定義如下:

1.struct malloc_chunk {
2. INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */
3. INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */
4.
5. struct malloc_chunk* fd; /* double links -- used only if free. */
6. struct malloc_chunk* bk;
7.
8. /* Only used for large blocks: pointer to next larger size. */
9. struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
10. struct malloc_chunk* bk_nextsize;
11.};

chunk 的定義相當簡單明了,對各個域做一下簡單介紹 :

prev_size: 如果前一個 chunk 是空閑的,該域表示前一個 chunk 的大小,如果前一個 chunk 不空閑,該域無意義。

size :當前 chunk 的大小,并且記錄了當前 chunk 和前一個 chunk 的一些屬性,包括前一個 chunk 是否在使用中,當前 chunk 是否是通過 mmap 獲得的內存,當前 chunk 是否屬于非主分配區。

fd 和 bk :指針 fd 和 bk 只有當該 chunk 塊空閑時才存在,其作用是用于將對應的空閑 chunk 塊加入到空閑chunk 塊鏈表中統一管理,如果該 chunk 塊被分配給應用程序使用,那么這兩個指針也就沒有用(該 chunk 塊已經從空閑鏈中拆出)了,所以也當作應用程序的使用空間,而不至于浪費。

fd_nextsize 和 bk_nextsize: 當當前的 chunk 存在于 large bins 中時, large bins 中的空閑 chunk 是按照大小排序的,但同一個大小的 chunk 可能有多個,增加了這兩個字段可以加快遍歷空閑 chunk ,并查找滿足需要的空閑 chunk , fd_nextsize 指向下一個比當前 chunk 大小大的第一個空閑 chunk , bk_nextszie 指向前一個比當前 chunk 大小小的第一個空閑 chunk 。如果該 chunk 塊被分配給應用程序使用,那么這兩個指針也就沒有用(該chunk 塊已經從 size 鏈中拆出)了,所以也當作應用程序的使用空間,而不至于浪費。

chunk的結構

chunk的結構可以分為使用中的chunk和空閑的chunk。使用中的chunk和空閑的chunk數據結構基本項同,但是會有一些設計上的小技巧,巧妙的節省了內存。

使用中的chunk:



說明:

1、 chunk指針指向chunk開始的地址;mem指針指向用戶內存塊開始的地址。

2、 p=0時,表示前一個chunk為空閑,prev_size才有效

3、p=1時,表示前一個chunk正在使用,prev_size無效 p主要用于內存塊的合并操作;ptmalloc 分配的第一個塊總是將p設為1, 以防止程序引用到不存在的區域

4、M=1 為mmap映射區域分配;M=0為heap區域分配

5、 A=0 為主分配區分配;A=1 為非主分配區分配。

空閑的chunk:



說明:

1、當chunk空閑時,其M狀態是不存在的,只有AP狀態,

2、原本是用戶數據區的地方存儲了四個指針,

指針fd指向后一個空閑的chunk,而bk指向前一個空閑的chunk,malloc通過這兩個指針將大小相近的chunk連成一個雙向鏈表。

在large bin中的空閑chunk,還有兩個指針,fd_nextsize和bk_nextsize,用于加快在large bin中查找最近匹配的空閑chunk。不同的chunk鏈表又是通過bins或者fastbins來組織的。

空閑鏈表bins

當用戶使用free函數釋放掉的內存,ptmalloc并不會馬上交還給操作系統,而是被ptmalloc本身的空閑鏈表bins管理起來了,這樣當下次進程需要malloc一塊內存的時候,ptmalloc就會從空閑的bins上尋找一塊合適大小的內存塊分配給用戶使用。這樣的好處可以避免頻繁的系統調用,降低內存分配的開銷。

malloc將相似大小的chunk用雙向鏈表鏈接起來,這樣一個鏈表被稱為一個bin。ptmalloc一共維護了128bin。每個bins都維護了大小相近的雙向鏈表的chunk。基于chunk的大小,有下列幾種可用bins:

1、Fast bin

2、Unsorted bin

3、Small bin

4、Large bin 

保存這些bin的數據結構為:

fastbinsY:這個數組用以保存fast bins。

bins:這個數組用以保存unsorted、small以及large bins,共計可容納126個:

當用戶調用malloc的時候,能很快找到用戶需要分配的內存大小是否在維護的bin上,如果在某一個bin上,就可以通過雙向鏈表去查找合適的chunk內存塊給用戶使用。


1. fast bins。

程序在運行時會經常需要申請和釋放一些較小的內存空間。當分配器合并了相鄰的幾個小的 chunk 之后,也許馬上就會有另一個小塊內存的請求,這樣分配器又需要從大的空閑內存中切分出一塊,這樣無疑是比較低效的,故而,malloc 中在分配過程中引入了 fast bins,

fast bins是bins的高速緩沖區,大約有10個定長隊列。每個fast bin都記錄著一條free chunk的單鏈表(稱為binlist ,采用單鏈表是出于fast bin中鏈表中部的chunk不會被摘除的特點),增刪chunk都發生在鏈表的前端。fast bins 記錄著大小以8字節遞增的bin鏈表。

當用戶釋放一塊不大于max_fast(默認值64B)的chunk的時候,會默認會被放到fast bins上。當需要給用戶分配的 chunk 小于或等于 max_fast 時,malloc 首先會到fast bins上尋找是否有合適的chunk,

除非特定情況,兩個毗連的空閑chunk并不會被合并成一個空閑chunk。不合并可能會導致碎片化問題,但是卻可以大大加速釋放的過程!

分配時,binlist中被檢索的第一個chunk將被摘除并返回給用戶。free掉的chunk將被添加在索引到的binlist的前端。



2. unsorted bin。

unsorted bin 的隊列使用 bins 數組的第一個,是bins的一個緩沖區,加快分配的速度。當用戶釋放的內存大于max_fast或者fast bins合并后的chunk都會首先進入unsorted bin上。chunk大小 – 無尺寸限制,任何大小chunk都可以添加進這里。這種途徑給予 ‘glibc malloc’ 第二次機會以重新使用最近free掉的chunk,這樣尋找合適bin的時間開銷就被抹掉了,因此內存的分配和釋放會更快一些。

用戶malloc時,如果在 fast bins 中沒有找到合適的 chunk,則malloc 會先在 unsorted bin 中查找合適的空閑 chunk,如果沒有合適的bin,ptmalloc會將unsorted bin上的chunk放入bins上,然后到bins上查找合適的空閑chunk。

3. small bins

大小小于512字節的chunk被稱為small chunk,而保存small chunks的bin被稱為small bin。數組從2開始編號,前64個bin為small bins,small bin每個bin之間相差8個字節,同一個small bin中的chunk具有相同大小。

每個small bin都包括一個空閑區塊的雙向循環鏈表(也稱binlist)。free掉的chunk添加在鏈表的前端,而所需chunk則從鏈表后端摘除。

兩個毗連的空閑chunk會被合并成一個空閑chunk。合并消除了碎片化的影響但是減慢了free的速度。

分配時,當samll bin非空后,相應的bin會摘除binlist中最后一個chunk并返回給用戶。在free一個chunk的時候,檢查其前或其后的chunk是否空閑,若是則合并,也即把它們從所屬的鏈表中摘除并合并成一個新的chunk,新chunk會添加在unsorted bin鏈表的前端。

4.large bins

大小大于等于512字節的chunk被稱為large chunk,而保存large chunks的bin被稱為large bin,位于small bins后面。large bins中的每一個bin分別包含了一個給定范圍內的chunk,其中的chunk按大小遞減排序,大小相同則按照最近使用時間排列。

兩個毗連的空閑chunk會被合并成一個空閑chunk。

分配時,遵循原則“smallest-first , best-fit”,從頂部遍歷到底部以找到一個大小最接近用戶需求的chunk。一旦找到,相應chunk就會分成兩塊User chunk(用戶請求大小)返回給用戶。

Remainder chunk(剩余大小添加到unsorted bin。free時和small bin 類似。

并不是所有chunk都按照上面的方式來組織,有三種列外情況。top chunk,mmaped chunk 和last remainder chunk

1. Top chunk

top chunk相當于分配區的頂部空閑內存,當bins上都不能滿足內存分配要求的時候,就會來top chunk上分配。

當top chunk大小比用戶所請求大小還大的時候,top chunk會分為兩個部分:User chunk(用戶請求大小)和Remainder chunk(剩余大小)。其中Remainder chunk成為新的top chunk。

當top chunk大小小于用戶所請求的大小時,top chunk就通過sbrk(main arena)或mmap(thread arena)系統調用來擴容。

2. mmaped chunk

當分配的內存非常大(大于分配閥值,默認128K)的時候,需要被mmap映射,則會放到mmaped chunk上,當釋放mmaped chunk上的內存的時候會直接交還給操作系統。

3、Last remainder chunk

Last remainder chunk是另外一種特殊的chunk,就像top chunk和mmaped chunk一樣,不會在任何bins中找到這種chunk。當需要分配一個small chunk,但在small bins中找不到合適的chunk,如果last remainder chunk的大小大于所需要的small chunk大小,last remainder chunk被分裂成兩個chunk,其中一個chunk返回給用戶,另一個chunk變成新的last remainder chunk。

sbrk與mmap

在堆區中, start_brk 指向 heap 的開始,而 brk 指向 heap 的頂部。可以使用系統調用 brk()和 sbrk()來增 加標識 heap 頂部的 brk 值,從而線性的增加分配給用戶的 heap 空間。在使 malloc 之前,brk 的值等于 start_brk,也就是說 heap 大小為 0。

ptmalloc 在開始時,若請求的空間小于 mmap 分配閾值(mmap threshold,默認值為 128KB)時,主分配區會調用 sbrk()增加一塊大小為 (128 KB + chunk_size) align 4KB 的空間作為 heap。非主分配區會調用 mmap 映射一塊大小為 HEAP_MAX_SIZE(32 位系統上默認為 1MB,64 位系統上默認為 64MB)的空間作為 sub-heap。這就是前面所說的 ptmalloc 所維護的分配空間;   

當用戶請求內存分配時,首先會在這個區域內找一塊合適的 chunk 給用戶。當用戶釋放了 heap 中的 chunk 時,ptmalloc 又會使用 fastbins 和 bins 來組織空閑 chunk。以備用戶的下一次分配。

若需要分配的 chunk 大小小于 mmap分配閾值,而 heap 空間又不夠,則此時主分配區會通過 sbrk()調用來增加 heap 大小,非主分配區會調用 mmap 映射一塊新的 sub-heap,也就是增加 top chunk 的大小,每次 heap 增加的值都會對齊到 4KB。當用戶的請求超過 mmap 分配閾值,并且主分配區使用 sbrk()分配失敗的時候,或是非主分配區在 top chunk 中不能分配到需要的內存時,ptmalloc 會嘗試使用 mmap()直接映射一塊內存到進程內存空間。使用 mmap()直接映射的 chunk 在釋放時直接解除映射,而不再屬于進程的內存空間。任何對該內存的訪問都會產生段錯誤。而在 heap 中或是 sub-heap 中分配的空間則可能會留在進程內存空間內,還可以再次引用(當然是很危險的)。

內存分配malloc流程

獲取分配區的鎖,防止多線程沖突。

計算出實際需要分配的內存的chunk實際大小。

判斷chunk的大小,如果小于max_fast(64B),則嘗試去fast bins上取適合的chunk,如果有則分配結束。否則,下一步;

判斷chunk大小是否小于512B,如果是,則從small bins上去查找chunk,如果有合適的,則分配結束。否則下一步;

ptmalloc首先會遍歷fast bins中的chunk,將相鄰的chunk進行合并,并鏈接到unsorted bin中然后遍歷 unsorted bins。如果unsorted bins上只有一個chunk并且大于待分配的chunk,則進行切割,并且剩余的chunk繼續扔回unsorted bins;如果unsorted bins上有大小和待分配chunk相等的,則返回,并從unsorted bins刪除;如果unsorted bins中的某一chunk大小 屬于small bins的范圍,則放入small bins的頭部;如果unsorted bins中的某一chunk大小 屬于large bins的范圍,則找到合適的位置放入。若未分配成功,轉入下一步;

從large bins中查找找到合適的chunk之后,然后進行切割,一部分分配給用戶,剩下的放入unsorted bin中。

如果搜索fast bins和bins都沒有找到合適的chunk,那么就需要操作top chunk來進行分配了

當top chunk大小比用戶所請求大小還大的時候,top chunk會分為兩個部分:User chunk(用戶請求大小)和Remainder chunk(剩余大小)。其中Remainder chunk成為新的top chunk。

當top chunk大小小于用戶所請求的大小時,top chunk就通過sbrk(main arena)或mmap(thread arena)系統調用來擴容。

到了這一步,說明 top chunk 也不能滿足分配要求,所以,于是就有了兩個選擇: 如 果是主分配區,調用 sbrk(),增加 top chunk 大小;如果是非主分配區,調用 mmap 來分配一個新的 sub-heap,增加 top chunk 大小;或者使用 mmap()來直接分配。在 這里,需要依靠 chunk 的大小來決定到底使用哪種方法。判斷所需分配的 chunk 大小是否大于等于 mmap 分配閾值,如果是的話,則轉下一步,調用 mmap 分配, 否則跳到第 10 步,增加 top chunk 的大小。

使用 mmap 系統調用為程序的內存空間映射一塊 chunk_size align 4kB 大小的空間。然后將內存指針返回給用戶。

判斷是否為第一次調用 malloc,若是主分配區,則需要進行一次初始化工作,分配 一塊大小為(chunk_size + 128KB) align 4KB 大小的空間作為初始的 heap。若已經初 始化過了,主分配區則調用 sbrk()增加 heap 空間,分主分配區則在 top chunk 中切 割出一個 chunk,使之滿足分配需求,并將內存指針返回給用戶。

簡而言之:獲取分配區(arena)并加鎖–> fast bin –> unsorted bin –> small bin –> large bin –> top chunk –> 擴展堆

內存回收流程

獲取分配區的鎖,保證線程安全。

如果free的是空指針,則返回,什么都不做。

判斷當前chunk是否是mmap映射區域映射的內存,如果是,則直接munmap()釋放這塊內存。前面的已使用chunk的數據結構中,我們可以看到有M來標識是否是mmap映射的內存。

判斷chunk是否與top chunk相鄰,如果相鄰,則直接和top chunk合并(和top chunk相鄰相當于和分配區中的空閑內存塊相鄰)。轉到步驟8

如果chunk的大小大于max_fast(64b),則放入unsorted bin,并且檢查是否有合并,有合并情況并且和top chunk相鄰,則轉到步驟8;沒有合并情況則free。

如果chunk的大小小于 max_fast(64b),則直接放入fast bin,fast bin并沒有改變chunk的狀態。沒有合并情況,則free;有合并情況,轉到步驟7

在fast bin,如果當前chunk的下一個chunk也是空閑的,則將這兩個chunk合并,放入unsorted bin上面。合并后的大小如果大于64B,會觸發進行fast bins的合并操作,fast bins中的chunk將被遍歷,并與相鄰的空閑chunk進行合并,合并后的chunk會被放到unsorted bin中,fast bin會變為空。合并后的chunk和topchunk相鄰,則會合并到topchunk中。轉到步驟8

判斷top chunk的大小是否大于mmap收縮閾值(默認為128KB),如果是的話,對于主分配區,則會試圖歸還top chunk中的一部分給操作系統。free結束。

使用注意事項

為了避免Glibc內存暴增,需要注意:

1. 后分配的內存先釋放,因為ptmalloc收縮內存是從top chunk開始,如果與top chunk相鄰的chunk不能釋放,top chunk以下的chunk都無法釋放。

2. Ptmalloc不適合用于管理長生命周期的內存,特別是持續不定期分配和釋放長生命周期的內存,這將導致ptmalloc內存暴增。

3. 不要關閉 ptmalloc 的 mmap 分配閾值動態調整機制,因為這種機制保證了短生命周期的 內存分配盡量從 ptmalloc 緩存的內存 chunk 中分配,更高效,浪費更少的內存。

4. 多線程分階段執行的程序不適合用ptmalloc,這種程序的內存更適合用內存池管理

5. 盡量減少程序的線程數量和避免頻繁分配/釋放內存。頻繁分配,會導致鎖的競爭,最終導致非主分配區增加,內存碎片增高,并且性能降低。

6. 防止內存泄露,ptmalloc對內存泄露是相當敏感的,根據它的內存收縮機制,如果與top chunk相鄰的那個chunk沒有回收,將導致top chunk一下很多的空閑內存都無法返回給操作系統。

7. 防止程序分配過多的內存,或是由于glibc內存暴增,導致系統內存耗盡,程序因為OOM被系統殺掉。預估程序可以使用的最大物理內存的大小,配置系統的/proc/sys/vm/overcommit_memory ,/proc/sys/vm/overcommit_ratio,以及使用ulimit -v限制程序能使用的虛擬內存的大小,防止程序因OOM被殺死掉。


版權聲明:本文來源網絡,免費傳達知識,版權歸原作者所有。如涉及作品版權問題,請聯系我進行刪除。

???????????????? ?END ????????????????

關注我的微信公眾號,回復“加群”按規則加入技術交流群。


點擊“閱讀原文”查看更多分享,歡迎點分享、收藏、點贊、在看。

李肖遙 公眾號“技術讓夢想更偉大”,作者:李肖遙,專注嵌入式,只推薦適合你的博文,干貨,技術心得,與君共勉。
評論
  • 摘要在防爆電氣設計中,只參照芯數選型而忽略額定載流量,長期滿負荷運行會出現插頭發熱、接觸面氧化、IP67 密封受熱老化等問題。結合常用 3 針 3 孔、4 芯、5PIN、8PIN 圓形防爆連接器,制作分級電流參數對照表,區分冷壓免焊接、焊接兩種接線結構的安全載流數值,設置合理電流冗余系數,搭配使用環境修正參數,規范防爆接近開關連接器、防爆法蘭插座的選型計算方式。關鍵詞圓形防爆連接器,載流參數表,防爆法蘭插座,防爆端子接頭,IP67 防爆防水接插件1 產品概述圓形防爆連接器觸點載流能力由插針直徑、
    kyfbest科迎法電氣 2026-08-03 09:18 128644瀏覽
  • 導語在現代高速數字電路設計中,信號的完整性已不僅是理想波形推演,而是一場與物理非理想特性正面博弈的工程實踐。濾波器芯片作為凈化傳輸鏈路的關鍵屏障,其核心挑戰在于:能否有效識別并濾除那些隱匿在電平跳變過程中的亞納秒級瞬態脈沖干擾,這類干擾持續極短,卻足以在高速鏈路中引發誤觸發。然而,傳統函數發生器受限于采樣率與邊沿速率,根本無法忠實復現如此狹窄且陡峭的異常波形。針對此困境,德思特TS-AWG7000系列任意波形發生器以17 GS/s采樣率與50 ps原生邊沿速度,為瞬態脈沖提供精細刻畫,配合SPG
    德思特測試測量 2026-08-05 14:06 5瀏覽
  • ?摘要:低價大流量卡正全面退市,政策收緊已成定局。面對傳統號卡的不確定性,隨身WiFi憑借穩定連接、多設備共享、獨立設備和靈活套餐等優勢,成為務實可靠的備選方案。1、流量卡黃金時代要結束了通信行業正迎來一場前所未有的“地震式”調整——曾讓無數用戶追捧的低價大流量卡,正在全速退出各大平臺。這早已不是一次普通的競合,而是一場趨勢性的行業洗牌。回望過去,19元200G的神卡,那時真是“睡著都能笑醒”,便宜到不敢相信,爽到忍不住炫耀。那些日子,好像隨便刷、隨便看,流量自由觸手可及。可如今,回頭再看,那種
    愛上電路設計 2026-08-03 10:21 128877瀏覽
  • 文:杜杰編輯:侯煜當地時間7月28日,美國特朗普政府落地最新科技封鎖政策,美國聯邦通信委員會(FCC)正式更新《受管制清單》,新增兩大類設備——境外生產的先進機器人設備、境外生產的聯網電力逆變器。FCC在官方情況說明書中明確,該類境外制造產品,“會對美國國家安全或美國民眾的人身安全構成無法承受的風險”。本次新規設置明確豁免機制:經美國國防部(DoW)、電力逆變器品類經美國國土安全部(DHS)審核并授予“有條件批準”,認定對應設備品類不存在重大安全風險,即可獲得準入豁免。同時政策嚴格執行新老劃斷原
    華爾街科技眼 2026-08-03 21:28 325瀏覽
  • 做藍牙音箱的工程師大概都碰過這個局面。產品要連手機放歌,要本地播開機提示音和按鍵音,還要接 App 做配網和狀態上報。三件事拆開,早先的常規做法是音頻藍牙一顆料、數傳藍牙一顆料、本地播放再掛一顆小 MCU 加一片 Flash。板子越畫越大,BOM 越算越貴,待機電流和固件工作量也跟著漲。WT2605C 出來以后,這套需求可以集成到一顆芯片,就是 WT2605C-32N,該芯片采用QFN32 封裝,4×4 毫米,把音頻藍牙、BLE 數傳和 MP3 本地播放三樣全包了。對藍牙音箱來說,最實在的好處就
    唯創知音語音芯片 2026-08-06 15:14 287瀏覽
  • 產品使用18V供電,配套4串鋰離子電池,需要設計一個充電器。因為輸入18V,電池最高 16.8V,壓差僅 1.2V。因為壓差太小。使用開關型的充電控制芯片不穩定。嘗試自行設計一個。整體采用分立三極管 + TL431架構,分4個功能單元:使能控制回路、限流環路、TL431 精密恒壓反饋環路、PNP 功率管主功率輸出回路;實現完整鋰電池充電邏輯。使能控制回路按鍵按下:5V 電壓經 R12 (2kΩ) 送入 NPN 管 Q3 基極,Q3 飽和導通,對地拉低 R1、R2 組成的分壓控制節點電位;該節點直
    southcreek 2026-08-07 13:45 328瀏覽
  •        很多人只見過封裝在SMD外殼里的小尺寸晶振,卻不知道一顆2016、1612甚至1210封裝的微型石英晶振,從一塊巴掌大的石英原礦,到最終能穩定起振的成品,要經過十幾道精密工序。它內部的石英晶片厚度最薄不到20微米,比普通A4紙的1/5還薄,整個生產過程里哪怕0.1微米的誤差,都會直接廢掉整批產品,這也是小尺寸晶振過去長期依賴進口,國內廠商花了十幾年才啃下量產硬骨頭的核心原因。1. 原石定向切割:0.01度的角度誤差都不能有小尺寸晶振的第一步,
    TKD泰晶科技 2026-08-07 08:43 382瀏覽
  •                                                                        
    廣州鐵金剛 2026-08-06 17:44 111039瀏覽
  • 在前六期中,我們已經分別討論了 CRA 的適用范圍、整體影響、漏洞通報義務、風險評估與技術文檔證據鏈、第三方組件與 SBOM 供應鏈治理,以及產品上市后的支持期、安全更新、用戶說明和終止支持管理。到這里,企業已經能夠回答幾個核心問題:產品是否落入 CRA 適用范圍,產品由哪些組件構成,企業如何證明自己在設計、開發和上市前采取了必要的安全措施,以及產品上市后如何持續維護和安全下線。但對于真正準備落地 CRA 合規的企業來說,還有一個更現實的問題:CRA 的法規條文相對原則化,企業應當如何把“網絡安
    虹科云科技 2026-08-03 16:51 159971瀏覽
  • 在物聯網從“萬物互聯”邁向“萬物智聯”的進程中,LTE Cat.1憑借其在速率、成本與網絡覆蓋之間的完美平衡,正成為中低速物聯網市場的絕對主力。隨著2G/3G網絡的逐步退網以及新國標對終端設備智能化、定位功能的強制要求,Cat.1模組迎來了爆發式的增長窗口。在這一關鍵節點,基于華為海思Hi2131芯片設計的LTE Cat.1模組,憑借其在能效、射頻、架構及物理規格上的底層創新,成功打破了“高性能必高功耗”的傳統魔咒,為行業提供了極具競爭力的連接最優解。核心技術優勢:重塑Cat.1能效與連接標桿海
    用戶1778981989717 2026-08-05 21:04 169瀏覽
我要評論
0
點擊右上角,分享到朋友圈 我知道啦
請使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 年轻的母亲中国A片| 重游母亲桃花源| 深入阴宅| 隋唐英雄3电视剧| 大漠枪神电视剧全集| 女保险公司推销员8| 《决战中途岛》完整版| 曌怎么读什么意思| 电影《和部长一起去出差旅》免费观| 电视剧《雪迷宫》32集播放| 甜蜜惩罚无打马赛| 雷霆扫毒粤语百度影音| 夜倾情2012| 满天星急救护士法版2| 张学良新传| 甜蜜第二季马赛怀孕真人| 我为衣狂| 张思德的简介| 学习延安精神| 龙的传人 周星驰| 麦乐迪马克斯女超人满天星播放| 疯狂go mv| 死神来了6在线播放免费| 康保县| 长空雄鹰电影| 法国空乘4大结局| 袁咏仪电影| 《火热的监狱》完整版| 张文宏称敬佩就地过年的人| 邪恶游戏| 牙医郝板栗未删减版多少集 | 表妹在线播放| xl司令第一季全集在线| 拳皇八神庵| 电视剧妻子免费观看| 《外出》2015版| 危情24小时| 星际迷航:叛徒| 美人制造11集| 做aj电视剧免费大全| 人蛇大战1| 无所畏惧第一季电视剧免费观看| 新潘金莲龚玥菲免费版| 猎狼电影免费播放完整版| 日本空姐2019满天星法版:星辉照耀下的职业光芒 | 非凡医者电视剧免费观看| 电视剧风吹半夏全集播放| 意大利语95版泰山救珍妮| 长江七号电影免费完整版在线观看| 黑人大鸡巴干俄罗斯美女彩蝶视频 | 善良的嫂子2韩国| 水晶兰为什么叫死亡之花| 月生沧海电视剧免费观看完整版| 朱棣电视剧50集免费观看| 凌云志志法国满天星| 为时已是寿司!?| 他来自胡志明市2| 仁医国语版| 迷你小公主| 电视连续剧爱| 酒店服务生电影在线观看完整免费高清第一集 | (已屏蔽)| 双镜第二季| 《你是我的荣耀》免费观看| 私人航空| 龙胆虎威4下载| 老婆出差接待傲慢客户| 宝石战士| 龙虎少年队2 电影| 翻唱日本歌曲| 郭麒麟平凡之路| 麦乐迪女超人在线观看完整免费高清原声满天星百度云 | 香蕉视屏免费播放| 伙伴男孩韩剧免费观看| 亮剑优酷网| 《混凝土市场》| 《乳房按摩》免费观| 哥布林的窑洞第一季| 星莱克尔最经典电影| 似锦在线观看全集完整版免费播放| 青青河边草免费观看电视剧5| 戈壁母亲全集免费观看| 真白爱梨| 激情众林| 郑中基 无赖| 母与子国语免费观看大全电视剧武则| 武朝迷案| 长风渡电视剧40集免费观看高清| 陈静仪喜爱夜蒲2| 杀手之王李连杰| 法国空乘9特别版| 无尽动漫在线观看完整版 | 石敢当之雄峙天东演员表| 隐身帽子在线播放完整版电影| 初恋这件小事国语版| 金银悔1-5免费看| 国语韩剧媳妇当家| 狂飙全集免费高清| 喝茶影视《部长出差的日子》| 斗罗大陆免费完整观看207 | 《逍遥》电视剧| BBBwww| 人民的名义 电视剧| 村里来了洋媳妇| 美女的诞生高清免费观看中文版| 画皮电视剧| 兄弟打印机官网| 斗罗大陆第208集免费观看| 《急诊护士》电影在线观看 | 高清《重选纨绔当爹》短剧在线观看| 左右剧情| 深夜秋葵男人的加油站| 狄仁杰第一部全集| 我的大胸妽妽中文字幕| 银翼杀手| 《束缚游戏》免费看| 李采潭主演的电影在线视频播放| 蛇姬恋完整版在线观看| 回响电视剧在线观看全集免费| 沉静如海| 唐人街探案3电影完整版免费 | 小唐璜情史完整电影免费观看高清| 白晶晶手机在线| 高清《燕双鹰》免费观看高清| 1—5集国语版普通话| 夏目友人帐 第一季| 公浮之3电视剧免费播放在线观看| 琉璃川没落贵族第二集完整版| 高清《骨语2》免费观看| 《逆袭之爱上情敌》电视剧| 撒贝宁崔永元| 出差未婚妻遇到渣男前任日剧| 赛德克巴莱完整版电影| 法国女仆满天星美版结局| 欢乐颂1| 《伦理按摩2》电影| 绿茶妹百度影音| 牧羊曲伴奏| 致命哥罗芳| 拔萝卜电影| 一起来看流星雨6| 猎金·游戏电影| 扫黑风暴电视剧全集| 电视剧为你钟情| 《房屋销售的秘密》| 漂亮的保姆在线看| 意大利《八尺夫人》电影全集免费观看| 向往的生活第5季| 罗丽星克莱尔在线观看| 豪情夜生活| 玄女心经2免费观看全集完整版高清| 空即是色2015| 荣耀法则(啄木鸟)| 闪婚顶流短剧全集| 千金美人足小电影| 村暖花开2完整版免费观看| 狮子王动画片| 拾光的秘密| 五亿探长雷洛传1国语版免费观看| 人人都爱雷蒙德第六季| 梦寻桃花源免费观看| 宫河家的空腹| 薰衣草免费高清在线观看大全 | 欢乐喜剧人第二季| 法国空高压监狱伦理片 | 激战酒店1-80集电视剧免费播放下载| 摸摸美女全身| 丈夫和初恋重逢| 彭于晏真帅是什么瓜| 美国版荷尔蒙9 | overflower在线免费观看| 牌坊下的女人全集| 台湾《香醇的绣感》视频| 善良秘书的目的在线观看| 图书馆女朋友在线观看完整免费版电视剧第五集 | 银魂永远的万事屋| 大宋探案局| 鬼灭之刃第二季全集免费观看 | 肉蒲团演员表| 柯淳的短剧| 笑过2012| 逆光飞翔电影| 丁禹兮长乐曲电视剧免费观看 | 天地姻缘七仙女高清| 玻钻之争国语版全集优酷| 妻子的谎言电视剧全集| 僵尸道长1粤语| 一念永恒樱花版免费观看| 夺命金免费| 法国队VS葡萄牙队| 我的巴比伦恋人在线观看| 热血痴心| 法国疯马秀歌舞表演| 杰克逊最经典演唱会| 我让最想被拥抱的男人威胁了全集| 陷入热恋的我们免费观看| 夜空中最亮的星电视剧| 猎犬 第二季全集观看| 艳姆电视剧全集在线观看| 情人别我伤心哭泣| 巴基斯坦电影| 平凡的世界结局| 金瓶梅在线观看全集高清徐少强| 宝贝我想你了我的都大了404| 任贤齐版神雕侠侣| 出轨的同学会| 春咲梓美| 电视剧女婿难当| 一路向西迅雷种子| 豪情3d字幕| 高柳花嫁动漫全集樱花| 高清《宇宙面包店》电视剧| 私人家教在线观看免费完整版| 丁建华朗诵| 夏树电影免费观看完整版全集最新一| 南妹儿动感光波| 风流女管家最新电视剧全集| 土豆网电视剧情非情| 古堡女仆服务电影免费观看| 国子监来了个女弟子剧情介绍| 私人女性监狱-言情片-高清完整版-全集免费在线观看-tvb云播 | 金装的维尔动画免费观看 | 战狼6免费下载完整版| 神隐40集电视剧在线观看免费| 《美姊妹牙医》完整版 | 古代种田全集免费| 美食的俘虏374| 前田香织种子| 裤袜视界| 经典电影《香水》| 武动乾坤第6季在线播放免费| 秘密列车动漫在线观看| 赤热电视剧在线观看| 非诚勿扰20121216| 南海归墟| 约束之地| 青河绝恋全集| 我心不死| 白雪公主H版无删在线播放| 周生如故在线观看| 男按摩师三级片| 葫芦娃兄弟动画片| 乱理片性暴北越女兵在线播放| 敢死队 qvod| 奥利维亚斯帕克满天星禁忌日记短剧| 历史| 电视剧温柔的谎言| 克罗斯凯登电影作品| 弃女归家:家产归我完整版观看| 《爱我几何》电影免费| 深海利剑电视剧| 女超人电影完整版免费观看麦乐迪| 西施秘史片花| 泰迪熊在线观看| 多情小屋| 芳华高清电影免费观看| 曼娜第二部免费观看完整版| 北风那个吹在线观看免费完整版 | 甲虫王者| 超级教师3免费观看全部电视剧| 天涯杂谈| 部长出差电影日剧有哪些| 薛姨妈hi版红楼梦免费观看| 新有菜作品免费版在线看中文版免费版 | 电竞女王:大神都叫我姐短剧全集| 禁忌5年转一代| 电影流浪地球| 稷山县| 谢娜官方工作室发文道歉| 爸爸播种籽2最新版更新| 郑钦文第三轮比赛直播时间| 总统之夜1997法国版本免费观看中文 | 甜蜜蜜电视剧全集| 魔都传奇| 记忆传授人| 农场交易满天星| 恋骑士ova| 隔壁邻居很美味| 叶问 粤语| 瓜达卢佩的玫瑰电影| 私人生活艾伦里克曼| 大洼县| 奥尔多占星者| 湄公河惨案电视剧| 女生北漂5年半攒钱超100万| 木下檀檀| 纪连海 灌篮高手| 渔夫荒野史记在线播放| 车手在线观看| 站着再来一次48集全免费剧情介绍视频 | 学会夹有多重要| 李玉刚 花满楼| 反抗之真心英雄剧情| 星际迷航11百度影音| 韩国电影姐姐免费完整版| 爱唯侦察2024年最新合集| 彩翼儿童美术| 荣益守则满天星| 迈克杰克逊歌曲| 日本的妈妈| 偷香高手| 意大利电影巜丰满的欲妇| 泰山电影| 没落要塞| 舒淇主演《玉女心》电影免费观看| 酒店1-80集| 异世界来的男生泰剧免费观看全集| 蛇姬恋免费观看完整版| 一路向西电影qvod| 动感之星之妖精168集在线观看| 速7片尾曲| 在线爱我几何| 武契奇收到死亡威胁| 黛比浪漫女家教在线观看| 送你一朵小红花在线观看| 高压监狱2| 空之色水之色 快播| 僵尸道长2| 刁蛮婆婆俏媳妇| 正在播放:JUL-601 你真的是处男吗?因为发现丈夫出轨被自称童贞的男子欺骗身心 | 《我的游泳女教练》免费动漫在线看| 菜鸟老警 第八季全集观看| 一起愁愁电视剧40集在线观看| 提防小手| 先婚后爱全集免费| 高清《紫罗兰永恒花园》动漫| 我父亲的女保姆是我的首选评价| 蓝色隐形帽子完整版在线| 丽塔海华丝| 劳拉迷宫1997免费观看| 战火连天| 黑帮大佬和我365天第二部在线 | 3d铺团之极宝乐鉴宝4免费观看| 庆余年讲的什么故事| 高压监狱在线观看完整免费高清原声满天星2019美国 | 婚纱小天使粤语| 邓家佳除却巫山无删减版| 饥饿游戏2高清下载| 冰冷热带鱼 手机在线观看| 川西剿匪记电视剧全集免费观看| 同学的母亲中字ID英文| 眼线液的画法| 枞阳县| 导火线粤语| 美国式禁忌3高潮喷涌| 纯真的年代全集| 替夫还债在线观看完整| 神勇武工队传奇2017任帅| 动感之星之妖精168集全集| 龙与虎下载| 背后的故事赵薇| 丹东警方回应锁匠帮开锁被炸身亡 | 斗罗大陆剧场版 剑道尘心| 《宝莲灯前传》电视剧| 和讨厌的部长出差在线| 小菊的春天电视剧全集免费观看 | 牙医姊妹电影完整版| 仙逆108集完整版在线观看 | 816电影在线看完整版| 和老板在办公室BD 中文| 意大利奇迹| 康体水疗完整版在线观看免费播放 | 陈梦王曼昱神仙打架| 女子私人监狱法版免费| 病态三部曲| 中国新说唱第一集| 湘潭县| 韩国伦理片女儿需要爸爸播种子的电影 | 媳妇儿和少奶奶国语版| 花木兰2动画片国语| 若你安好便是晴天 电视剧| 日本部长出差七天七夜| 美发店的特殊服务4| 星期五的寝室| 妖精的尾巴53| 壮志凌云女版成人H版免费观看| 小日子全部免费播放电视剧| 灭火宝贝6经典版| 谈情说案大结局| 《好看的女人》完整版| 宋小宝最新小品全集| 韩国三级维修工的艳遇| 高清《杰顿:魔物娘的章鱼篇》免费| 降头在线观看| 孤舟电视剧| 妻子8免费完整高清电视剧看 | 白话易经| 人民的名义55集免费完整版| 妻子去社长家中抵债的电影| 出轨的女人 影音| 赤裸特工| 妻子8免费完整高清中文版电视剧| 未成年在线观看播放| 女教师被入侵| 国语译制片| 潘多拉之镜1983满天星版资源 | 映山红简谱| 放课后の优等生动漫在线观看| 疯狂72小时| 天字号监狱电影免费观看全集| 电影南拳王| 知否知否应是绿肥红瘦观看| 溢出第一季全集免费观看| 女子推理第二季在线观看免费| 苹果范冰冰无删减| 致我们终将逝去的青春| 玫瑰故事电视剧免费观看全集 | 《水电工的艳遇》韩国| 三年高清免费观看在线播放| 遇见波莉| 之后3在线观看完整版| 特殊的内衣销售员| 妖精的尾巴番外篇1| 铁血尖刀| 女孩不平凡电影| 熊出没之逆转时空大电影| 《21世纪爱情指南》免费观看中文版 | 球球大作战米修斯| 《丈夫不在家维修工人上门维修》| 电视剧画眉三十八集免费观看| 临终老人要走的6个手势| 宁都县| 法国满天星古墓丽影合集 | 电影三人一次性体检 | 铁马骝2之街头杀手| 哈利波特电影免费观看完整版| 战狼6观看在线下载高清| 电影美容室的特殊待遇7 | 青海花儿胡汉三| 基督山伯爵电影在线观看| 美丽的小樱桃美国主演 | 不要对我撒谎| radio star 神话| 酒店第1-100集免费观看下载 | 如此喜欢的你1V2| 《蓝帽子》电影免费观看| 果宝特攻5| 卧虎电视剧全集完整版免费观看| 三年成全免费观看在线| 栋笃神探国语高清| 谍影重重1电影| 锦绣缘华丽冒险大结局| 战狼6欧式少女免费观看高清| 彼岸岛电影| 半糖动漫高清免费观看| 武藤兰合集| 黑白配免费高清观看| 长歌行免费观看完整版| 我们都是好朋友电视剧| 北方影院迷宅幻影| JUL945丈夫不在| 磨刀不误砍柴工的意思| 高清阿尔法未删减| 胡歌鹿鼎记| 满天星女版黑鹰坠落2免费观看| 《想见你》恋爱综艺在线观看| 小男人遇上大女人演员表| 电视剧女婿难当| 新金银悔1-5普| 渔夫荒野史1987完整| 西部神枪手| 巴拉拉小魔仙之彩虹心石全集| 廊坊市| 隔着帘子羞耻精油按摩在线看| 《伪装者》全集免费高清在线观看| 蓝可儿电梯事件| 程序员那么可爱分集剧情介绍| 《娃娃脸4》少女| 禁止想象韩国电影| 爱恋2015无减删高清| 黑帮大佬和我的365天 二集| 美国睫毛膏4| 空姐不雅视频| 神勇武工队传奇主题曲| 泰剧铁石心肠剧情| overflow樱花动漫第一季| 朋友的姐姐2电影| 迪迦奥特曼7| 间谍过家家第三季免费观看| 靖西县| 激情纵林| 自由恋爱| 龙门客栈在线观看免费完整版| 叶玉聊电影全集| 三年大片大全在线观看免费国语 | 朝国年经继10免费观看| 少年天子顺治王朝| 海贼王480| 舍我其谁电视剧免费观看西瓜| 麻生香织《黑色皮肤上的眼泪》在线观看| 丈夫不在的| 法证先锋5粤语全集免费观看| 延禧宫攻略电视剧| 意大利孕妇电影大全在线观看| 我家有喜37| 老公不在我和公发| 咒术回战第一季免费高清观看| 《维修工人的艳遇》1| 北欧精灵麦乐迪女超人电影在线观看免费| 周老师高中数学| 有你真好天堂飘雪| 鞍海快客车祸| 年经继4| 爱的色放mp4下载| 干柴烈火2免费观看电视剧| 星克莱尔《迷宫》在线观看| 焕羽电视剧周翊然| 日本电影女大学生去按摩| ssni-025| 甜蜜的惩罚真人版的剧名叫| 《性的暴行》电影免费观看 | 高清高等教欲| 花少丝路季| 高考时晕倒确诊骨癌| 义子乱的电影在线| 没有玫瑰的花店下载| 少帅全集完整版免费| 我朋友的瘦子9| 徒弟爱上师母是什么电影| 帝国的隐忍| 经典兔子舞曲| 心锁百度影音| 私人助理2法国版电影免费看 | 美国式家庭禁忌结局-3人狗 | 她很漂亮韩剧高清在线观看| 霍比特人 百度影音| 贝蒂的农场1980| 女保险公司推销员8中文手机| 高清花便当未删减| 刃牙道:无敌武士未删减 | 《暴躁少女免费观看全集高清》电影免费在线观看完整版 - 光棍影院 | 欧式少女第16集全集剧情介绍| 点爱成金| 阿凡达高清版| 毒战完整版免费观看| 欧式少女1-13集全剧情| 京胡大赛| 难哄电视剧观看全集在线播放| 新藤惠美| 爱你像心跳难动短剧免费观看| 朱莉安妮版《售楼女王》英文名字.| 狄仁杰之飞头罗刹电影| 上司人妻被下属侵犯HD| 电影爱与激情| 三年大片大全免费观看国语版全集 | 安闲领主的愉快领地防卫全集观看 | 性的暴行中文完整版| 翼 年代记| 王牌播音员| 我的继父是偶像电视剧免费观看 | 保罗莉娜黑白配电影免费观看| 风流才子纪晓岚插曲| 小小影视免费| 满天星凌云壮志女版| 《731部队》电影完整版| 难忘的战斗免费| 《美容院的特殊待遇》在线观看| 醉饮黄龙| 机动奥特曼 第三季| 三年成全免费看高清影视大全| 权力的游戏第一季无删减美剧| 玉米电影| 漂亮的小姨韩剧免费观看完整版电视剧| 情路婉转云烟散| 唐诗三百首一共有多少首诗 | 与小仙女混居的日子| 帕丁顿熊3电影国语版免费观看 | 暮光之城1高清| 一起愁愁愁免费观看全集高清| 姜子牙电影在线观看| 巴以冲突历史根源简述| 维修人员的艳遇| 吴京电视剧全集| 花千骨全集未删减版在哪里可以看| 《碟中谍5:神秘国度》| 电影弱点| 新任女教师的凌脣教室bd| 伪娘电影| 《白色橄榄树》全集观看| 白峰电影国语免费全集| 爱恋2015无减删高清| 行尸走肉十二季在线播放| 娃娃脸4完整版免费观看| 电视剧移动的枪口免费全集| 鉴证实录| 女版战狼6免费观看999战狼6| 金装的维尔梅免费看全集| 小鸡不好惹第五部| 死亡笔记| 黑巨茎大战俄罗斯美女| 超智能足球第二季| 电影龙蛇争霸| 《花子vs倔强驱魔师4》免费观看| 白日梦与她| 战神归来| 时光沙漏| 朴亚珍电影| 成ren电影| 火星情报局第二季| 韩国维修工的艳遇在线观看| 无法传达给你在线观看日剧 | 坎贝奇《无憾》电影| 孤舟免费观看完整版电视剧| 女状元文武:双全惊天下短剧全集| 《和妽妽的关系》HD| 《白蛇:浮生》正片免费观看| 女朋友韩国电影免费观看完整版| 人民的名义未删减版有多少集| 三年中国在线观看完整版儿女| 如懿传高清免费全集在线观看| 乡村爱情9免费观看全集| 97在线观看| 1942电影完整版| 华人城小说| 30而立电视剧| 啄木鸟系列壮志凌云满天星女版演员 | 中文字幕乳授乳奶水电影小说| 朔州市| 向西电影高清完整版| 辣妈犟爸| 需要爸爸播种子第一季2集主角| 深海狂鲨高清| 初恋50次在线观看| 午夜寂寞影院列表| 监狱学园动漫全集| 牵牛的夏天片尾曲| 好孕皇后进阶录短剧免费观看| 电影爱我几何在线观看| 永不磨灭的番| 屋内有人电影| 老公我要电影免费观看| 热血忠魂| 插曲的痛免费观看在线高清| 笑动2013| 南海归墟16集在线播放免费| 姚二嘎吸毒| 满清十大刑酷快播| 明里紬被义子侵犯在线观看| 男男少年乖H调教跪趴SM主| 女儿不认真学习被妈妈拖进大海| 勇猛的维修工| 哈尔滨美食团购| 潘金莲荡秋千吃葡萄是谁演的| 继续播放歌曲| 荒井小姐的秘密生活日剧全集 | 排球少年第一季免费观看完整版| 飞机上的性服务K8在线观看| 女黑侠黄莺国语| 周末同床电影| 合约变真爱:契约影后影帝短剧全集| 浪漫女家教未删减| 你太过分了韩剧| 法国粉红萝卜| 张卫健西游记国语| 妖狐传说| 禁忌6年转一代| 天龙八部舒畅第几集| 买车| 景甜被罚没722万| 新还珠格格高清在线观看| 美国电影需要爸爸播种中文版| 尖峰电视剧全集在线观看| 电影云图| 坏种3大结局免费观看| 我学生的爸爸中字ID| 天星术日本版普通话| 电视剧只是结婚的关系在线观看| 禁止的爱善良的小蛦子 在钱| 黑暗魔法师| 公孚之手9| 木下檀檩子jlU698零售价| 爱情公寓第3| 电视剧焦裕禄| 爸爸的朋友2在完整有限中字| 太平年全集免费看| 美国女儿借爸爸种菜是哪一集| 狄龙版包青天| 江湖新秩序粤语| 盲点 美剧| 传闻中的七公主中文版| 白峰美羽伦理电影| 矿桥第8集体检超棒| 第八个嫌疑人 电影| 《冬日的什么呀,春日的什么呢》 | 女朋友63中汉字三义的背景故事视频 | 动画片小美人鱼| 缘之空在线观看动漫高清免费| 新金银悔1-5免费看| 鬼骨场国语| 隐身的名字未删减| 女人是男人的未来1分20秒| 黑白配hd1080完整版在 | 打脸前任短剧全集| 歌曲披着羊皮的狼| 冰湖行动全集观看| 突然的喜欢演员表| 婚前恐惧症症状| 火热电影| 爱在空气中第9集| 需要爸爸播种2美版在哪里可以看| 韩国综艺情书第三季| 插曲的痛第60集免费观看高清强制 | 爱在战火纷飞时| 暗暗在线观看| 《蛇王波后》完整版| 幸存者1937电影免费播放| 美国政府重启免费新冠检测| 新继拇7完整版| 长安二十四计全集免费看| 1980版上海滩电视剧免费观看| 苍老师40电影全集免费观看 | 华尔街1电影| 好大一个家电视剧全集在线观看 | 猎杀史卡佩塔 第一季| 最终幻想15王者之剑| 电视剧大秦赋免费观看| 降龙神掌苏乞儿| 《坎贝奇》视频| 至尊红颜贾静雯版高清| 高安子君广场舞阿哥阿妹| 韩剧我的女孩国语在线观看| 马布里与汪妤凌结婚| 忍不住的继拇中文字幕| 成人版白雪公主| 高清隔壁的星光未删减| 钓鱼台国宴| 紫钗奇缘 电视剧| 双喜盈门 电视剧| 日本部长出差七天七夜| 台湾渔夫| 阿斗当皇帝| 华尔街1电影| 《丰满的继牳5》在线观看| 冯小刚:《非3》带着笑声告别| 韩国做aj的电视剧| 日本版新战狼6观看| 高清先哄后爱| 息县县委书记金平去向| 哥哥太爱我怎么办| 小岳岳相声| 小密逃| 疯魔神丐苏乞儿| 静默管理啥意思| 《孽债》第二部视频,需要爸爸播种 | 暴走财神5在线观看免费完整版| 突然的喜欢一共多少集| 激战丛林美国未删减完整版在线观看 | 天下第一拳| 海天雄鹰免费观看| 唐朝浪漫英雄下载| 哪吒2魔童闹海在线播放高清| 一边面膜敷53分钟日本| 白峰在线观看免费版电视剧| 世界上毛最多的人| 霍比特人主题曲| 白峰国语版在线观看免费高清 | 《偿还2》免费观看完整版| 哈利波特电影| 华豫之门鉴宝| 咱们结婚吧全集免费观看| 北京代驾| 美国电影《需要爸爸播种》电影在线 | 吾家有姐满天星版| 行尸走肉第二季12集| 人工少女3服装存档| 把可爱的男孩子c哭动漫| 铁核桃之无间风云剧情介绍| 《玉薄圃》| 宁夏卫视节目表| 丰满的继牳5伦A片在线| 聊斋3下载| 贾玲拍露腹肌戏份脱了8斤水| 恋爱暴君动漫| 寒战2免费| 新密市| 法国啄木鸟酒店实习生| 樱花动漫鬼灭之刃游郭篇第五集| 呼唤生活俄剧| 原始武器 国语| 三更2之饺子普通话版| 雪莉露h| 美国女超人满天星免费观看完整版 | 高清火遮眼未删减| 《禁忌》1980无删减在线观看| 聪明的阿凡提全集| 《修理工的艳遇电影| 《小欢喜》电视剧| 王杰的电影| 樱桃嘴与大鼻子| 小镇姑娘国语免费观看| 百万新娘之爱无悔大结局| 灵性少女外传之花子vs倔强驱魔师| 俘虏之锁~处女们淫秽的束缚动漫在线观看 | 千王之王 周星驰| 《执行秘书》2009| 美容院的待遇服务在线观看| 哥哥去在线| 鬼吹灯之牧野诡事第二季电视剧| 国家地理频道| 电视剧幸福的完美| 少儿不宜的电影| 小密逃| 老婆6完整电视剧| 爱情有烟火电视剧| 锦绣前程:重生不做炮灰短剧全集 | 蜡笔小新免费国语版大全| 人偶之家全集观看| 老公我要电影免费观看| 越策越开心2013| 已婚妇女的下午电影中文| 越战先锋在线完整版观看| 新闻女王电视剧在线观看免费| 白峰美羽三级片| 田蕴章每日一字| 流量女王短剧全集| 战狼6高清完整免费观看国语| 韩国上司部长来家| 斗罗大陆第210集免费观看| 干柴烈火2免费观看电视剧| 巴中市| miya.737.mon| 我的拿手好戏一一吃屎| 情色姐妹| 最激烈的床震大叫不停| 练气期修炼十万年动漫免费观看| 女律师的坠落完整版| 《疯狂姐妹花》短剧| 美女死尸| 樱桃电视剧高清在线观看| 黑白配高清中文完整版 | 韩国电影朋友家的麦子| 北京青年土豆网| 周深 卷珠帘| 禁忌5| 花子与倔强的驱魔师第4集剧情| 桃色香居下载| 纵有疾风起免费观看全集| 扫黑风暴12集| 蜜桃成熟时1997国语搜狗| 高压监狱观看完整免费高清原声满天星2019| 爸爸的播种| 金刚2帝国崛起免费播放在线观看| 小巷人家免费播放的电视剧| 美食的俘虏141| 寄生异形电影| 嵊泗县| xl司令第二季无马赛免费观看真人版| 睡美人1999版美国| 唐门美人江湖电影免费观看| 米兰大坏蛋1分47秒| 金银悔1手机版免费版|