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

colorful

zc qq:1337220912

 

兩種高性能I/O設(shè)計(jì)模式的比較

涉及到事件分享器的兩種模式稱為:Reactor and Proactor [1]. Reactor模式是基于同步I/O的,而Proactor模式是和異步I/O相關(guān)的. 在Reactor模式中,事件分離者等待某個事件或者可應(yīng)用或個操作的狀態(tài)發(fā)生(比如文件描述符可讀寫,或者是socket可讀寫),事件分離者就把這個事件傳給事先注冊的事件處理函數(shù)或者回調(diào)函數(shù),由后者來做實(shí)際的讀寫操作。

而在Proactor模式中,事件處理者(或者代由事件分離者發(fā)起)直接發(fā)起一個異步讀寫操作(相當(dāng)于請求),而實(shí)際的工作是由操作系統(tǒng)來完成的。發(fā)起時,需要提供的參數(shù)包括用于存放讀到數(shù)據(jù)的緩存區(qū),讀的數(shù)據(jù)大小,或者用于存放外發(fā)數(shù)據(jù)的緩存區(qū),以及這個請求完后的回調(diào)函數(shù)等信息。事件分離者得知了這個請求,它默默等待這個請求的完成,然后轉(zhuǎn)發(fā)完成事件給相應(yīng)的事件處理者或者回調(diào)。舉例來說,在Windows上事件處理者投遞了一個異步IO操作(稱有overlapped的技術(shù)),事件分離者等IOCompletion事件完成[1]. 這種異步模式的典型實(shí)現(xiàn)是基于操作系統(tǒng)底層異步API的,所以我們可稱之為“系統(tǒng)級別”的或者“真正意義上”的異步,因?yàn)榫唧w的讀寫是由操作系統(tǒng)代勞的。


=======================================================================

這篇文章探討并比較兩種用于TCP服務(wù)器的高性能設(shè)計(jì)模式. 除了介紹現(xiàn)有的解決方案, 還提出了一種更具伸縮性,只需要維護(hù)一份代碼并且跨平臺的解決方案(含代碼示例), 以及其在不同平臺上的微調(diào). 此文還比較了java,c#,c++對各自現(xiàn)有以及提到的解決方案的實(shí)現(xiàn)性能.

系統(tǒng)I/O 可分為阻塞型, 非阻塞同步型以及非阻塞異步型[1, 2]. 阻塞型I/O意味著控制權(quán)只到調(diào)用操作結(jié)束了才會回到調(diào)用者手里. 結(jié)果調(diào)用者被阻塞了, 這段時間了做不了任何其它事情. 更郁悶的是,在等待IO結(jié)果的時間里,調(diào)用者所在線程此時無法騰出手來去響應(yīng)其它的請求,這真是太浪費(fèi)資源了。拿read()操作來說吧, 調(diào)用此函數(shù)的代碼會一直僵在此處直至它所讀的socket緩存中有數(shù)據(jù)到來.

相比之下,非阻塞同步是會立即返回控制權(quán)給調(diào)用者的。調(diào)用者不需要等等,它從調(diào)用的函數(shù)獲取兩種結(jié)果:要么此次調(diào)用成功進(jìn)行了;要么系統(tǒng)返回錯誤標(biāo)識告訴調(diào)用者當(dāng)前資源不可用,你再等等或者再試度看吧。比如read()操作, 如果當(dāng)前socket無數(shù)據(jù)可讀,則立即返回EWOULBLOCK/EAGAIN,告訴調(diào)用read()者"數(shù)據(jù)還沒準(zhǔn)備好,你稍后再試".

在非阻塞異步調(diào)用中,稍有不同。調(diào)用函數(shù)在立即返回時,還告訴調(diào)用者,這次請求已經(jīng)開始了。系統(tǒng)會使用另外的資源或者線程來完成這次調(diào)用操作,并在完成的時候知會調(diào)用者(比如通過回調(diào)函數(shù))。拿Windows的ReadFile()或者POSIX的aio_read()來說,調(diào)用它之后,函數(shù)立即返回,操作系統(tǒng)在后臺同時開始讀操作。

在以上三種IO形式中,非阻塞異步是性能最高、伸縮性最好的。

這篇文章探討不同的I/O利用機(jī)制并提供一種跨平臺的設(shè)計(jì)模式(解決方案). 希望此文可以給于TCP高性能服務(wù)器開發(fā)者一些幫助,選擇最佳的設(shè)計(jì)方案。下面我們會比較 Java, c#, C++各自對探討方案的實(shí)現(xiàn)以及性能. 我們在文章的后面就不再提及阻塞式的方案了,因?yàn)樽枞絀/O實(shí)在是缺少可伸縮性,性能也達(dá)不到高性能服務(wù)器的要求。

兩種IO多路復(fù)用方案:Reactor and Proactor

一般情況下,I/O 復(fù)用機(jī)制需要事件分享器(event demultiplexor [1, 3]). 事件分享器的作用,即將那些讀寫事件源分發(fā)給各讀寫事件的處理者,就像送快遞的在樓下喊: 誰的什么東西送了, 快來拿吧。開發(fā)人員在開始的時候需要在分享器那里注冊感興趣的事件,并提供相應(yīng)的處理者(event handlers),或者是回調(diào)函數(shù); 事件分享器在適當(dāng)?shù)臅r候會將請求的事件分發(fā)給這些handler或者回調(diào)函數(shù).

涉及到事件分享器的兩種模式稱為:Reactor and Proactor [1]. Reactor模式是基于同步I/O的,而Proactor模式是和異步I/O相關(guān)的. 在Reactor模式中,事件分離者等待某個事件或者可應(yīng)用或個操作的狀態(tài)發(fā)生(比如文件描述符可讀寫,或者是socket可讀寫),事件分離者就把這個事件傳給事先注冊的事件處理函數(shù)或者回調(diào)函數(shù),由后者來做實(shí)際的讀寫操作。

而在Proactor模式中,事件處理者(或者代由事件分離者發(fā)起)直接發(fā)起一個異步讀寫操作(相當(dāng)于請求),而實(shí)際的工作是由操作系統(tǒng)來完成的。發(fā)起時,需要提供的參數(shù)包括用于存放讀到數(shù)據(jù)的緩存區(qū),讀的數(shù)據(jù)大小,或者用于存放外發(fā)數(shù)據(jù)的緩存區(qū),以及這個請求完后的回調(diào)函數(shù)等信息。事件分離者得知了這個請求,它默默等待這個請求的完成,然后轉(zhuǎn)發(fā)完成事件給相應(yīng)的事件處理者或者回調(diào)。舉例來說,在Windows上事件處理者投遞了一個異步IO操作(稱有overlapped的技術(shù)),事件分離者等IOCompletion事件完成[1]. 這種異步模式的典型實(shí)現(xiàn)是基于操作系統(tǒng)底層異步API的,所以我們可稱之為“系統(tǒng)級別”的或者“真正意義上”的異步,因?yàn)榫唧w的讀寫是由操作系統(tǒng)代勞的。

舉另外個例子來更好地理解Reactor與Proactor兩種模式的區(qū)別。這里我們只關(guān)注read操作,因?yàn)閣rite操作也是差不多的。下面是Reactor的做法:

  • 某個事件處理者宣稱它對某個socket上的讀事件很感興趣;
  • 事件分離者等著這個事件的發(fā)生;
  • 當(dāng)事件發(fā)生了,事件分離器被喚醒,這負(fù)責(zé)通知先前那個事件處理者;
  • 事件處理者收到消息,于是去那個socket上讀數(shù)據(jù)了. 如果需要,它再次宣稱對這個socket上的讀事件感興趣,一直重復(fù)上面的步驟;

下面再來看看真正意義的異步模式Proactor是如何做的:

  • 事件處理者直接投遞發(fā)一個寫操作(當(dāng)然,操作系統(tǒng)必須支持這個異步操作). 這個時候,事件處理者根本不關(guān)心讀事件,它只管發(fā)這么個請求,它魂?duì)繅艨M的是這個寫操作的完成事件。這個處理者很拽,發(fā)個命令就不管具體的事情了,只等著別人(系統(tǒng))幫他搞定的時候給他回個話。
  • 事件分離者等著這個讀事件的完成(比較下與Reactor的不同);
  • 當(dāng)事件分離者默默等待完成事情到來的同時,操作系統(tǒng)已經(jīng)在一邊開始干活了,它從目標(biāo)讀取數(shù)據(jù),放入用戶提供的緩存區(qū)中,最后通知事件分離者,這個事情我搞完了;
  • 事件分享者通知之前的事件處理者: 你吩咐的事情搞定了;
  • 事件處理者這時會發(fā)現(xiàn)想要讀的數(shù)據(jù)已經(jīng)乖乖地放在他提供的緩存區(qū)中,想怎么處理都行了。如果有需要,事件處理者還像之前一樣發(fā)起另外一個寫操作,和上面的幾個步驟一樣。

現(xiàn)行做法

開源C++開發(fā)框架 ACE[1, 3](Douglas Schmidt, et al.開發(fā)) 提供了大量平臺獨(dú)立的底層并發(fā)支持類(線程、互斥量等). 同時在更高一層它也提供了獨(dú)立的幾組C++類,用于實(shí)現(xiàn)Reactor及Proactor模式。 盡管它們都是平臺獨(dú)立的單元,但他們都提供了不同的接口.

ACE Proactor在MS-Windows上無論是性能還在健壯性都更勝一籌,這主要是由于Windows提供了一系列高效的底層異步API. [4, 5].

(這段可能過時了點(diǎn)吧) 不幸的是,并不是所有操作系統(tǒng)都為底層異步提供健壯的支持。舉例來說, 許多Unix系統(tǒng)就有麻煩.因此, ACE Reactor可能是Unix系統(tǒng)上更合適的解決方案. 正因?yàn)橄到y(tǒng)底層的支持力度不一,為了在各系統(tǒng)上有更好的性能,開發(fā)者不得不維護(hù)獨(dú)立的好幾份代碼: 為Windows準(zhǔn)備的ACE Proactor以及為Unix系列提供的ACE Reactor.

就像我們提到過的,真正的異步模式需要操作系統(tǒng)級別的支持。由于事件處理者及操作系統(tǒng)交互的差異,為Reactor和Proactor設(shè)計(jì)一種通用統(tǒng)一的外部接口是非常困難的。這也是設(shè)計(jì)通行開發(fā)框架的難點(diǎn)所在。

更好的解決方案

在文章這一段時,我們將嘗試提供一種融合了Proactor和Reactor兩種模式的解決方案. 為了演示這個方案,我們將Reactor稍做調(diào)整,模擬成異步的Proactor模型(主要是在事件分離器里完成本該事件處理者做的實(shí)際讀寫工作,我們稱這種方法為"模擬異步")。 下面的示例可以看看read操作是如何完成的:

  • 事件處理者宣稱對讀事件感興趣,并提供了用于存儲結(jié)果的緩存區(qū)、讀數(shù)據(jù)長度等參數(shù);
  • 調(diào)試者等待(比如通過select());
  • 當(dāng)有事件到來(即可讀),調(diào)試者被喚醒, 調(diào)試者去執(zhí)行非阻塞的讀操作(前面事件處理者已經(jīng)給了足夠的信息了)。讀完后,它去通知事件處理者。
  • 事件處理者這時被知會讀操作已完成,它擁有完整的原先想要獲取的數(shù)據(jù)了.

我們看到,通過為分離者(也就上面的調(diào)試者)添加一些功能,可以讓Reactor模式轉(zhuǎn)換為Proactor模式。所有這些被執(zhí)行的操作,其實(shí)是和Reactor模型應(yīng)用時完全一致的。我們只是把工作打散分配給不同的角色去完成而已。這樣并不會有額外的開銷,也不會有性能上的的損失,我們可以再仔細(xì)看看下面的兩個過程,他們實(shí)際上完成了一樣的事情:

標(biāo)準(zhǔn)的經(jīng)典的 Reactor模式:

  • 步驟 1) 等待事件 (Reactor 的工作)
  • 步驟 2) 發(fā)"已經(jīng)可讀"事件發(fā)給事先注冊的事件處理者或者回調(diào) ( Reactor 要做的)
  • 步驟 3) 讀數(shù)據(jù) (用戶代碼要做的)
  • 步驟 4) 處理數(shù)據(jù) (用戶代碼要做的)

模擬的Proactor模式:

  • 步驟 1) 等待事件 (Proactor 的工作)
  • 步驟 2) 讀數(shù)據(jù)(看,這里變成成了讓 Proactor 做這個事情)
  • 步驟 3) 把數(shù)據(jù)已經(jīng)準(zhǔn)備好的消息給用戶處理函數(shù),即事件處理者(Proactor 要做的)
  • 步驟 4) 處理數(shù)據(jù) (用戶代碼要做的)

在沒有底層異步I/O API支持的操作系統(tǒng),這種方法可以幫我們隱藏掉socket接口的差異(無論是性能還是其它), 提供一個完全可用的統(tǒng)一"異步接口"。這樣我們就可以開發(fā)真正平臺獨(dú)立的通用接口了。

TProactor

我們提出的TProactor方案已經(jīng)由TerabitP/L [6]公司實(shí)現(xiàn)了. 它有兩種實(shí)現(xiàn): C++的和Java的.C++版本使用了ACE平臺獨(dú)立的底層元件,最終在所有操作系統(tǒng)上提供了統(tǒng)一的異步接口。

TProactor中最重要的組件要數(shù)Engine和WaitStrategy了. Engine用于維護(hù)異步操作的生命周期;而WaitStrategy用于管理并發(fā)策略. WaitStrategy和Engine一般是成對出現(xiàn)的, 兩者間提供了良好的匹配接口.

Engines和等待策略被設(shè)計(jì)成高度可組合的(完整的實(shí)現(xiàn)列表請參照附錄1)。TProactor是高度可配置的方案,通過使用異步內(nèi)核API和同步Unix API(select(), poll(), /dev/poll (Solaris 5.8+), port_get (Solaris 5.10),RealTime (RT) signals (Linux 2.4+), epoll (Linux 2.6), k-queue (FreeBSD) ),它內(nèi)部實(shí)現(xiàn)了三種引擎(POSIX AIO, SUN AIO and Emulated AIO)并隱藏了六類等待策略。TProactor實(shí)現(xiàn)了和標(biāo)準(zhǔn)的 ACE Proactor一樣的接口。這樣一來,為不同平臺提供通用統(tǒng)一的只有一份代碼的跨平臺解決方案成為可能。

Engines和WaitStrategies可以像樂高積木一樣自由地組合,開發(fā)者可以在運(yùn)行時通過配置參數(shù)來選擇合適的內(nèi)部機(jī)制(引擎和等待策略)??梢愿鶕?jù)需求設(shè)定配置,比如連接數(shù),系統(tǒng)伸縮性,以及運(yùn)行的操作系統(tǒng)等。如果系統(tǒng)支持相應(yīng)的異步底層API,開發(fā)人員可以選擇真正的異步策略,否則用戶也可以選擇使用模擬出來的異步模式。所有這一切策略上的實(shí)現(xiàn)細(xì)節(jié)都不太需要關(guān)注,我們看到的是一個可用的異步模型。

舉例來說,對于運(yùn)行在Sun Solaris上的HTTP服務(wù)器,如果需要支持大量的連接數(shù),/dev/poll或者port_get()之類的引擎是比較合適的選擇;如果需要高吞吐量,那使用基本select()的引擎會更好。由于不同選擇策略內(nèi)在算法的問題,像這樣的彈性選擇是標(biāo)準(zhǔn)ACE Reactor/Proactor模式所無法提供的(見附錄2)。

在性能方面,我們的測試顯示,模擬異步模式并未造成任何開銷,沒有變慢,反倒是性能有所提升。根據(jù)我們的測試結(jié)果,TProactor相較標(biāo)簽的ACE Reactor在Unix/Linux系統(tǒng)上有大約10-35%性能提升,而在Windows上差不多(測試了吞吐量及響應(yīng)時間)。

性能比較 (JAVA / C++ / C#).

除了C++,我們也在Java中實(shí)現(xiàn)了TProactor. JDK1.4中, Java僅提供了同步方法, 像C中的select() [7, 8]. Java TProactor基于Java的非阻塞功能(java.nio包),類似于C++的TProactor使用了select()引擎.

圖1、2顯示了以 bits/sec為單位的傳輸速度以及相應(yīng)的連接數(shù)。這些圖比較了以下三種方式實(shí)現(xiàn)的echo服務(wù)器:標(biāo)準(zhǔn)ACE Reactor實(shí)現(xiàn)(基于RedHat Linux9.0)、TProactor C++/Java實(shí)現(xiàn)(Microsoft Windows平臺及RedHat v9.0), 以及C#實(shí)現(xiàn)。測試的時候,三種服務(wù)器使用相同的客戶端瘋狂地連接,不間斷地發(fā)送固定大小的數(shù)據(jù)包。

這幾組測試是在相同的硬件上做的,在不同硬件上做的相對結(jié)果對比也是類似。

圖 1. Windows XP/P4 2.6GHz HyperThreading/512 MB RAM.
圖 2. Linux RedHat 2.4.20-smp/P4 2.6GHz HyperThreading/512 MB RAM.

用戶代碼示例

下面是TProactor Java實(shí)現(xiàn)的echo服務(wù)器代碼框架??偟膩碚f,開發(fā)者只需要實(shí)現(xiàn)兩個接口:一是OpRead,提供存放讀結(jié)果的緩存;二是OpWrite,提供存儲待寫數(shù)據(jù)的緩存區(qū)。同時,開發(fā)者需要通過回調(diào)onReadComplated()和onWriteCompleted()實(shí)現(xiàn)協(xié)議相關(guān)的業(yè)務(wù)代碼。這些回調(diào)會在合適的時候被調(diào)用.

 
class EchoServerProtocol implements AsynchHandler
{
 
  AsynchChannel achannel = null;
 
  EchoServerProtocol( Demultiplexor m,  SelectableChannel channel ) 
  throws Exception
  {
    this.achannel = new AsynchChannel( m, this, channel );
  }
 
  public void start() throws Exception
  {
    // called after construction
    System.out.println( Thread.currentThread().getName() + 
	": EchoServer protocol started" );
    achannel.read( buffer);
  }
 
  public void onReadCompleted( OpRead opRead ) throws Exception
  {
    if ( opRead.getError() != null )
    {
      // handle error, do clean-up if needed
      System.out.println( "EchoServer::readCompleted: " + 
      opRead.getError().toString());
      achannel.close();
      return;
    }
 
    if ( opRead.getBytesCompleted () <= 0)
    {
      System.out.println("EchoServer::readCompleted: Peer closed " 
	   + opRead.getBytesCompleted();
      achannel.close();
      return;
    }
 
    ByteBuffer buffer = opRead.getBuffer();
 
    achannel.write(buffer);
  }
 
  public void onWriteCompleted(OpWrite opWrite) 
  throws Exception
  {
    // logically similar to onReadCompleted
    ...
  }
}

結(jié)束語

TProactor為多個平臺提供了一個通用、彈性、可配置的高性能通訊組件,所有那些在附錄2中提到的問題都被很好地隱藏在內(nèi)部實(shí)現(xiàn)中了。

從上面的圖中我們可以看出C++仍舊是編寫高性能服務(wù)器最佳選擇,雖然Java已緊隨其后。然而因?yàn)镴ava本身實(shí)現(xiàn)上的問題,其在Windows上表現(xiàn)不佳(這已經(jīng)應(yīng)該成為歷史了吧)。

需要注意的是,以上針對Java的測試,都是以裸數(shù)據(jù)的形式測試的,未涉及到數(shù)據(jù)的處理(影響性能)。

縱觀AIO在Linux上的快速發(fā)展[9], 我們可以預(yù)計(jì)Linux內(nèi)核API將會提供大量更加強(qiáng)健的異步API, 如此一來以后基于此而實(shí)現(xiàn)的新的Engine/等待策略將能輕松地解決能用性方面的問題,并且這也能讓標(biāo)準(zhǔn)ACE Proactor接口受益。

附錄 I

TProactor中實(shí)現(xiàn)的Engines 和 等待策略

引擎類型 等待策略 操作系統(tǒng)
POSIX_AIO (true async)
aio_read()/aio_write()
aio_suspend()
Waiting for RT signal
Callback function
POSIX complained UNIX (not robust)
POSIX (not robust)
SGI IRIX, LINUX (not robust)
SUN_AIO (true async)
aio_read()/aio_write()
aio_wait() SUN (not robust)
Emulated Async
Non-blocking read()/write()
select()
poll()
/dev/poll
Linux RT signals
Kqueue
generic POSIX
Mostly all POSIX implementations
SUN
Linux
FreeBSD

附錄 II

所有同步等待策略可劃分為兩組:

  • edge-triggered (e.g. Linux實(shí)時信號) - signal readiness only when socket became ready (changes state);
  • level-triggered (e.g. select(), poll(), /dev/poll) - readiness at any time.

讓我們看看這兩組的一些普遍的邏輯問題:

  • edge-triggered group: after executing I/O operation, the demultiplexing loop can lose the state of socket readiness. Example: the "read" handler did not read whole chunk of data, so the socket remains still ready for read. But the demultiplexor loop will not receive next notification.
  • level-triggered group: when demultiplexor loop detects readiness, it starts the write/read user defined handler. But before the start, it should remove socket descriptior from theset of monitored descriptors. Otherwise, the same event can be dispatched twice.
  • Obviously, solving these problems adds extra complexities to development. All these problems were resolved internally within TProactor and the developer should not worry about those details, while in the synch approach one needs to apply extra effort to resolve them.

posted on 2012-03-06 21:04 多彩人生 閱讀(446) 評論(0)  編輯 收藏 引用


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


導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久精品国产99| 欧美色另类天堂2015| 久久久久五月天| 久久精品国产亚洲aⅴ| 欧美在线观看一区二区| 欧美中文字幕在线视频| 久久精品国产精品亚洲精品| 久久久久久伊人| 欧美日韩国产美女| 国产精品毛片在线| 韩国av一区二区三区在线观看| 伊伊综合在线| 亚洲一区二区精品| 久久精品亚洲一区| 欧美福利视频在线观看| 欧美午夜视频在线| 亚洲黄一区二区| 久久久久网址| 亚洲一区二区毛片| 欧美大片在线看免费观看| 国产精品日韩欧美综合| 日韩一级免费| 欧美国产日韩在线观看| 欧美一区二区三区在线看| 欧美日韩精品一区二区在线播放| 国产一区导航| 久久国产乱子精品免费女| 亚洲乱码一区二区| 欧美金8天国| 一区二区三区鲁丝不卡| 欧美国产亚洲另类动漫| 久久精品免费观看| 国产在线拍揄自揄视频不卡99 | 亚洲精品国产精品国自产观看浪潮 | 亚洲精品免费看| 欧美成年人网站| 久久青草久久| 久久久欧美精品| 亚洲欧洲在线视频| 亚洲精品一区二区三区不| 欧美日韩免费高清| 99热在线精品观看| 亚洲综合99| 欧美大片专区| 国产精品女人久久久久久| 国产精品麻豆va在线播放 | 亚洲电影激情视频网站| 午夜在线电影亚洲一区| 伊人久久综合| 在线视频精品一区| 亚洲日韩欧美视频| 亚洲欧美另类中文字幕| 亚洲国产成人91精品| 日韩亚洲欧美精品| 亚洲第一网站| 亚洲一区二区三区四区中文| 亚洲高清久久网| 亚洲天堂成人在线视频| 亚洲日本一区二区三区| 午夜亚洲性色视频| 一区二区三区回区在观看免费视频| 欧美有码视频| 亚洲国产专区校园欧美| 午夜影视日本亚洲欧洲精品| 亚洲小说春色综合另类电影| 免费成人高清在线视频| 久久精品99国产精品| 国产精品va在线播放我和闺蜜| 欧美成人一区二区三区在线观看| 国产精品99免费看| 亚洲国内自拍| 中文亚洲欧美| 在线欧美日韩| 麻豆乱码国产一区二区三区| 久久精品视频免费| 国产精品人成在线观看免费| 一区二区三区精品视频在线观看| 91久久综合亚洲鲁鲁五月天| 欧美成年人视频网站| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲影院色无极综合| 欧美尤物一区| 亚洲一区二区精品在线观看| 美女精品国产| 欧美高清不卡| 亚洲性视频网站| 国产精品一区一区| 欧美专区第一页| 欧美激情一区二区三区在线| 日韩午夜在线视频| 国产精品亚洲综合久久| 另类成人小视频在线| a91a精品视频在线观看| 久久久午夜视频| 亚洲视频一区在线| 激情成人综合网| 国产精品久久久久久亚洲毛片| 欧美一区2区视频在线观看 | 久久久91精品| 一区二区三区国产在线观看| 在线播放国产一区中文字幕剧情欧美 | 在线观看欧美一区| 欧美日韩国产片| 久久久最新网址| 欧美一区二区视频在线| 一本色道久久综合| 一区二区三区日韩在线观看| 美女精品国产| 久久婷婷久久| 久久国产欧美精品| 欧美在线国产精品| 性欧美videos另类喷潮| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲国产成人在线播放| 亚洲国产精品一区二区第四页av | 久久精品青青大伊人av| 欧美一区二区在线看| 久久精品视频免费| 欧美一区网站| 久久久久久久999精品视频| 久久综合九九| 欧美日韩亚洲视频一区| 国产精品一区在线观看| 国产一区二区三区四区三区四 | 国产精品久久久91| 国产精品免费看| 悠悠资源网亚洲青| 日韩视频在线免费观看| 午夜久久黄色| 欧美成人亚洲成人| 夜夜嗨av一区二区三区四区| 一本综合久久| 久久综合网hezyo| 欧美性猛交xxxx乱大交蜜桃| 欧美三级午夜理伦三级中文幕| 一区二区三区成人| 欧美大胆a视频| 99精品视频一区| 午夜精品福利一区二区蜜股av| 亚洲日本va午夜在线影院| 久久国产毛片| 一本色道久久综合亚洲精品婷婷| 91久久久亚洲精品| 亚洲欧洲在线一区| 久久精品综合网| 欧美午夜性色大片在线观看| 亚洲激情视频在线播放| 亚洲欧美日韩国产成人精品影院| 欧美好骚综合网| 欧美风情在线| 日韩午夜在线观看视频| 美女国产一区| 久久中文字幕一区二区三区| 国产中文一区| 久久激情五月激情| 欧美一区二区视频在线| 男同欧美伦乱| 欧美一区三区三区高中清蜜桃| 亚洲免费激情| 欧美激情一区二区三区在线视频观看| 久久精品中文字幕一区二区三区| 欧美日韩国产在线| 一区二区三区www| 亚洲欧美日韩成人| 韩国av一区二区三区四区| 午夜国产欧美理论在线播放| 国产欧美在线观看| 亚洲高清视频在线| 欧美v日韩v国产v| 一区二区三区国产盗摄| 久久精品国产亚洲精品| 亚洲电影免费观看高清完整版在线| 亚洲国产精品嫩草影院| 欧美色精品天天在线观看视频| 午夜电影亚洲| 久久久久久久欧美精品| 欧美日韩成人网| 久久国产精品一区二区三区四区| 久久婷婷综合激情| 一本大道av伊人久久综合| 国产精品亚洲一区| 欧美激情国产日韩| 香蕉久久精品日日躁夜夜躁| 亚洲国产欧美国产综合一区| 亚洲一区二区在线免费观看| 韩国欧美一区| 欧美性感一类影片在线播放| 麻豆国产精品777777在线| 宅男精品视频| 亚洲黄色av一区| 性色一区二区| 欧美日本在线看| 久久精品国产99国产精品| 久久精品99国产精品日本| 国产精品伦理| 亚洲久久一区二区| 一本色道久久综合亚洲91| 欧美精品福利在线| 亚洲美女在线看| 午夜精品av|