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

那誰(shuí)的技術(shù)博客

感興趣領(lǐng)域:高性能服務(wù)器編程,存儲(chǔ),算法,Linux內(nèi)核
隨筆 - 210, 文章 - 0, 評(píng)論 - 1183, 引用 - 0
數(shù)據(jù)加載中……

服務(wù)器公共庫(kù)開發(fā)-內(nèi)存池管理模塊

這個(gè)內(nèi)存池之前已經(jīng)介紹過了,在這里

這次整理自己的服務(wù)器公共庫(kù),沒有忘記這個(gè)好東西,算法沒有改變,但是有兩個(gè)變化:
1) 我認(rèn)為這個(gè)模塊對(duì)于一個(gè)服務(wù)器而言, 應(yīng)該是一個(gè)單件, 所以它繼承自前面說過的singleton基類.
2) 加入了線程鎖, 同樣是可以配置的, 因?yàn)槲一静粚懚嗑€程的服務(wù)器, 不過, 還是把接口保留在那里吧, 如果需要可以打開以支持多線程.

mempool.h:
/********************************************************************
    created:    2008/08/03
    filename:   mempool.h    
    author:        Lichuang
                
    purpose:    仿SGI STL內(nèi)存池的實(shí)現(xiàn)
********************************************************************
*/

#ifndef __MEM_POOL_H__
#define __MEM_POOL_H__

#include 
"singleton.h"
#include 
"threadmutex.h"
#include 
<stdio.h>

// 字節(jié)對(duì)齊數(shù)
#define ALIGN                512
// 最大BLOCK的尺寸
#define MAX_BLOCK_SIZE        20 * 1024
// HASH表的數(shù)量
#define BLOCK_LIST_NUM        (MAX_BLOCK_SIZE) / (ALIGN)
// HASH表中每次初始化時(shí)LIST中元素的數(shù)量
#define LIST_NODE_NUM        20

class CMemPool
    : CSingleton
<CMemPool>
{
public:
    
void* Allocate(size_t nSize);
    
void* Reallocate(void* p, size_t nOldSize, size_t nNewSize);
    
void  Deallocate(void* p, size_t nSize);
    
int   GetMemSize();

private:
    CMemPool();
    
virtual ~CMemPool();

    
char* AllocChunk(size_t nSize, int& nObjs);
    
void* Refill(size_t n);
    size_t RoundUp(size_t nBytes);
    
int GetFreeListIndex(size_t nBytes);

private:
    DECLARE_SINGLETON_CLASS(CMemPool)

private:        
    union Obj
    {
        union Obj
* pFreeListLink;
        
char szData[1];
    };

    Obj
* m_szFreeList[BLOCK_LIST_NUM];

    
char* m_pStartFree;
    
char* m_pEndFree;
    size_t m_nHeapSize;
    CThreadMutex m_tThreadMutex;
};

#endif /* __MEM_POOL_H__ */


mempool.cpp:
/********************************************************************
    created:    2008/08/01
    filename:     mempool.h
    author:        Lichuang
                
    purpose:    模擬SGI STL內(nèi)存池的實(shí)現(xiàn), 可以配置是否支持多線程
********************************************************************
*/

#include 
"mempool.h"
#include 
<string.h>

CMemPool::CMemPool()
    : m_pStartFree(NULL)
    , m_pEndFree(NULL)
    , m_nHeapSize(
0)                      
{
    ::memset(m_szFreeList, 
0sizeof(m_szFreeList));
}

CMemPool::
~CMemPool()
{
}

// 從內(nèi)存池中分配尺寸為n的內(nèi)存
void* CMemPool::Allocate(size_t nSize)
{
    
if (nSize > MAX_BLOCK_SIZE)
    {
        
return ::malloc(nSize);
    }
    
if (0 >= nSize)
    {
        
return NULL;
    }

    Obj
** ppFreeList;
    Obj
*  pResult;

    THREAD_LOCK;

    
// 獲得尺寸n的HASH表地址
    ppFreeList = m_szFreeList + GetFreeListIndex(nSize);
    pResult 
= *ppFreeList;
    
if (NULL == pResult)
    {
        
// 如果之前沒有分配, 或者已經(jīng)分配完畢了, 就調(diào)用refill函數(shù)重新分配
        
// 需要注意的是, 傳入refill的參數(shù)是經(jīng)過對(duì)齊處理的
        pResult = (Obj*)Refill(RoundUp(nSize));
    }
    
else
    {
        
// 否則就更新該HASH表的LIST頭節(jié)點(diǎn)指向下一個(gè)LIST的節(jié)點(diǎn), 當(dāng)分配完畢時(shí), 頭結(jié)點(diǎn)為NULL
        *ppFreeList = pResult->pFreeListLink;
    }

    THREAD_UNLOCK;

    
return pResult;
}

void* CMemPool::Reallocate(void* p, size_t nOldSize, size_t nNewSize)
{
    
void* pResult;
    size_t nCopySize;

    
// 如果超過內(nèi)存池所能承受的最大尺寸, 調(diào)用系統(tǒng)API重新分配內(nèi)存
    if (nOldSize > (size_t)MAX_BLOCK_SIZE && nNewSize > (size_t)MAX_BLOCK_SIZE)
    {
        
return ::realloc(p, nNewSize);
    }

    
// 如果新老內(nèi)存尺寸在對(duì)齊之后相同, 那么直接返回
    if (RoundUp(nOldSize) == RoundUp(nNewSize))
        
return p;

    
// 首先按照新的尺寸分配內(nèi)存
    pResult = Allocate(nNewSize);
    
if (NULL == pResult)
    {
        
return NULL;
    }
    
// copy舊內(nèi)存的數(shù)據(jù)到新的內(nèi)存區(qū)域
    nCopySize = nNewSize > nOldSize ? nOldSize : nNewSize;
    ::memcpy(pResult, p, nCopySize);
    
// 釋放舊內(nèi)存區(qū)域
    Deallocate(p, nOldSize);

    
return pResult;
}

// 將尺寸為n的內(nèi)存回收到內(nèi)存池中
void CMemPool::Deallocate(void* p, size_t nSize)
{
    Obj
* pObj = (Obj *)p;
    Obj 
**ppFreeList;

    
if (0 >= nSize)
    {
        
return;
    }
    
// 如果要回收的內(nèi)存大于MAX_BLOCK_SIZE, 直接調(diào)用free回收內(nèi)存
    if (nSize > MAX_BLOCK_SIZE)
    {
        ::free(p);
        
return;
    }

    
// 將回收的內(nèi)存作為鏈表的頭回收
    ppFreeList = m_szFreeList + GetFreeListIndex(nSize);

    THREAD_LOCK;

    pObj
->pFreeListLink = *ppFreeList;
    
*ppFreeList = pObj;

    THREAD_UNLOCK;
}

int CMemPool::GetMemSize()
{
    
return m_nHeapSize;
}

size_t CMemPool::RoundUp(size_t nBytes)
{
    
return (nBytes + ALIGN - 1& ~(ALIGN - 1);
}

int CMemPool::GetFreeListIndex(size_t nBytes)
{
    
return (nBytes + ALIGN - 1/ ALIGN - 1;
}


char* CMemPool::AllocChunk(size_t nSize, int& nObjs)
{
    
char* pResult;
    
// 總共所需的內(nèi)存
    size_t nTotalBytes = nSize * nObjs;
    
// 剩余的內(nèi)存
    size_t nBytesLeft = m_pEndFree - m_pStartFree;

    
// 如果剩余的內(nèi)存可以滿足需求, 就直接返回之, 并且更新內(nèi)存池的指針
    if (nBytesLeft >= nTotalBytes)
    {
        pResult 
= m_pStartFree;
        m_pStartFree 
+= nTotalBytes;
        
return pResult;
    }

    
// 如果剩余的內(nèi)存大于單位內(nèi)存數(shù)量, 也就是說至少還可以分配一個(gè)單位內(nèi)存
    
// 計(jì)算出最多可以分配多少塊單位內(nèi)存, 保存至nobjs, 返回內(nèi)存的指針
    if (nBytesLeft >= nSize)
    {
        nObjs 
= (int)(nBytesLeft / nSize);
        nTotalBytes 
= nSize * nObjs;
        pResult 
= m_pStartFree;
        m_pStartFree 
+= nTotalBytes;
        
return pResult;
    }

    
// 如果還有剩余的內(nèi)存, 將它放到對(duì)應(yīng)的HASH-LIST頭部
    if (0 < nBytesLeft)
    {
        Obj
** ppFreeList = m_szFreeList + GetFreeListIndex(nBytesLeft);
        ((Obj
*)m_pStartFree)->pFreeListLink = *ppFreeList;
        
*ppFreeList = (Obj*)m_pStartFree;
    }

    
// 需要獲取的內(nèi)存, 注意第一次分配都要兩倍于total_bytes的大小
    
// 同時(shí)要加上原有的heap_size / 4的對(duì)齊值
    size_t nBytesToGet = 2 * nTotalBytes + RoundUp(m_nHeapSize >> 4);
    m_pStartFree 
= (char*)::malloc(nBytesToGet);

    
// 獲取成功 重新調(diào)用chunk_alloc函數(shù)分配內(nèi)存
    if (NULL != m_pStartFree)
    {
        m_nHeapSize 
+= nBytesToGet;
        m_pEndFree 
= m_pStartFree + nBytesToGet;
        
return AllocChunk(nSize, nObjs);
    }

    
// 下面是獲取不成功的處理.

    
// 從下一個(gè)HASH-LIST中尋找可用的內(nèi)存
    int i = (int)GetFreeListIndex(nSize) + 1;
    Obj 
**ppFreeList, *p;
    
for (; i < BLOCK_LIST_NUM; ++i)
    {
        ppFreeList 
= m_szFreeList + i;
        p 
= *ppFreeList;

        
if (NULL != p)
        {
            
*ppFreeList = p->pFreeListLink;
            m_pStartFree 
= (char*)p;
            m_pEndFree 
= m_pStartFree + (i + 1* ALIGN;
            
return AllocChunk(nSize, nObjs);
        }
    }

    m_pEndFree 
= NULL;

    
return NULL;
}

// 重新分配尺寸為n的內(nèi)存, 其中n是經(jīng)過字節(jié)對(duì)齊處理的數(shù)
void* CMemPool::Refill(size_t n)
{
    
// 每個(gè)鏈表每次初始化時(shí)最多LIST_NODE_NUM個(gè)元素
    int nObjs = LIST_NODE_NUM;
    
char* pChunk = AllocChunk(n, nObjs);
    Obj
** ppFreeList;
    Obj
* pResult;
    Obj 
*pCurrentObj, *pNextObj;
    
int i;

    
// 如果只請(qǐng)求成功了一個(gè)元素, 直接返回之
    if (1 == nObjs)
    {
        
return pChunk;
    }
    
// 獲得尺寸n的HASH表地址
    ppFreeList = m_szFreeList + GetFreeListIndex(n);

    
// 獲得請(qǐng)求的內(nèi)存地址
    pResult = (Obj*)pChunk;
    
// 請(qǐng)求了一個(gè)單位內(nèi)存, 減少一個(gè)計(jì)數(shù)
    --nObjs;
    
// 從下一個(gè)單位開始將剩余的obj連接起來(lái)
    *ppFreeList = pNextObj = (Obj*)(pChunk + n);

    
// 將剩余的obj連接起來(lái)
    for (i = 1; ; ++i)
    {
        pCurrentObj 
= pNextObj;
        pNextObj 
= (Obj*)((char*)pNextObj + n);

        
// 分配完畢, 下一個(gè)節(jié)點(diǎn)為NULL, 退出循環(huán)
        if (nObjs == i)
        {
            pCurrentObj
->pFreeListLink = NULL;
            
break;
        }

        pCurrentObj
->pFreeListLink = pNextObj;
    }

    
return pResult;
}



posted on 2008-08-11 23:30 那誰(shuí) 閱讀(4717) 評(píng)論(14)  編輯 收藏 引用 所屬分類: 算法與數(shù)據(jù)結(jié)構(gòu)服務(wù)器設(shè)計(jì)Linux/Unix

評(píng)論

# re: 服務(wù)器公共庫(kù)開發(fā)-內(nèi)存池管理模塊  回復(fù)  更多評(píng)論   

內(nèi)存池作為單件會(huì)嚴(yán)重減小適應(yīng)范圍的
2008-08-12 01:04 | 陳梓瀚(vczh)

# re: 服務(wù)器公共庫(kù)開發(fā)-內(nèi)存池管理模塊[未登錄]  回復(fù)  更多評(píng)論   

覺得boost::pool是個(gè)不錯(cuò)的東西,沒什么必要自已重新造一個(gè)沒別人好的車輪
2008-08-12 09:08 | ricardo

# re: 服務(wù)器公共庫(kù)開發(fā)-內(nèi)存池管理模塊[未登錄]  回復(fù)  更多評(píng)論   

@ricardo
我不用boost,也不會(huì)用,謝謝.
2008-08-12 09:54 | 創(chuàng)

# re: 服務(wù)器公共庫(kù)開發(fā)-內(nèi)存池管理模塊[未登錄]  回復(fù)  更多評(píng)論   

最好不要用單件。

可以使用簡(jiǎn)化的slab來(lái)做內(nèi)存池/對(duì)象池——雖然不支持可變長(zhǎng)度對(duì)象,但其使用范圍更廣也更靈活。
2008-08-12 10:24 | raof01

# re: 服務(wù)器公共庫(kù)開發(fā)-內(nèi)存池管理模塊  回復(fù)  更多評(píng)論   

“沒什么必要自已重新造一個(gè)沒別人好的車輪”就是因?yàn)槲覀儑?guó)家太多的程序員有這樣的潛意識(shí),導(dǎo)致我們知其然而不知其所以然。自己造車輪是好事,強(qiáng)烈支持造車輪者。
毛主席當(dāng)年如果沒有讓我國(guó)航天人員自己造車輪,他們現(xiàn)在恐怕又得跟在老美、老英屁股后面拾糞了。開玩笑的說法就是:吃屎都趕不上熱的。和航天事業(yè)形成鮮明對(duì)比的就是航空,我們的大飛機(jī)項(xiàng)目今年才啟動(dòng),開始嘗試自己造車輪,強(qiáng)烈感謝胡主席和溫總理,感謝他們的獨(dú)具慧眼,感謝他們給當(dāng)代航空有志青年帶來(lái)希望,帶來(lái)工作機(jī)會(huì),雖然慢了幾拍。但是我相信再遠(yuǎn)的目標(biāo),只要開始就能實(shí)現(xiàn)!中國(guó)加油!
有能力造車的人,能夠更好的使用別人的車,進(jìn)而改進(jìn)自己的造車技術(shù),這是一個(gè)良構(gòu)的循環(huán),是一個(gè)具有創(chuàng)新能力和自優(yōu)化能力的循環(huán);而一味的買別人的車使用,成本大是小事,萬(wàn)一他娘的鬼子們不賣給咱新車、好車呢,咱們只能干瞪眼了!
-------------------- 以上僅代表個(gè)人觀點(diǎn)、與C++博客無(wú)關(guān)。
2008-08-12 10:46 | 金哥

# re: 服務(wù)器公共庫(kù)開發(fā)-內(nèi)存池管理模塊[未登錄]  回復(fù)  更多評(píng)論   

樓上的朋友別激動(dòng),之所以選擇自己寫這個(gè)庫(kù),是因?yàn)槲沂情喿x過它相關(guān)的代碼明白其原理的,而且想動(dòng)手實(shí)踐一下,以在真正的應(yīng)用中體會(huì)其性能等,諸如boost之類的第三方庫(kù),第一我不了解, 第二我不想在封裝的庫(kù)中引入別的庫(kù),所以除非必要否則我是不想使用的.

至于為什么這里封裝成單件,我說了,這是一個(gè)服務(wù)器的公共庫(kù),而我認(rèn)為,在一個(gè)運(yùn)行的服務(wù)器上,這樣的模塊應(yīng)該只有一個(gè), 所有請(qǐng)求分配內(nèi)存的操作都去找這個(gè)模塊申請(qǐng)內(nèi)存.

2008-08-12 10:59 | 創(chuàng)

# re: 服務(wù)器公共庫(kù)開發(fā)-內(nèi)存池管理模塊[未登錄]  回復(fù)  更多評(píng)論   

另外,我認(rèn)為這個(gè)模塊也是一個(gè)"第三方庫(kù)", 因?yàn)樗菑腟GI實(shí)現(xiàn)的STL代碼中提取出來(lái)的,并不是完全的"造輪子".
2008-08-12 11:05 | 創(chuàng)

# re: 服務(wù)器公共庫(kù)開發(fā)-內(nèi)存池管理模塊[未登錄]  回復(fù)  更多評(píng)論   

覺得模塊劃分粒度不夠細(xì)??梢苑殖蓛蓚€(gè)類,這樣復(fù)用程度高一點(diǎn):
1、m_szFreeList的每個(gè)表項(xiàng)可以封裝成一個(gè)類。策略很多,找一個(gè)合適的就行。比如:
|head

-------------------------------------
|size|    |////|size|   ?。螅椋澹?br>|----|free|////|----|free|////|----|free
|next|   ?。睿澹簦   。睿澹簦?br>-------------------------------------
  ?。          ˇ洹。           ˇ洹。?br>   |           | |            | v
   ?。  。 。危眨蹋?br>當(dāng)然,復(fù)雜性會(huì)有很大的增加,比如合并內(nèi)存碎片。
2、用你的hash表來(lái)組織第一個(gè)類的對(duì)象。
2008-08-12 11:58 | raof01

# re: 服務(wù)器公共庫(kù)開發(fā)-內(nèi)存池管理模塊[未登錄]  回復(fù)  更多評(píng)論   

內(nèi)存池原理很簡(jiǎn)單,
boost的內(nèi)存池做的還可以,至少是夠用的,
另外Apache下的ARP(貌似叫這個(gè)名字)中的內(nèi)存池實(shí)現(xiàn)的也很不錯(cuò)。

其實(shí)STL中的Vector就可以當(dāng)作一個(gè)池來(lái)用,在實(shí)際應(yīng)用中能夠適用我遇到的很多情況。

自己寫寫挺好的,雖然原理簡(jiǎn)單,但是還是需要比較扎實(shí)的基礎(chǔ)知識(shí)才能做好的。做出來(lái)容易,做好難啊。
2008-08-12 12:28 | 楊粼波

# re: 服務(wù)器公共庫(kù)開發(fā)-內(nèi)存池管理模塊[未登錄]  回復(fù)  更多評(píng)論   

@楊粼波
同意。博主牛。
2008-08-12 12:45 | raof01

# re: 服務(wù)器公共庫(kù)開發(fā)-內(nèi)存池管理模塊  回復(fù)  更多評(píng)論   

@創(chuàng)
確實(shí),這個(gè)也算不做造輪子。之前我基本上將SGI的內(nèi)存池翻譯成C代碼,所以我對(duì)那一塊比較熟悉。一看你的代碼,我就覺得很眼熟。:D

@金哥
同意你的說法。我覺得我們周圍有很多程序員都抱著這樣的想法。他們總以“不重造輪子”的觀點(diǎn)告誡自己,從而不知道很多東西的底層實(shí)現(xiàn)原理。就像有些程序員以“盲目的優(yōu)化只會(huì)適得其反”這樣觀點(diǎn)為理由,而忽視了優(yōu)化的重要性一樣。

不重造輪子,是基于你懂得造輪子的原理基礎(chǔ)上的。而如果你自己都不懂,連重造輪子的能力都沒有,那基本就比重造輪子的人還差了。
2008-08-13 10:13 | Kevin Lynx

# re: 服務(wù)器公共庫(kù)開發(fā)-內(nèi)存池管理模塊  回復(fù)  更多評(píng)論   

@楊粼波
是apr_pool,是目前最好的內(nèi)存池之一(其實(shí)我認(rèn)為“之一”可以去掉),是C實(shí)現(xiàn)。
不過C++方面我個(gè)人更傾向于采用loki的smallobj的算法。loki的編程風(fēng)格不太習(xí)慣,所以通常也是自己實(shí)現(xiàn)一次(好吧,是抄襲,哦呵呵)。

@ricardo
個(gè)人以為boost pool不怎么好,還是請(qǐng)橫向?qū)Ρ纫幌缕渌膬?nèi)存池設(shè)計(jì)。

國(guó)人許式偉有一個(gè)AllocFree不錯(cuò),不過是單線程的。

btw,嚴(yán)重同意金哥,kevinlynx的看法。如果不是很趕時(shí)間,越是基礎(chǔ)的東西,越是自己寫一次的好。
2008-08-14 13:06 | 矩陣操作

# re: 服務(wù)器公共庫(kù)開發(fā)-內(nèi)存池管理模塊  回復(fù)  更多評(píng)論   

內(nèi)存池要保證一般情況下,在O(1)時(shí)間內(nèi)分配到請(qǐng)求的內(nèi)存。你這個(gè)似乎不可以。
2008-08-15 12:55 | x-matrix

# re: 服務(wù)器公共庫(kù)開發(fā)-內(nèi)存池管理模塊  回復(fù)  更多評(píng)論   

http://www.codeproject.com/KB/cpp/pools.aspx
很精巧,不過是分配定長(zhǎng)的
2008-12-05 19:32 | minus
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区三区 在线观看视频| 一本色道久久综合狠狠躁篇怎么玩 | 久久精品人人爽| 欧美日韩喷水| 亚洲片区在线| 久久香蕉国产线看观看av| 中国成人黄色视屏| 欧美精品在线一区二区| 136国产福利精品导航网址应用| 午夜亚洲激情| 亚洲精品男同| 免费短视频成人日韩| 国内成人精品一区| 一区二区三区黄色| 欧美1级日本1级| 极品尤物av久久免费看| 国产一区二区在线观看免费播放| 亚洲网站在线播放| 亚洲欧洲三级电影| 欧美大尺度在线观看| 在线日本成人| 久久亚洲风情| 欧美诱惑福利视频| 国产美女精品视频| 亚洲欧美另类在线观看| 99精品免费| 欧美日本国产视频| 欧美 日韩 国产 一区| 国产精品五区| 欧美亚洲一区三区| 亚洲一区二区少妇| 国产精品毛片一区二区三区| 亚洲女人天堂av| 一区二区三区欧美成人| 欧美午夜在线| 亚洲欧美中文日韩v在线观看| 一区二区三区国产在线| 国产精品大片wwwwww| 亚洲一区二区三| 亚洲一区二区伦理| 国产精品手机在线| 久久成人免费网| 欧美在线高清| 在线观看视频免费一区二区三区| 麻豆精品网站| 日韩视频在线免费观看| 欧美日韩在线三级| 亚洲欧美在线网| 午夜性色一区二区三区免费视频 | 久久久水蜜桃| 亚洲第一色中文字幕| 国产日韩在线视频| 久久亚洲欧美国产精品乐播| 国产精品人人做人人爽| 久久av一区二区三区漫画| 久久国产乱子精品免费女| 伊人久久av导航| 亚洲国产欧美一区二区三区久久 | 欧美中文字幕在线观看| 欧美在线不卡视频| 亚洲国产欧美日韩| 亚洲日本欧美| 国产精品入口夜色视频大尺度| 欧美一级欧美一级在线播放| 蜜月aⅴ免费一区二区三区| 猛干欧美女孩| 亚洲视频精选| 欧美一区二区视频网站| 亚洲高清在线精品| 日韩视频在线一区二区三区| 国产欧美日韩伦理| 免费观看成人| 欧美日韩黄视频| 久久精品成人一区二区三区蜜臀| 久久亚洲风情| 亚洲视频免费观看| 香蕉成人伊视频在线观看| 在线精品高清中文字幕| 亚洲精品自在久久| 国产精品一级在线| 欧美激情一区二区三区在线视频观看 | 亚洲小少妇裸体bbw| 好吊日精品视频| 亚洲人成毛片在线播放女女| 国产农村妇女精品| 亚洲电影免费观看高清完整版在线 | 午夜精品久久久久久久久 | 欧美视频在线观看一区二区| 久久国产精品久久w女人spa| 免费在线成人av| 小辣椒精品导航| 美女视频黄a大片欧美| 亚洲欧美成人精品| 久久欧美中文字幕| 亚洲在线观看免费| 久久只精品国产| 性感少妇一区| 欧美高清视频一区二区| 久久精品91| 欧美日本国产一区| 玖玖在线精品| 国产精品久久激情| 亚洲第一天堂av| 国产一区二区三区av电影 | 国产欧美一区二区精品婷婷| 亚洲国产成人久久综合一区| 国产精品一区二区你懂得| 欧美高清一区二区| 国产欧美一区二区白浆黑人| 亚洲人被黑人高潮完整版| 红桃视频成人| 一区二区三区四区五区精品视频| 在线成人激情视频| 亚洲永久精品国产| 一本色道久久综合亚洲精品小说| 久久久7777| 欧美一级片一区| 欧美日韩少妇| 欧美激情第五页| 国内不卡一区二区三区| 亚洲综合精品| 亚洲视频免费| 欧美激情综合五月色丁香小说| 美女视频网站黄色亚洲| 国产精品一级| 亚洲视频1区2区| 一区二区精品在线| 欧美成人综合一区| 男女激情久久| 国模私拍视频一区| 午夜精品亚洲一区二区三区嫩草| 亚洲午夜三级在线| 欧美精品亚洲| 91久久一区二区| 中文亚洲欧美| 亚洲国产精品精华液网站| 欧美在线亚洲一区| 久久国产一区二区| 国产精品一区一区| 亚洲九九九在线观看| 亚洲精品亚洲人成人网| 免费观看国产成人| 奶水喷射视频一区| 在线电影一区| 久久手机精品视频| 美女精品一区| 136国产福利精品导航网址| 久久久久久久91| 麻豆国产精品一区二区三区| 在线观看成人小视频| 久久久国产精品亚洲一区 | 亚洲精品在线视频观看| 欧美成人精品| 亚洲国产天堂久久综合网| 亚洲片区在线| 欧美国产日产韩国视频| 亚洲激情六月丁香| 亚洲美女淫视频| 欧美日韩p片| 日韩亚洲欧美综合| 亚洲欧美日韩精品久久奇米色影视| 国产精品成人免费视频| 亚洲小视频在线观看| 欧美一区二区三区精品 | 欧美成人综合网站| 亚洲国产欧美在线人成| 欧美 日韩 国产一区二区在线视频 | 欧美一区二区三区久久精品| 久久久av毛片精品| 在线观看欧美黄色| 欧美不卡激情三级在线观看| 亚洲人成亚洲人成在线观看图片| 一区二区三区鲁丝不卡| 欧美日韩一区在线观看视频| 亚洲天堂av在线免费| 欧美视频一区二| 欧美激情第三页| 免费中文日韩| 亚洲精选中文字幕| 欧美日韩中文在线| 亚洲淫性视频| 久久偷看各类wc女厕嘘嘘偷窃| 亚洲风情亚aⅴ在线发布| 欧美激情一区二区三区高清视频| 日韩一级精品| 久久精品视频免费播放| 极品少妇一区二区| 欧美精品在线视频| 亚洲免费在线观看视频| 快播亚洲色图| 91久久午夜| 亚洲视频一区在线| 国产日韩欧美91| 免费欧美在线| 在线视频你懂得一区| 久久乐国产精品| 日韩亚洲在线| 国产亚洲视频在线观看| 欧美成年人网| 亚洲欧美日韩一区二区三区在线|