《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 一種Linux多線程應用下內存池的設計與實現
一種Linux多線程應用下內存池的設計與實現
來源:電子技術應用2012年第11期
許 健, 于鴻洋
電子科技大學 電子科學技術研究院,四川 成都 611731
摘要: 對內存池中內存塊獲取、分配機制、內存塊大小、內存釋放,以及在多線程環境下的安全處理等細節進行了研究,保證了在多線程環境下能夠快速同時采用一種基于數組的鏈表機制,改進內存池中內存塊的查找算法,將其時間復雜度穩定在O(1),避免了傳統內存池中請求的線程數目過多時,引發的獲取內存塊性能下降的問題。同時在內部設置管理線程,動態增加或刪除空閑的內存塊。實驗結果表明,改進后的內存池與傳統的內存分配方式相比消耗更小,效率更好。
中圖分類號: TP31
文獻標識碼: A
文章編號: 0258-7998(2012)11-0146-04
Design and implement of memory pool under multi-thread of Linux
Xu Jian,Yu Hongyang
Research Institute of Electronic Science and Technology, University of Electronic Science and Technology, Chengdu 611731, China
Abstract: After much research on the allocate and gain mechanism , dynamic adjustment, safety use, free method, the basic size of the memory block ensure it's can work well in mutli-mem enviorment. Meanwhile, using a mechanism of array-based linked list to improve the searching and allocation algorithm in the memory pool, making the time complexity stable at O(1),and avoid the degradation of allocation and query performance when aquired memory mem number is too large in the traditional mem pool. Experimental results show that the improved memory pool has a smaller cost and better efficiency compared with the traditional memory distribution.
Key words : memory pool; memroy block find method; Linux; multi-thread

    動態內存管理非常耗時,對效率影響很大,然而在實際的編程應用中,卻不可避免地經常要用到堆中的內存。但是通過Malloc函數或New等進行的內存分配存在先天缺陷: (1)利用默認的內存管理函數在堆上分配和釋放內存需要花費很多時間;(2)隨著時間的推移,堆上會形成許多內存碎片,在應用程序進行內存申請操作將受到更大的影響,導致應用程序的運行越來越慢[1-3]。

    當應用程序需要對固定大小的對象經常性地申請內存時,常會采用內存池(Memory Pool)技術來提高內存管理效率。經典的內存池做法是一次性分配大量大小相同的小塊內存,通過該技術可以極大地加快內存分配/釋放過程。內存池技術通過批量申請內存,降低了內存申請次數,從而使操作節省了時間。在減少了內存碎片產生的同時,對性能的提升有顯著的幫助。
    綜上,內存池有其巨大的優勢,但是原有的內存池也存在一定的缺陷。在多線程場合下應用時,每個新產生的線程如何在O(1)時間內獲取內存塊,如何保證其安全有效性,以及如何管理內存塊的數量方面存在一定的不足的,本文對此進行研究,并給出一種新的解決方案。
1 內存池制作原理以及工作流程
    本內存池基于多線程環境,需要考慮到多線程下數據的安全,以及快速獲取內存塊等條件。在獲取內存塊索引號時,采用加鎖的方式,雖然會耗費一定的時間,但是運行安全得到了保障。在程序運行之前需創建好內存池,并用一個結構體struct mem_pool進行封裝,里面包含內存池的一些私有數據。當有新線程產生時,直接像內存池申請一塊已經分配好了的內存,線程的具體內存操作都在該內存塊中進行。同時,內存池結構體中隱藏一個管理線程,該線程的工作是定時檢查內存池中空閑內存塊的數量是否過多或者過少。當過多時,申請釋放,直到達到門檻值;當過少時,申請增加若干,以備不時之需。內存池結構如圖1所示。

    對于內存池中的內存塊,采用結構struct mem_block維護其數據,該結構以一個鏈表的形式維護實際內存區域,結構體中有兩個管理內存的區域:(1)常規大小鏈表區域。當需要的內存小于常規大小時,則線程的內存請求都將從該區域獲得;當該區域內存將滿時,則線程可以繼續申請同樣大小的內存塊,鏈接到該常規大小鏈表上。(2)大塊內存鏈表區域。當線程申請的內存超過該內存塊的大小時,將在系統中申請一塊大的內存鏈接到該大塊內存鏈表上,這樣可以對內存塊進行統一管理;當線程壽命結束時,調用reset函數將大塊內存釋放,同時重設常規內存鏈表區域,只保留最開始的一塊,其余后面申請的塊全部釋放,并標記內存塊的使用狀態為空閑,同時重設一些內部指針,指向內存塊可用的起始位置[4]。
    創建內存池結構,并初始化,此時在內存中存儲著一份內存池的動態管理單元。當創建新線程時,該線程通過內存塊查找函數,并查詢內存池結構。如有空閑內存塊則直接將該內存塊的索引號index送給線程,同時將該內存塊的空閑標志flag設為繁忙;如果內存池中沒有可用的空閑內存塊,且內存塊數量未達到設置的頂峰,則可以申請add_memblock;若正在使用的內存塊超過了最大設置的內存塊數量,則線程將調用Malloc函數,并自行調用Free釋放該內存塊。管理線程周期性地調用get_mp_status來查看內存池狀態,若空閑線程低于門檻值(最小空閑內存塊數),則調度add_memblock函數創建新的內存塊到池中;若空閑內存塊高于門檻值(最大空閑內存數),則調度del_memblock銷毀多余的內存塊。線程生命周期結束后,將內存塊的繁忙標記設置為空閑狀態,并且重新初始化該內存塊,將內存塊重新投入到內存池中,等待其他線程重復利用。內存池的工作流程如圖2所示。

2 內存池主要技術
2.1 內存池中空閑內存塊的查找方式

   當進程服務繁忙時,一些內存塊長期被某些線程占用的情況下,也可能延長內存池響應時間,影響響應速度。內存池調度算法的一項重要任務就是盡可能提高查找空閑內存塊的速度。而簡單地遍歷內存池鏈表顯然不能滿足請求線程的需要,這種方式不僅延長了調用者的返回時間,而且極大增加了內存池對請求線程的響應時間。特別是在服務器繁忙時,當處于請求內存塊的線程越多,查找空閑內存塊所花費的時間就越長。因此,本文提出以下兩種查找方法:
    (1) 位圖查找方式
    用位圖方式維護內存池中的內存塊單元,查找空閑內存塊將只需遍歷位圖,位圖按單個字節進行查找效率較高。另外,在線程結束時的前一刻,維護當前空閑內存塊的索引index,可在下次查找空閑內存塊時直接獲取這個值,而時間耗費是O(1)級的,這將大大提高響應時間。
    (2) 基于數組的方式
    基于鏈表實現的內存池,在創建內存池時或者每次增加池中內存塊數時都必須分配新的管理結構,再進行鏈接;并且在查找空閑內存塊時,需要遍歷內存池,其直接后果是造成線程請求內存塊的時間大大增加。而數組的方式有其天然的優勢,當用位圖查找到了空閑內存塊的索引后,也即知道了內存塊在數組中的位置,由此可以迅速地定位空閑內存塊,大大提高了響應速度。
2.2 內存池中內存塊的數量動態調整
    固定的內存池在有些情況下并不能滿足實際情況的需要,動態內存池常見的調整方法有基于閾值觸發和基于預測公式兩種形式?;陬A測公式方法通過統計學的經驗公式來預測,優點是能夠反應內存池消耗內存的真實傾向,迅速查找和釋放內存塊;缺點是按照統計公式計算的結果,通常局限于某些特定場合和應用,并且在內存池中造成系統資源消耗較大?;陂撝涤|發方法通常按照參數配置來控制內存池的某些參數,優點是實現簡單、通用性強、可控性好;缺點是需要精確計算配置參數,否則性能會急劇下降。為保證內存池的通用性,這里使用參數可調整的閾值觸發方式動態調整內存池。
    (1) 相關參數合理性設置
    設內存池中最大內存塊數為MAX_NUM,內存池中最小內存塊數為MIN_NUM,內存池中最小空閑內存塊數為MIN_IDLE,內存池最大空閑內存塊數為MAX_IDLE,方法是:
    ①初始化創建MIN_NUM個空閑內存塊;
    ②池中空閑內存塊數量低于MIN_IDLE時,觸發內存池調整,添加MIN_IDLE個內存塊;
  ③池中空閑內存塊數量高于MAX_IDLE時,觸發內存發池調整,刪除MIN_IDLE個內存塊
    ④調整過程確保內存池中內存塊數不多于MAX_NUM個,也不少于MIN_NUM個。
    對以上參數的合理設置可以保證內存池能動態地處理內存塊過多或過少時的情況,同時在處理大量請求時,避免請求線程等待太久。
    (2) 設置內存池模式
    內存池的工作模式能夠影響的調整行為:
    ①可增可減模式:內存池處于動態管理狀態,實時調整內存塊的數量,在條件允許的情況下增加或刪除空閑內存塊。
    ②只增不減模式:內存池處于動態管理狀態,內存池只會做出添加內存塊的調整行為,不會做出刪減內存塊的調整。
    ③不增不減模式:內存池處于動態管理狀態,既不增加內存塊,也不刪除內存塊。
    對內存池模式的設置應盡可能多地滿足不同的應用場合,使內存池具有更好的適應性和通用性。相對于其他兩種模式來說,可增可減模式適應性較強,既不浪費系統資源,又可提供良好的服務。
2.3 內存池中內存塊組織結構的調整
   將內存塊大小固定的內存池在使用時將遇到諸多不便。不同的任務線程對于內存大小的需求不一樣,對于一般的服務,可能線程所需要的內存塊只在幾十~幾百字節之間,但對于另外一些服務,線程將需要幾千甚至幾兆的內存來處理數據。因此,合適的內存塊的大小將影響請求線程的效率。內存塊組織結構如圖3所示。

3 代碼組織
   借鑒C++語言中的面向對象的思想,在C語言中利用結構體模擬C++語言中的類,用函數指針模擬類方法,通過指針強制轉換實現數據隱藏。頭文件.h中包含數據結構,而.c文件中包含實際的內存池結構,這樣可避免用戶操作結構體中的數據成員雖然不能真正地像C++中隱藏數據,但是也達到了一定的隱藏效果[5-6]。
3.1 內存池使用方法
    mp_mem_pool *pool = create_mem_pool();
    pool->init(pool, NULL,“log.txt”);
    pool->find_min_idle_index(pool);
    pool->palloc(pool, index, size);
    destroy_mem_pool( pool);
3.2 函數與接口的功能
       struct mp_mem_pool_s{
       MPBOOL    (*init)(mp_mem_pool *pool, mp_mem_conf *conf, const char *log_file);
       void    (*reset)(mp_mem_pool *pool);
       void(*reset_memblock)(mp_mem_pool *pool, const int index);
     void( *get_mp_status )( mp_mem_pool *pool);
     void(*print_mp_status)(mp_mem_pool *pool);
       int(*find_min_idle_index)(mp_mem_pool *pool);
       void    *(*palloc)(mp_mem_pool *pool, const int index,  size_t size);
       void    (*pnalloc)(mp_mem_pool *pool, const int index, size_t size);
       void    (*pcalloc)(mp_mem_pool *pool, const int index,  size_t size);
       void    (*pmemalign)(mp_mem_pool *pool, const int index, size_t size, size_t alignment);
       mp_mem_pool *create_mem_pool();
       void destroy_mem_pool( mp_mem_pool* pool );
    函數用戶接口較為簡單,主要為創建和銷毀內存池的接口,以及查找池中空閑內存塊索引。內存池本身也有自己的接口struct mp_mem_pool_s,只有類似C++中的成員函數沒有數據,所有數據都在實現文件中進行處理,這樣隱藏數據的好處是避免用戶隨意操作內存池管理單元中的數據。
    create_mem_pool:    創建內存池;
    destroy_mem_pool:    銷毀內存池;
    init: 初始化內存池(沒有初始化是無法使用的,可以根據配置文件調節內存池行為);
     reset:關閉內存池,將其退回到創建時的狀態;
       reset_memblock:重置具體的內存塊,將其退回到初始化時的狀態;
       get_mp_status:獲取內存池狀態(當前的內存塊數量,最大內存塊數,以及空閑內存塊數量等);
       print_mp_status:打印內存池的工作狀態到終端上顯示;
       find_min_idle_index:返回內存池中空閑內存塊的索引;
       palloc:請求線程申請到內存塊之后,調用該函數進行內存分配操作,分配時進行對齊處理;
       pnalloc:請求線程申請到內存塊之后,調用該函數進行內存分配操作,分配時不進行對齊處理;
       pcalloc:請求線程申請到內存塊之后,調用該函數進行內存分配操作,分配時進行對齊處理,同時將內存清零;
       pmemalign:分配大塊內存的操作函數。
     實際的應用中內存池通常都是與線程池、以及任務池結合在一起使用,但各個模塊之間耦合越緊,模塊的重用就會越困難,移植性越低。因此內存池的接口應盡可能地保持其獨立性,不依賴外部條件。而內存池的使用者只需要做初期初始化工作,將描述內存池的結構體作為全局變量,然后在線程的工作函數中調用find_min_idle_index尋找到可用內存塊索引即可,操作簡單方便[6-8]。
4 比較與測試
    (1) 測試環境
    Intel(R) Core(TM) i3-2100 CPU @ 2.80 GHz,2 GB內存;Fedora 14(內核2.6.35.14-106.fc14.i686,GCC 4.5.1,GLIBC 2.12.90)
    (2) 測試設計
    內存池的使用相比線程中直接調用Malloc、Free函數分配和銷毀內存的優勢,主要體現在一次性申請連續N塊內存,并且在程序結束后統一釋放。而多線程環境中每個線程單獨調用Malloc、Free則需要大量的系統調用開銷,同時,將可能產生許多內存碎片。而內存池的使用能夠節省Malloc、Free不斷地調用時間,避免了可能出現的內存碎片,從而保證內存池的使用有利于復用和管理。
    針對本測試所設計的測試程序為,在使用內存池環境下,主線程先創建并初始化內存池,內存池中每個Memblock的大小設為1 KB,內存池的配置文件中設置最大內存塊數量為201,最小內存塊數量為30,最大空閑內存塊數量為60,最小空閑內存塊數量為10。之后主線程產生200個線程,所有線程的工作就是向內存池申請內存塊,之后再在申請到的Memblock中分別分配128 B、1 KB、 2 KB,以及同時申請128 B和1 KB,然后用time命令來計算user time和sys time。
    在不使用內存池情況下,每個線程將單獨調用malloc和free函數來分配和釋放內存,同樣分別分配128 B,1 KB,2 KB以及同時申請128 B和1 KB內存。需要注意的是,為了避免客觀因素影響,兩個測試程序中的其余部分應盡量一致。每種情況進行100次測試,平均得到的測試結果如表1所示。
    (3) 結果分析
    由表1可見,在不使用內存池的測試中,當一個線程中多次分配以及釋放時,將消耗更多的時間。而使用內存池的結果還是比較理想的。每個線程分配內存的大小對于用戶時間和系統時間幾乎毫無影響,它不需要Malloc和Free不斷地操作,節約了大量庫函數調用、系統調用的開銷,減少了內存碎片,特別對于服務器程序的運行,是非??捎^的。

 

 

    本文設計一種在多線程環境下的內存池算法,優化了池中內存塊的維護和查找算法,并保證了接口的簡單易用性,使其更易于與項目集成。
參考文獻
[1] 翁小東. 電信級用系統中多進程共享內存池的實現[J].電腦知識技術,2009,4(5-12):3300-3306
[2] 劉小華. 基于C++的內存池的實現[J].福建電腦, 2008(1):82-83.
[3] 張海闊,趙沖沖,王玉,等. 鏈表快速查找的內存池管理優化技術研究[C]. 2007年全國高性能計算學術年會, 2007.
[4] 胡萌,趙衛東,王志成,等. 線程池設計與動態優化[J]. 電腦知識與技術,2008,4(9):2753-2755.
[5] STEVENS W R. UNIX網路編程(第2卷)[M]. 北京:人民郵電出版社,2010.
[6] 趙海,李志蜀,韓學為,等. 一種鏈式結構在內存管理中的應用[J].高等函授學報:自然科學版,2002,15(4):46-48.
[7] 翁小東.基于UNIX C語言的一種線程池實現[J]. 電腦知識與技術,2009,5(16):4222-4223.
[8] LOWELL R M. A C++ pooled, shared memory allocator for simulator development[C]. IEEE,2004,Proceedings of the 37th Annual Simulation Symposium,2004.

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          一本大道久久a久久精品综合| 91久久久在线| 在线中文字幕一区| 亚洲福利视频三区| 一区二区三区视频在线看| 国产精品超碰97尤物18| 一本色道久久综合狠狠躁篇怎么玩| 在线观看欧美黄色| 亚洲欧美日韩国产综合精品二区| 国产精品欧美一区二区三区奶水| 国产欧美日本一区二区三区| 欧美成人亚洲成人日韩成人| 欧美日韩一区二区三区视频| 在线午夜精品自拍| 激情综合五月天| 国语自产精品视频在线看抢先版结局| 欧美性感一类影片在线播放| 久久国产视频网站| 亚洲第一主播视频| 一区二区欧美激情| 国产日韩欧美一区| 久久国产精品免费一区| 在线观看中文字幕亚洲| 久久综合色8888| 久久精视频免费在线久久完整在线看| 欧美高清视频在线播放| 国产精品v片在线观看不卡| 国产无一区二区| 国产精品私拍pans大尺度在线| 欧美亚洲三区| 久久精品视频在线免费观看| 国产精品一区二区你懂的| 久久久青草婷婷精品综合日韩| 亚洲福利小视频| 1204国产成人精品视频| 久久网站热最新地址| 亚洲国产欧美精品| 亚洲激情欧美| 久久久综合香蕉尹人综合网| 欧美jizzhd精品欧美喷水| 一本久久综合| 99精品视频网| 午夜精品久久久久久久99热浪潮| 99www免费人成精品| 亚洲人体影院| 欧美mv日韩mv亚洲| 久久国产精品第一页| 国产精品日日做人人爱| 久久不射电影网| 在线观看中文字幕亚洲| 免费观看成人www动漫视频| 一区二区三区你懂的| 一区二区欧美日韩视频| 国产精品久久久久久久app| 欧美在线观看你懂的| 国产精品久久久久久久免费软件| 久久视频免费观看| 国产精品亚洲综合| 欧美a级大片| 午夜精品久久久久久久99热浪潮| 国产视频在线观看一区二区| 狂野欧美性猛交xxxx巴西| 国产亚洲一二三区| 久久久人成影片一区二区三区| 欧美激情视频一区二区三区在线播放| 狠狠色综合色综合网络| 亚洲国产精品久久久久| 久久久久久久综合日本| 久久激情网站| 影视先锋久久| 欧美日韩国产探花| 麻豆国产va免费精品高清在线| 免费观看在线综合色| 欧美日韩综合| 国产亚洲精品一区二555| 永久免费精品影视网站| 一区二区三区成人| 国产乱子伦一区二区三区国色天香| 欧美精品三级在线观看| 亚洲一级一区| 亚洲第一免费播放区| 久久激情五月丁香伊人| 一区二区三区高清不卡| 国产日韩av在线播放| 亚洲欧美日韩中文视频| 国产一区二区三区免费观看| 欧美国产日韩a欧美在线观看| 欧美日韩视频在线第一区| 国产精品国产精品国产专区不蜜| 欧美成ee人免费视频| 国产精品伦子伦免费视频| 欧美日韩国产欧美日美国产精品| 久久久久青草大香线综合精品| 国产欧美日韩另类视频免费观看| 亚洲另类一区二区| 一区二区日韩伦理片| 一本色道久久综合亚洲精品高清| 国产精品系列在线| 午夜精品99久久免费| 欧美精品久久久久久久久老牛影院| 欧美精品电影在线| 亚洲第一精品在线| 一本色道久久综合狠狠躁的推荐| 国产精品夜夜嗨| 亚洲啪啪91| 欧美精品亚洲一区二区在线播放| 美女成人午夜| 久久久一区二区三区| 亚洲精品久久久久中文字幕欢迎你| 在线观看91久久久久久| 狠狠狠色丁香婷婷综合久久五月| 亚洲国产美女久久久久| 噜噜爱69成人精品| 亚洲国产网站| 欧美高清一区二区| 亚洲欧美日韩一区二区| 亚洲欧美成人网| 久久久久久亚洲精品中文字幕| 国外视频精品毛片| 激情五月婷婷综合| 亚洲淫片在线视频| 国产精品久久一卡二卡| 免费成年人欧美视频| 精品999久久久| 亚洲激情视频在线观看| 亚洲国产欧美一区| 最近中文字幕mv在线一区二区三区四区| 国产亚洲毛片| 一区二区三区欧美日韩| 亚洲一区二区三区视频| 国内精品一区二区| 樱桃视频在线观看一区| 黄色av成人| 亚洲另类春色国产| 欧美亚洲成人网| 欧美 日韩 国产一区二区在线视频| 国产欧美日韩麻豆91| 嫩草成人www欧美| 性欧美大战久久久久久久久| 亚洲欧美激情视频在线观看一区二区三区| 日韩网站在线| 欧美在线播放| 国产精品成人播放| 欧美日韩精品免费| 国产亚洲欧美日韩美女| 午夜老司机精品| 亚洲影院在线| 久热这里只精品99re8久| 狠狠网亚洲精品| 欧美日韩免费看| 国产精品欧美日韩| 国产亚洲精品资源在线26u| 国产欧美日韩在线视频| 欧美日韩国产成人| 亚洲美女在线观看| 国产欧美日韩三区| 免费观看成人网| 欧美日韩国产一区精品一区| 国产一区二区三区四区| 欧美黑人多人双交| 亚洲欧美成人一区二区三区| 欧美亚洲第一页| 在线观看亚洲精品视频| 亚洲精品美女在线观看| 欧美高清成人| 欧美日韩中文字幕精品| 美日韩在线观看| 另类激情亚洲| 六十路精品视频| 午夜视频精品| 国产精品成人一区二区艾草| 亚洲精品美女在线| 欧美成人免费在线视频| 国产精品入口| 欧美日韩蜜桃| 在线综合+亚洲+欧美中文字幕| 欧美另类在线播放| 久久免费99精品久久久久久| 亚洲欧美日韩另类精品一区二区三区| 亚洲国产精品黑人久久久| 在线播放日韩欧美| 久久精品欧美日韩| 1769国内精品视频在线播放| 黄网站免费久久| 免费欧美高清视频| 国产精品视频大全| 一个色综合导航| 亚洲欧美成人一区二区在线电影| 一区二区三区在线不卡| 亚洲视频在线观看免费| 狠狠色综合一区二区| 午夜激情亚洲| 国产精品免费看久久久香蕉| 一区二区日韩伦理片| 欧美视频中文字幕在线| 一区在线视频观看| 亚洲欧洲日夜超级视频| 欧美日韩中文另类| 欧美激情一区二区三区在线视频观看| 欧美激情91| 亚洲免费观看高清完整版在线观看| 国产精品日韩一区二区三区| 欧美精品在线一区二区| 一本色道久久综合狠狠躁篇的优点| 99riav久久精品riav| 欧美激情一区在线| 国内在线观看一区二区三区| 久久精视频免费在线久久完整在线看| 久久www成人_看片免费不卡| 欧美一区二区三区久久精品茉莉花| 国产一区二区精品在线观看| 欧美另类综合| 久久久久久久久一区二区| 狠狠网亚洲精品| 一区二区视频免费完整版观看| 欧美精品一区二区三| 欧美高清免费| 日韩视频中午一区| 日韩一级在线观看| 欧美日本免费| 亚洲综合首页| 在线综合+亚洲+欧美中文字幕| 男人的天堂成人在线| 亚洲一区二区在线播放| 国产精品成人一区二区| 久久久无码精品亚洲日韩按摩| 极品中文字幕一区| 亚洲国产精品久久久久婷婷884| 精品成人在线观看| 欧美日韩情趣电影| 欧美一区二粉嫩精品国产一线天| 欧美1区免费| 国产一区二区三区高清| 国产精品久久中文| 日韩一级不卡| 男人天堂欧美日韩| 欧美黄免费看| 狠狠综合久久av一区二区老牛| 欧美国产日韩在线观看| 国产精品久久久一区麻豆最新章节| 国产主播一区二区三区| 午夜精彩国产免费不卡不顿大片| 久久久久99| 国产视频精品xxxx| 欧美激情1区| 亚洲在线观看免费| 久久久久国产精品一区三寸| 欧美日韩网站| 国语自产精品视频在线看8查询8| 亚洲日本黄色| 国产精品美女久久久久久久| 夜色激情一区二区| 国产一区二区精品久久91| 久久久一二三| 欧美午夜电影在线观看| 午夜精品电影| 国产日韩欧美高清| 黄色精品在线看| 性久久久久久久久久久久| 久久午夜电影网| 国产精品乱码一区二区三区| 国产精品一二| 一区二区三区欧美亚洲| 亚洲国产成人久久综合一区| 久久久久久久久久久久久女国产乱| 亚洲电影在线播放| 国产日韩久久| 欧美黄色日本| 国产精品美女久久久久aⅴ国产馆| 亚洲高清视频一区二区| 久久人人超碰| 国产精品毛片高清在线完整版| 国产欧美欧洲在线观看| 国产精品久久久久久亚洲毛片| 午夜精品一区二区三区在线| 日韩午夜激情| 1000部精品久久久久久久久| 亚洲国产精品一区二区三区| 亚洲视频免费| 午夜免费在线观看精品视频| 欧美成年视频| 伊甸园精品99久久久久久| 久久久久国产精品一区二区| 亚洲人成亚洲人成在线观看| 你懂的亚洲视频| 亚洲精品在线二区| 欧美一区二区视频观看视频| 国产精品久久久久一区二区三区| 国产一区二区无遮挡| 欧美高清一区二区| 亚洲国产成人精品久久久国产成人一区| 宅男精品视频| 黄色国产精品一区二区三区| 久久久久久亚洲精品中文字幕| 免费成人高清视频| 久久xxxx| 99精品视频免费| 欧美freesex交免费视频| 久久国产乱子精品免费女| 久久国产精品99国产| 亚洲电影在线| 亚洲国产精品t66y| 免费成人美女女| 一区二区三区.www| 国产一区二区三区高清| 中文日韩在线视频| 欧美高清视频一区二区| 欧美日韩在线免费观看| 黄色成人精品网站| 国产主播一区二区三区四区| 影音先锋中文字幕一区二区| 欧美天堂亚洲电影院在线播放| 国产精品初高中精品久久| 日韩视频免费大全中文字幕| 午夜伦欧美伦电影理论片| 国产一区二区三区直播精品电影| 亚洲欧美中文另类| 久久综合电影一区| 久久精品欧美日韩| 国产精品日韩久久久| 欧美日韩理论| 日韩午夜激情| 狠狠色综合日日| 亚洲国产精品成人久久综合一区| 一区二区三区成人精品| 亚洲激情在线视频| 老司机免费视频一区二区三区| 久久精品99无色码中文字幕|