青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

CppExplore

一切像霧像雨又像風(fēng)

  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  29 隨筆 :: 0 文章 :: 280 評(píng)論 :: 0 Trackbacks

作者:CppExplore 網(wǎng)址:http://m.shnenglu.com/CppExplore/
服務(wù)器設(shè)計(jì)人員在一段時(shí)間的摸索后,都會(huì)發(fā)現(xiàn):服務(wù)器性能的關(guān)鍵在于內(nèi)存。從收包到解析,到消息內(nèi)存的申請(qǐng),到session結(jié)構(gòu)內(nèi)存的申請(qǐng)都要小心處理,盡量減少內(nèi)存數(shù)據(jù)copy,減少內(nèi)存動(dòng)態(tài)申請(qǐng),減少內(nèi)存檢索。為達(dá)到這個(gè)目的,不同的地方有不同的方法,比如常見的包解析,使用緩沖區(qū)偏移以及長(zhǎng)度來標(biāo)識(shí)包內(nèi)字段信息;內(nèi)存使用量固定的系統(tǒng),系統(tǒng)啟動(dòng)就申請(qǐng)好所有需要的內(nèi)存,初始化好,等待使用的時(shí)候直接使用;基于license控制的系統(tǒng),根據(jù)license的數(shù)量,一次性申請(qǐng)固定數(shù)量?jī)?nèi)存等......。本文不再總結(jié)這些特性方案,重點(diǎn)說下常見的通用的內(nèi)存池緩存技術(shù)。
    內(nèi)存池可有效降低動(dòng)態(tài)申請(qǐng)內(nèi)存的次數(shù),減少與內(nèi)核態(tài)的交互,提升系統(tǒng)性能,減少內(nèi)存碎片,增加內(nèi)存空間使用率,避免內(nèi)存泄漏的可能性,這么多的優(yōu)點(diǎn),沒有理由不在系統(tǒng)中使用該技術(shù)。
為了給內(nèi)存池技術(shù)尋找基石,先從低層的內(nèi)存管理看起。
硬件層略掉不談,可回顧《操作系統(tǒng)》。
一、linux內(nèi)存管理策略
    linux低層采用三層結(jié)構(gòu),實(shí)際使用中可以方便映射到兩層或者三層結(jié)構(gòu),以適用不同的硬件結(jié)構(gòu)。最下層的申請(qǐng)內(nèi)存函數(shù)get_free_page。之上有三種類型的內(nèi)存分配函數(shù)
(1)kmalloc類型。內(nèi)核進(jìn)程使用,基于slab技術(shù),用于管理小于內(nèi)存頁(yè)的內(nèi)存申請(qǐng)。思想出發(fā)點(diǎn)和應(yīng)用層面的內(nèi)存緩沖池同出一轍。但它針對(duì)內(nèi)核結(jié)構(gòu),特別處理,應(yīng)用場(chǎng)景固定,不考慮釋放。不再深入探討。
(2)vmalloc類型。內(nèi)核進(jìn)程使用。用于申請(qǐng)不連續(xù)內(nèi)存。
(3)brk/mmap類型。用戶進(jìn)程使用。malloc/free實(shí)現(xiàn)的基礎(chǔ)。
有關(guān)詳細(xì)內(nèi)容,推薦http://www.kerneltravel.net/journal/v/mem.htmhttp://www.kerneltravel.net上有不少內(nèi)核相關(guān)知識(shí)。
二、malloc系統(tǒng)的內(nèi)存管理策略
    malloc系統(tǒng)有自己的內(nèi)存池管理策略,malloc的時(shí)候,檢測(cè)池中是否有足夠內(nèi)存,有則直接分配,無則從內(nèi)存中調(diào)用brk/mmap函數(shù)分配,一般小于等于128k(可設(shè)置)的內(nèi)存,使用brk函數(shù),此時(shí)堆向上(有人有的硬件或系統(tǒng)向下)增長(zhǎng),大于128k的內(nèi)存使用mmap函數(shù)申請(qǐng),此時(shí)堆的位置任意,無固定增長(zhǎng)方向。free的時(shí)候,檢測(cè)標(biāo)記是否是mmap申請(qǐng),是則調(diào)用unmmap歸還給操作系統(tǒng),非則檢測(cè)堆頂是否有大于128k的空間,有則通過brk歸還給操作系統(tǒng),無則標(biāo)記未使用,仍在glibc的管理下。glibc為申請(qǐng)的內(nèi)存存儲(chǔ)多余的結(jié)構(gòu)用于管理,因此即使是malloc(0),也會(huì)申請(qǐng)出內(nèi)存(一般16字節(jié),依賴于malloc的實(shí)現(xiàn)方式),在應(yīng)用程序?qū)用妫琺alloc(0)申請(qǐng)出的內(nèi)存大小是0,因?yàn)閙alloc返回的時(shí)候在實(shí)際的內(nèi)存地址上加了16個(gè)字節(jié)偏移,而c99標(biāo)準(zhǔn)則規(guī)定malloc(0)的返回行為未定義。除了內(nèi)存塊頭域,malloc系統(tǒng)還有紅黑樹結(jié)構(gòu)保存內(nèi)存塊信息,不同的實(shí)現(xiàn)又有不同的分配策略。頻繁直接調(diào)用malloc,會(huì)增加內(nèi)存碎片,增加和內(nèi)核態(tài)交互的可能性,降低系統(tǒng)性能。linux下的glibc多為Doug Lea實(shí)現(xiàn),有興趣的可以去baidu、google。
三、應(yīng)用層面的內(nèi)存池管理
    跳過malloc,直接基于brk/mmap實(shí)現(xiàn)內(nèi)存池,原理上是可行的,但實(shí)際中這種實(shí)現(xiàn)要追逐內(nèi)核函數(shù)的升級(jí),增加了維護(hù)成本,另增加了移植性的困難,據(jù)說squid的內(nèi)存池是基于brk的,本人尚未閱讀squid源碼(了解磁盤緩存的最佳代碼,以后再詳細(xì)閱讀),不敢妄言。本文后面的討論的內(nèi)存池都是基于malloc(或者new)實(shí)現(xiàn)。我們可以將內(nèi)存池的實(shí)現(xiàn)分兩個(gè)類別來討論。
1、不定長(zhǎng)內(nèi)存池。典型的實(shí)現(xiàn)有apr_pool、obstack。優(yōu)點(diǎn)是不需要為不同的數(shù)據(jù)類型創(chuàng)建不同的內(nèi)存池,缺點(diǎn)是造成分配出的內(nèi)存不能回收到池中。這是由于這種方案以session為粒度,以業(yè)務(wù)處理的層次性為設(shè)計(jì)基礎(chǔ)。
(1)apr_pool。apr全稱Apache portable Run-time libraries,Apache可移植運(yùn)行庫(kù)。可以從http://www.apache.org/網(wǎng)站上下載到。apache以高性能、穩(wěn)定性著稱,它所有模塊的內(nèi)存申請(qǐng)都由內(nèi)存池模塊apr_pool實(shí)現(xiàn)。有關(guān)apr_pool結(jié)構(gòu)、實(shí)現(xiàn)的原理,http://blog.csdn.net/tingya/(apache源碼分析類別中的apache內(nèi)存池實(shí)現(xiàn)內(nèi)幕系列)已經(jīng)有了詳細(xì)的講解,結(jié)合自己下載的源碼,已經(jīng)足夠了。本人并不推薦去看這個(gè)blog和去看詳細(xì)的代碼數(shù)據(jù)結(jié)構(gòu)以及邏輯。明白apr_pool實(shí)現(xiàn)的原理,知道如何使用就足夠了。深入細(xì)節(jié)只能是浪費(fèi)腦細(xì)胞,當(dāng)然完全憑個(gè)人興趣愛好了。
    這里舉例說下簡(jiǎn)單的使用:

#include "apr_pools.h"
#include 
<stdio.h>
#include 
<new>

int main()
{
    apr_pool_t 
*root;
    apr_pool_initialize();
//初始化全局分配子(allocator),并為它設(shè)置mutext,以用于多線程環(huán)境,初始化全局池,指定全局分配

子的owner是全局池
    apr_pool_create(
&root,NULL);//創(chuàng)建根池(默認(rèn)父池是全局池),根池生命期為進(jìn)程生存期。分配子默認(rèn)為全局分配子
    {
        apr_pool_t 
*child;
        apr_pool_create(
&child,root);//創(chuàng)建子池,指定父池為root。分配子默認(rèn)為父池分配子
        void *pBuff=apr_palloc(child,sizeof(int));//從子池分配內(nèi)存
        int *pInt=new (pBuff)  int(5);//隨便舉例下基于已分配內(nèi)存后,面向?qū)ο髽?gòu)造函數(shù)的調(diào)用。
        printf("pInt=%d\n",*pInt);
        
{
            apr_pool_t 
*grandson;
            apr_pool_create(
&grandson,root);
            
void *pBuff2=apr_palloc(grandson,sizeof(int));
            
int *pInt2=new (pBuff2)  int(15);
            printf(
"pInt2=%d\n",*pInt2);    

            apr_pool_destroy(grandson);
        }

        apr_pool_destroy(child);
//釋放子池,將內(nèi)存歸還給分配子
    }

    apr_pool_destroy(root);
//釋放父池,
    apr_pool_terminate();//釋放全局池,釋放全局allocator,將內(nèi)存歸還給系統(tǒng)
    return 1;
}

    apr_pool中主要有3個(gè)對(duì)象,allocator、pool、block。pool從allocator申請(qǐng)內(nèi)存,pool銷毀的時(shí)候把內(nèi)存歸還allocator,allocator銷毀的時(shí)候把內(nèi)存歸還給系統(tǒng),allocator有一個(gè)owner成員,是一個(gè)pool對(duì)象,allocator的owner銷毀的時(shí)候,allocator被銷毀。在apr_pool中并無block這個(gè)單詞出現(xiàn),這里大家可以把從pool從申請(qǐng)的內(nèi)存稱為block,使用apr_palloc申請(qǐng)block,block只能被申請(qǐng),沒有釋放函數(shù),只能等pool銷毀的時(shí)候才能把內(nèi)存歸還給allocator,用于allocator以后的pool再次申請(qǐng)。
    我給的例子中并沒有出現(xiàn)創(chuàng)建allocator的函數(shù),而是使用的默認(rèn)全局allocator。apr_pool提供了一系列函數(shù)操作allocator,可以自己調(diào)用這些函數(shù):
apr_allocator_create
apr_allocator_destroy
apr_allocator_alloc
apr_allocator_free
創(chuàng)建銷毀allocator
apr_allocator_owner_set
apr_allocator_owner_get
設(shè)置獲取owner
apr_allocator_max_free_set 設(shè)置pool銷毀的時(shí)候內(nèi)存是否直接歸還到操作系統(tǒng)的閾值
apr_allocator_mutex_set
apr_allocator_mutex_get
設(shè)置獲取mutex,用于多線程

另外還有設(shè)置清理函數(shù)啊等等,不說了。自己去看include里的頭文件好了:apr_pool.h和apr_allocator.h兩個(gè)。源碼.c文件里,APR_DECLARE宏聲明的函數(shù)即是暴露給外部使用的函數(shù)。大家也可以仿造Loki(后文將介紹Loki)寫個(gè)頂層類重載operator new操作子,其中調(diào)用apr_palloc,使用到的數(shù)據(jù)結(jié)構(gòu)繼承該類,則自動(dòng)從pool中申請(qǐng)內(nèi)存,如要完善的地方很多,自行去研究吧。
    可以看出來apr_pool的一個(gè)大缺點(diǎn)就是從池中申請(qǐng)的內(nèi)存不能歸還給內(nèi)存池,只能等pool銷毀的時(shí)候才能歸還。為了彌補(bǔ)這個(gè)缺點(diǎn),apr_pool的實(shí)際使用中,可以申請(qǐng)擁有不同生命周期的內(nèi)存池(類似與上面的例子程序中不同的大括號(hào)代表不同的生命周期,實(shí)際中,盡可以把大括號(hào)中的內(nèi)容想象成不同的線程中的......),以便盡可能快的回收不再使用的內(nèi)存。實(shí)際中apache也是這么做的。因此apr_pool比較適合用于內(nèi)存使用的生命期有明顯層次的情況。
    至于擔(dān)心allocator中的內(nèi)存一旦申請(qǐng)就再也不歸還給操作系統(tǒng)(當(dāng)然最后進(jìn)程退出的時(shí)候你可以調(diào)用銷毀allocator歸還,實(shí)際中網(wǎng)絡(luò)服務(wù)程序都是一直運(yùn)行的,找不到銷毀的時(shí)機(jī))的問題,就是杞人憂天了,如果在某一時(shí)刻,系統(tǒng)占用的內(nèi)存達(dá)到頂峰,意味著以后還會(huì)有這種情況。是否能接受這個(gè)解釋,就看個(gè)人的看法和系統(tǒng)的業(yè)務(wù)需求了,不能接受,就使用其它的內(nèi)存池。個(gè)人覺得apr_pool還是很不錯(cuò)的,很多服務(wù)系統(tǒng)的應(yīng)用場(chǎng)景都適用。
(2)obstack。glibc自帶的內(nèi)存池。原理與apr_pool相同。詳細(xì)使用文檔可以參閱
http://www.gnu.org/software/libc/manual/html_node/Obstacks.html。推薦apr_pool,這個(gè)就不再多說了。
(3)AutoFreeAlloc。許式偉的專欄http://blog.csdn.net/xushiweizh/category/265099.aspx
    這個(gè)內(nèi)存池我不看好。這個(gè)也屬于一個(gè)變長(zhǎng)的內(nèi)存池,內(nèi)存申請(qǐng)類似與apr_pool的pool/block層面,一次申請(qǐng)大內(nèi)存作為pool,用于block的申請(qǐng),同樣block不回收,等pool銷毀的時(shí)候直接歸還給操作系統(tǒng)。這個(gè)內(nèi)存池的方案,有apr_pool中block不能回收到pool的缺點(diǎn),沒有pool回收到allocator,以供下次繼續(xù)使用的優(yōu)點(diǎn),不支持多線程。適合于單線程,集中使用內(nèi)存的場(chǎng)景,意義不是很大。

posted on 2008-02-18 16:55 cppexplore 閱讀(15117) 評(píng)論(17)  編輯 收藏 引用

評(píng)論

# re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理 2008-02-18 17:29 CornerZhang
謝謝!看來這個(gè)apr_pool不錯(cuò).  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理 2008-02-18 18:39 eXile
對(duì)于最后一個(gè)AutoFreeAlloc, 我碰巧也研究過, 其實(shí)對(duì)于你說的"沒有pool回收到allocator,以供下次繼續(xù)使用"的問題,它最近的實(shí)現(xiàn)中已經(jīng)解決了.
在c++ 標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)SGI STL中還有一種內(nèi)存池的實(shí)現(xiàn), 就是用一系列固定長(zhǎng)的內(nèi)存池來實(shí)現(xiàn)一個(gè)不定長(zhǎng)的內(nèi)存池, 它曾經(jīng)是gcc3中stl的默認(rèn)實(shí)現(xiàn), 但在gcc4中不再使用, 理由是在多線程情況下優(yōu)化并不明顯, 線程鎖反而成為瓶頸. 所以有時(shí)候一個(gè)線程一個(gè)內(nèi)存池也是一個(gè)選擇.
  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理[未登錄] 2008-02-18 20:11 CppExplore
@CornerZhang
呵呵,apache很成功,apr_pool自然不會(huì)差。

@eXile
AutoFreeAlloc的發(fā)展方向應(yīng)該就是apr_pool。apr_pool已經(jīng)把變長(zhǎng)的內(nèi)存池發(fā)展到極致,當(dāng)然這是當(dāng)前看到的,或許以后有內(nèi)存池會(huì)把變長(zhǎng)內(nèi)存池推到一個(gè)新的高度。:)
支持多線程的內(nèi)存池都是從單線程加鎖機(jī)制實(shí)現(xiàn)的,都提供無鎖的實(shí)現(xiàn)。apr_pool也是,顯式構(gòu)造allocator后不調(diào)用apr_allocator_mutex_set就是無鎖的實(shí)現(xiàn)。
后面的boost和loki的無鎖和有鎖的實(shí)現(xiàn)區(qū)別更是明顯。   回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理 2008-02-19 12:33 空明流轉(zhuǎn)
多線程的池子Lock-Free的解決辦法很有前途。原子操作速度很快,沒有鎖的消耗。  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理[未登錄] 2008-02-19 15:59 cppexplore
@空明流轉(zhuǎn)
這個(gè)現(xiàn)在還是只能停留在美好的展望階段,不過這一天的到來不遠(yuǎn)了。
  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(一) 2008-02-19 21:49 空明流轉(zhuǎn)
展望已經(jīng)不是展望了。就是庫(kù)中用的很少,但是不排除一些服務(wù)器上已經(jīng)用了這個(gè)玩意了。  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(一) 2008-03-19 16:43 xushiwei
關(guān)于AutoFreeAlloc,推薦博主看一下以下兩篇:

http://cpp.winxgui.com/cn:a-general-gc-allocator-scopealloc
http://cpp.winxgui.com/cn:lock-free-gc-allocator
  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(一) 2008-03-19 16:45 xushiwei
另外,AutoFreeAlloc與apr pools的性能對(duì)比:
http://cpp.winxgui.com/cn:gc-allocators-vs-apr-pools  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(一) 2008-03-19 17:34 cppexplore
@xushiwei
麻煩做下修改再測(cè)試:
void doAprPools1(LogT& log)
{
log.print("===== APR Pools =====\n");
std::PerformanceCounter counter;
for (int i = 0; i < N; ++i)
{
apr_pool_t* alloc;
apr_pool_create(&alloc, m_pool);
int* p = (int*)apr_palloc(alloc, sizeof(int));
apr_pool_destroy(alloc);
}
counter.trace(log);
}
改成
void doAprPools1(LogT& log)
{
int i;
apr_pool_t* alloc;
apr_pool_create(&alloc, m_pool);
for (i = 0; i < N; ++i)
{
int* p = (int*)apr_palloc(alloc, sizeof(int));
}
apr_pool_destroy(alloc);

apr_pool_t* alloc2;
apr_pool_create(&alloc2, m_pool);
log.print("===== APR Pools =====\n");
std::PerformanceCounter counter;
for (i = 0; i < N; ++i)
{
int* p = (int*)apr_palloc(alloc2, sizeof(int));
}
counter.trace(log);
apr_pool_destroy(alloc2);
}
至于線程鎖的使用開銷,這里就先不考慮了。“apr_pool也是,顯式構(gòu)造allocator后不調(diào)用apr_allocator_mutex_set就是無鎖的實(shí)現(xiàn)。 ”  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(一) 2008-03-23 13:51 xushiwei
to cppexplore: 請(qǐng)留意我的測(cè)試意圖。  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(一) 2008-03-24 12:28 cppexplore
@xushiwei
你的測(cè)試代碼對(duì)apr-pool不公平,首先(1)作為服務(wù)器,關(guān)心是長(zhǎng)期運(yùn)行后的性能,而不是開始幾個(gè)請(qǐng)求的性能,一個(gè)服務(wù)器可能365天無間斷服務(wù),而只拿系統(tǒng)啟動(dòng)2分鐘的性能來衡量1年的性能顯然不合適,而apr-pool開始申請(qǐng)內(nèi)存是直接new,釋放的時(shí)候才組織內(nèi)存池結(jié)構(gòu)。(2)對(duì)于集中處理的情況(類似你的測(cè)試代碼),內(nèi)存的申請(qǐng)是從同一個(gè)池中申請(qǐng)的,而不是申請(qǐng)一塊內(nèi)存,就必須先申請(qǐng)一個(gè)池。
你的測(cè)試代碼,(1)是針對(duì)apr-pool性能最差的建池階段 (2)每申請(qǐng)一塊內(nèi)存,反復(fù)的從allocator創(chuàng)建銷毀內(nèi)存池,和實(shí)際的使用不相符
而你的內(nèi)存池,則沒有建池階段,直接棧中建池,我認(rèn)為用上面寫過apr-pool測(cè)試代碼用來測(cè)試,才對(duì)apr-pool公平。

其實(shí)我覺得對(duì)內(nèi)存池做這種性能對(duì)比沒意義,首先這是變長(zhǎng)內(nèi)存池,不需要考慮釋放,性能對(duì)比也就只是測(cè)試申請(qǐng)階段的性能,而變長(zhǎng)內(nèi)存池都是在已有大內(nèi)存上的指針滑動(dòng),都是常數(shù)步驟內(nèi)完成。因此和算法之間對(duì)比性能不同,完善的內(nèi)存池之間根本就沒有性能比較的必要。  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(一) 2008-03-24 15:40 xushiwei
to cppexplore: 我的測(cè)試分了兩種情況,我想你關(guān)注的是測(cè)試2的對(duì)比數(shù)據(jù)。測(cè)試1在實(shí)際中并不常見,只是我要看的是allocator的伸縮性。至于內(nèi)存池的效率,我的觀念和你相反,既然它是基礎(chǔ)設(shè)施,那么它的性能調(diào)優(yōu)是非常關(guān)鍵的,比你去優(yōu)化任何其他東西都來得有效。而算法之間我比較關(guān)心復(fù)雜度,而不是非常關(guān)心性能調(diào)優(yōu)(微調(diào))。  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(一)[未登錄] 2008-03-25 09:04 cppexplore
@xushiwei
“它是基礎(chǔ)設(shè)施,那么它的性能調(diào)優(yōu)是非常關(guān)鍵的”,這句話我不反對(duì),雖然我認(rèn)為對(duì)變長(zhǎng)內(nèi)存池沒必要。不過你的測(cè)試代碼并沒有反映apr_pool的真實(shí)性能。  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(一) 2008-04-25 16:19 Simon
不知道apr_pool使用在商業(yè)軟件中是否有版權(quán)問題?  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(一) 2008-04-25 16:53 cppexplore
它使用Apache License。允許免費(fèi)修改重發(fā)布,允許商業(yè)使用,允許不公布修改后的源代碼。  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】技術(shù)系列之 內(nèi)存管理(一) 2008-10-23 13:23 cui
apr_pool 不是預(yù)先申請(qǐng)大塊內(nèi)存嗎? 不然變長(zhǎng)內(nèi)存池怎么實(shí)現(xiàn)?  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】技術(shù)系列之 內(nèi)存管理(一) 2009-03-23 17:41 舵手
內(nèi)存,內(nèi)存。。。  回復(fù)  更多評(píng)論
  


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美成人在线影院| 一区二区精品在线观看| 亚洲精品社区| 国产精品igao视频网网址不卡日韩| 欧美激情一区二区久久久| 久久久久亚洲综合| 久久蜜桃香蕉精品一区二区三区| 久久av二区| 99精品国产热久久91蜜凸| 日韩视频精品| 宅男噜噜噜66一区二区 | 久久亚洲精品伦理| 欧美福利视频在线| 欧美国产精品专区| 99在线精品免费视频九九视| 亚洲综合不卡| 久久gogo国模啪啪人体图| 欧美影院久久久| 久久久国产精品一区| 欧美成人午夜视频| 欧美黄色精品| 国产精品护士白丝一区av| 黄色精品免费| 久久一区二区三区国产精品| 葵司免费一区二区三区四区五区| 欧美电影在线观看完整版| 欧美日韩在线观看一区二区| 国产一区二区丝袜高跟鞋图片| 亚洲黄色免费网站| 国产视频在线观看一区| 亚洲国产精品va在线观看黑人| 一本一本久久| 久久天天躁狠狠躁夜夜av| 日韩一级二级三级| 久久高清免费观看| 欧美性猛交xxxx乱大交蜜桃| 在线观看日韩www视频免费| 一本在线高清不卡dvd| 久久国产精品久久久久久| 亚洲第一毛片| 这里只有视频精品| 欧美成人精品在线| 好吊日精品视频| 亚洲综合精品| 亚洲九九精品| 噜噜噜躁狠狠躁狠狠精品视频| 国产精品任我爽爆在线播放| 欧美日韩精品久久久| 国外成人免费视频| 亚洲免费网站| 一区二区欧美精品| 欧美激情精品久久久久久久变态 | 亚洲影院在线观看| 欧美日韩国产成人在线免费 | 欧美日韩日本视频| 韩国女主播一区| 久久久噜噜噜久久| 亚洲欧美日韩精品久久亚洲区 | 国产一区二区日韩精品欧美精品| 日韩视频在线永久播放| 欧美高清视频一区二区| 欧美中文字幕在线| 国产综合av| 久久久久免费观看| 欧美伊人久久久久久久久影院| 欧美视频免费在线| 亚洲欧美视频在线| 亚洲一区二区三区在线看| 国产精品高潮呻吟视频| 午夜精品一区二区三区在线 | 久久综合网hezyo| 亚洲国产精品成人va在线观看| 欧美777四色影视在线| 久久精品国产精品亚洲| 影音先锋国产精品| 91久久久亚洲精品| 欧美日本中文| 亚洲午夜久久久久久久久电影网| 亚洲欧美国产高清| 一本色道久久精品| 国产精品视频久久一区| 欧美一区二区三区免费视频| 香蕉久久夜色| 在线日韩电影| 亚洲片在线观看| 欧美午夜不卡视频| 久久精精品视频| 欧美成人黄色小视频| 亚洲婷婷综合色高清在线| 亚洲综合精品四区| 亚洲国产精品久久久久秋霞蜜臀| 欧美电影免费网站| 欧美乱人伦中文字幕在线| 亚洲一区二区在线免费观看| 亚洲综合不卡| 亚洲激情视频在线| 亚洲作爱视频| 禁断一区二区三区在线| 亚洲国产精品一区二区三区| 亚洲一区高清| 国产一级久久| 亚洲第一天堂无码专区| 欧美午夜免费影院| 免费不卡在线视频| 欧美精品在线观看| 久久久精品日韩| 欧美丰满少妇xxxbbb| 欧美一二三区精品| 欧美成人免费全部| 欧美专区在线观看一区| 欧美激情91| 在线日韩欧美| 亚洲综合视频在线| 99视频精品在线| 欧美永久精品| 亚洲线精品一区二区三区八戒| 久久久高清一区二区三区| 在线视频亚洲| 欧美日韩在线视频首页| 欧美一区二区在线看| 欧美激情第1页| 久久久美女艺术照精彩视频福利播放 | 欧美ab在线视频| 久久久久久网站| 欧美视频亚洲视频| 欧美激情在线狂野欧美精品| 国产亚洲va综合人人澡精品| 亚洲欧美区自拍先锋| 欧美成人一品| 免费不卡在线观看| 国语自产精品视频在线看一大j8 | 亚洲大胆人体在线| 黄色成人91| 欧美一级艳片视频免费观看| 亚洲婷婷综合久久一本伊一区| 欧美国产精品人人做人人爱| 亚洲精品免费电影| 久久久噜噜噜久久中文字幕色伊伊| 欧美一区二区在线观看| 国产精品国产自产拍高清av| 99re国产精品| 亚洲性人人天天夜夜摸| 欧美日韩国产精品自在自线| 亚洲人成网站在线播| 亚洲精品视频免费| 欧美精品久久天天躁| 亚洲国产视频直播| 99成人在线| 欧美激情网友自拍| 亚洲精选91| 亚洲欧美日韩国产综合在线 | 一本久久精品一区二区| 欧美人妖在线观看| 亚洲一区二区欧美日韩| 亚洲欧美日韩区| 国产精品网站在线| 午夜精品久久| 久久亚洲影音av资源网| 国内偷自视频区视频综合| 久久精品91久久久久久再现| 美女黄色成人网| aⅴ色国产欧美| 欧美日韩午夜| 亚洲欧美日韩国产中文在线| 久久午夜视频| 亚洲日本一区二区| 国产精品hd| 久久婷婷久久| 亚洲国产精品传媒在线观看| 一二三四社区欧美黄| 亚洲国产精品一区二区尤物区| 国产精品国产三级国产普通话三级| 亚洲一级影院| 裸体一区二区| 这里是久久伊人| 国产日韩免费| 欧美jjzz| 亚洲一区二区不卡免费| 久久久久国产精品一区二区| 亚洲国产精品www| 国产精品午夜在线观看| 理论片一区二区在线| 亚洲视频精选在线| 欧美xxx成人| 亚洲欧美日韩综合国产aⅴ| 狠狠色狠狠色综合日日tαg| 欧美精品日韩一本| 性伦欧美刺激片在线观看| 亚洲福利国产| 久久成人一区二区| 一本大道久久a久久精品综合| 国产一区二区精品久久99| 欧美日韩国产小视频在线观看| 亚洲一区中文| 亚洲精品在线免费观看视频| 久久综合精品国产一区二区三区| 亚洲一区bb| 亚洲免费成人av电影| 精品成人在线视频| 国产视频欧美视频|