日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

深入分析 Java I/O 的工作机制

發(fā)布時(shí)間:2025/4/16 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入分析 Java I/O 的工作机制 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

深入分析 Java I/O 的工作機(jī)制

I/O 問題是任何編程語(yǔ)言都無(wú)法回避的問題,可以說 I/O 問題是整個(gè)人機(jī)交互的核心問題,因?yàn)?I/O 是機(jī)器獲取和交換信息的主要渠道。在當(dāng)今這個(gè)數(shù)據(jù)大爆炸時(shí)代,I/O 問題尤其突出,很容易成為一個(gè)性能瓶頸。正因如此,所以 Java 在 I/O 上也一直在做持續(xù)的優(yōu)化,如從 1.4 開始引入了 NIO,提升了 I/O 的性能。關(guān)于 NIO 我們將在后面詳細(xì)介紹。

Java 的 I/O 操作類在包 java.io 下,大概有將近 80 個(gè)類,但是這些類大概可以分成四組,分別是:

  • 基于字節(jié)操作的 I/O 接口:InputStream 和 OutputStream
  • 基于字符操作的 I/O 接口:Writer 和 Reader
  • 基于磁盤操作的 I/O 接口:File
  • 基于網(wǎng)絡(luò)操作的 I/O 接口:Socket
  • 前兩組主要是根據(jù)傳輸數(shù)據(jù)的數(shù)據(jù)格式,后兩組主要是根據(jù)傳輸數(shù)據(jù)的方式,雖然 Socket 類并不在 java.io 包下,但是我仍然把它們劃分在一起,因?yàn)槲覀€(gè)人認(rèn)為 I/O 的核心問題要么是數(shù)據(jù)格式影響 I/O 操作,要么是傳輸方式影響 I/O 操作,也就是將什么樣的數(shù)據(jù)寫到什么地方的問題,I/O 只是人與機(jī)器或者機(jī)器與機(jī)器交互的手段,除了在它們能夠完成這個(gè)交互功能外,我們關(guān)注的就是如何提高它的運(yùn)行效率了,而數(shù)據(jù)格式和傳輸方式是影響效率最關(guān) 鍵的因素了。我們后面的分析也是基于這兩個(gè)因素來(lái)展開的。

    基于字節(jié)的 I/O 操作接口

    基于字節(jié)的 I/O 操作接口輸入和輸出分別是:InputStream 和 OutputStream,InputStream 輸入流的類繼承層次如下圖所示:


    圖 1. InputStream 相關(guān)類層次結(jié)構(gòu)

    InputStreamReader 類是字節(jié)到字符的轉(zhuǎn)化橋梁,InputStream 到 Reader 的過程要指定編碼字符集,否則將采用操作系統(tǒng)默認(rèn)字符集,很可能會(huì)出現(xiàn)亂碼問題。StreamDecoder 正是完成字節(jié)到字符的解碼的實(shí)現(xiàn)類。也就是當(dāng)你用如下方式讀取一個(gè)文件時(shí):

    圖 2. OutputStream 相關(guān)類層次結(jié)構(gòu)


    這里就不詳細(xì)解釋每個(gè)子類如何使用了,如果不清楚的話可以參考一下 JDK 的 API 說明文檔,這里只想說明兩點(diǎn),一個(gè)是操作數(shù)據(jù)的方式是可以組合使用的,如這樣組合使用

    OutputStream out = new BufferedOutputStream(new ObjectOutputStream(new FileOutputStream("fileName"));

    還有一點(diǎn)是流最終寫到什么地方必須要指定,要么是寫到磁盤要么是寫到網(wǎng)絡(luò)中,其實(shí)從上面的類圖中我們發(fā)現(xiàn),寫網(wǎng)絡(luò)實(shí)際上也是寫文件,只不過 寫網(wǎng)絡(luò)還有一步需要處理就是底層操作系統(tǒng)再將數(shù)據(jù)傳送到其它地方而不是本地磁盤。關(guān)于網(wǎng)絡(luò) I/O 和磁盤 I/O 我們將在后面詳細(xì)介紹。

    基于字符的 I/O 操作接口

    不管是磁盤還是網(wǎng)絡(luò)傳輸,最小的存儲(chǔ)單元都是字節(jié),而不是字符,所以 I/O 操作的都是字節(jié)而不是字符,但是為啥有操作字符的 I/O 接口呢?這是因?yàn)槲覀兊某绦蛑型ǔ2僮鞯臄?shù)據(jù)都是以字符形式,為了操作方便當(dāng)然要提供一個(gè)直接寫字符的 I/O 接口,如此而已。我們知道字符到字節(jié)必須要經(jīng)過編碼轉(zhuǎn)換,而這個(gè)編碼又非常耗時(shí),而且還會(huì)經(jīng)常出現(xiàn)亂碼問題,所以 I/O 的編碼問題經(jīng)常是讓人頭疼的問題。關(guān)于 I/O 編碼問題請(qǐng)參考另一篇文章 《深入分析Java中的中文編碼問題》。

    下圖是寫字符的 I/O 操作接口涉及到的類,Writer 類提供了一個(gè)抽象方法 write(char cbuf[], int off, int len) 由子類去實(shí)現(xiàn)。


    圖 3. Writer 相關(guān)類層次結(jié)構(gòu)

    讀字符的操作接口也有類似的類結(jié)構(gòu),如下圖所示:

    圖 4.Reader 類層次結(jié)構(gòu)


    讀字符的操作接口中也是 int read(char cbuf[], int off, int len),返回讀到的 n 個(gè)字節(jié)數(shù),不管是 Writer 還是 Reader 類它們都只定義了讀取或?qū)懭氲臄?shù)據(jù)字符的方式,也就是怎么寫或讀,但是并沒有規(guī)定數(shù)據(jù)要寫到哪去,寫到哪去就是我們后面要討論的基于磁盤和網(wǎng)絡(luò)的工作機(jī) 制。

    字節(jié)與字符的轉(zhuǎn)化接口

    另外數(shù)據(jù)持久化或網(wǎng)絡(luò)傳輸都是以字節(jié)進(jìn)行的,所以必須要有字符到字節(jié)或字節(jié)到字符的轉(zhuǎn)化。字符到字節(jié)需要轉(zhuǎn)化,其中讀的轉(zhuǎn)化過程如下圖所示:


    圖 5. 字符解碼相關(guān)類結(jié)構(gòu)

    InputStreamReader 類是字節(jié)到字符的轉(zhuǎn)化橋梁,InputStream 到 Reader 的過程要指定編碼字符集,否則將采用操作系統(tǒng)默認(rèn)字符集,很可能會(huì)出現(xiàn)亂碼問題。StreamDecoder 正是完成字節(jié)到字符的解碼的實(shí)現(xiàn)類。也就是當(dāng)你用如下方式讀取一個(gè)文件時(shí):



    清單 1.讀取文件



    try { StringBuffer str = new StringBuffer(); char[] buf = new char[1024]; FileReader f = new FileReader("file"); while(f.read(buf)>0){ str.append(buf); } str.toString(); } catch (IOException e) {}

    圖 6. 字符編碼相關(guān)類結(jié)構(gòu)

    通過 OutputStreamWriter 類完成,字符到字節(jié)的編碼過程,由 StreamEncoder 完成編碼過程。

    磁盤 I/O 工作機(jī)制

    前面介紹了基本的 Java I/O 的操作接口,這些接口主要定義了如何操作數(shù)據(jù),以及介紹了操作兩種數(shù)據(jù)結(jié)構(gòu):字節(jié)和字符的方式。還有一個(gè)關(guān)鍵問題就是數(shù)據(jù)寫到何處,其中一個(gè)主要方式就是將數(shù)據(jù)持久化到物理磁盤,下面將介紹如何將數(shù)據(jù)持久化到物理磁盤的過程。

    我 們知道數(shù)據(jù)在磁盤的唯一最小描述就是文件,也就是說上層應(yīng)用程序只能通過文件來(lái)操作磁盤上的數(shù)據(jù),文件也是操作系統(tǒng)和磁盤驅(qū)動(dòng)器交互的一 個(gè)最小單元。值得注意的是 Java 中通常的 File 并不代表一個(gè)真實(shí)存在的文件對(duì)象,當(dāng)你通過指定一個(gè)路徑描述符時(shí),它就會(huì)返回一個(gè)代表這個(gè)路徑相關(guān)聯(lián)的一個(gè)虛擬對(duì)象,這個(gè)可能是一個(gè)真實(shí)存在的文件或者是 一個(gè)包含多個(gè)文件的目錄。為何要這樣設(shè)計(jì)?因?yàn)榇蟛糠智闆r下,我們并不關(guān)心這個(gè)文件是否真的存在,而是關(guān)心這個(gè)文件到底如何操作。例如我們手機(jī)里通常存了 幾百個(gè)朋友的電話號(hào)碼,但是我們通常關(guān)心的是我有沒有這個(gè)朋友的電話號(hào)碼,或者這個(gè)電話號(hào)碼是什么,但是這個(gè)電話號(hào)碼到底能不能打通,我們并不是時(shí)時(shí)刻刻 都去檢查,而只有在真正要給他打電話時(shí)才會(huì)看這個(gè)電話能不能用。也就是使用這個(gè)電話記錄要比打這個(gè)電話的次數(shù)多很多。

    何時(shí)真 正會(huì)要檢 查一個(gè)文件存不存?就是在真正要讀取這個(gè)文件時(shí),例如 FileInputStream 類都是操作一個(gè)文件的接口,注意到在創(chuàng)建一個(gè) FileInputStream 對(duì)象時(shí),會(huì)創(chuàng)建一個(gè) FileDescriptor 對(duì)象,其實(shí)這個(gè)對(duì)象就是真正代表一個(gè)存在的文件對(duì)象的描述,當(dāng)我們?cè)诓僮饕粋€(gè)文件對(duì)象時(shí)可以通過 getFD() 方法獲取真正操作的與底層操作系統(tǒng)關(guān)聯(lián)的文件描述。例如可以調(diào)用 FileDescriptor.sync() 方法將操作系統(tǒng)緩存中的數(shù)據(jù)強(qiáng)制刷新到物理磁盤中。

    下面以清單 1 的程序?yàn)槔?#xff0c;介紹下如何從磁盤讀取一段文本字符。如下圖所示:

    圖 7. 從磁盤讀取文件

    當(dāng)傳入一個(gè)文件路徑,將會(huì)根據(jù)這個(gè)路徑創(chuàng)建一個(gè) File 對(duì)象來(lái)標(biāo)識(shí)這個(gè)文件,然后將會(huì)根據(jù)這個(gè) File 對(duì)象創(chuàng)建真正讀取文件的操作對(duì)象,這時(shí)將會(huì)真正創(chuàng)建一個(gè)關(guān)聯(lián)真實(shí)存在的磁盤文件的文件描述符 FileDescriptor,通過這個(gè)對(duì)象可以直接控制這個(gè)磁盤文件。由于我們需要讀取的是字符格式,所以需要 StreamDecoder 類將 byte 解碼為 char 格式,至于如何從磁盤驅(qū)動(dòng)器上讀取一段數(shù)據(jù),由操作系統(tǒng)幫我們完成。至于操作系統(tǒng)是如何將數(shù)據(jù)持久化到磁盤以及如何建立數(shù)據(jù)結(jié)構(gòu)需要根據(jù)當(dāng)前操作系統(tǒng)使用 何種文件系統(tǒng)來(lái)回答,至于文件系統(tǒng)的相關(guān)細(xì)節(jié)可以參考另外的文章。

    Java Socket 的工作機(jī)制

    Socket 這個(gè)概念沒有對(duì)應(yīng)到一個(gè)具體的實(shí)體,它是描述計(jì)算機(jī)之間完成相互通信一種抽象功能。打個(gè)比方,可以把 Socket 比作為兩個(gè)城市之間的交通工具,有了它,就可以在城市之間來(lái)回穿梭了。交通工具有多種,每種交通工具也有相應(yīng)的交通規(guī)則。Socket 也一樣,也有多種。大部分情況下我們使用的都是基于 TCP/IP 的流套接字,它是一種穩(wěn)定的通信協(xié)議。

    下圖是典型的基于 Socket 的通信的場(chǎng)景:

    圖 8.Socket 通信示例

    主機(jī) A 的應(yīng)用程序要能和主機(jī) B 的應(yīng)用程序通信,必須通過 Socket 建立連接,而建立 Socket 連接必須需要底層 TCP/IP 協(xié)議來(lái)建立 TCP 連接。建立 TCP 連接需要底層 IP 協(xié)議來(lái)尋址網(wǎng)絡(luò)中的主機(jī)。我們知道網(wǎng)絡(luò)層使用的 IP 協(xié)議可以幫助我們根據(jù) IP 地址來(lái)找到目標(biāo)主機(jī),但是一臺(tái)主機(jī)上可能運(yùn)行著多個(gè)應(yīng)用程序,如何才能與指定的應(yīng)用程序通信就要通過 TCP 或 UPD 的地址也就是端口號(hào)來(lái)指定。這樣就可以通過一個(gè) Socket 實(shí)例唯一代表一個(gè)主機(jī)上的一個(gè)應(yīng)用程序的通信鏈路了。

    建立通信鏈路

    當(dāng)客戶端要與服務(wù)端通信,客戶端首先要?jiǎng)?chuàng)建一個(gè) Socket 實(shí)例,操作系統(tǒng)將為這個(gè) Socket 實(shí)例分配一個(gè)沒有被使用的本地端口號(hào),并創(chuàng)建一個(gè)包含本地和遠(yuǎn)程地址和端口號(hào)的套接字?jǐn)?shù)據(jù)結(jié)構(gòu),這個(gè)數(shù)據(jù)結(jié)構(gòu)將一直保存在系統(tǒng)中直到這個(gè)連接關(guān)閉。在創(chuàng)建 Socket 實(shí)例的構(gòu)造函數(shù)正確返回之前,將要進(jìn)行 TCP 的三次握手協(xié)議,TCP 握手協(xié)議完成后,Socket 實(shí)例對(duì)象將創(chuàng)建完成,否則將拋出 IOException 錯(cuò)誤。

    與之對(duì)應(yīng)的服務(wù)端將創(chuàng)建一個(gè) ServerSocket 實(shí)例,ServerSocket 創(chuàng)建比較簡(jiǎn)單只要指定的端口號(hào)沒有被占用,一般實(shí)例創(chuàng)建都會(huì)成功,同時(shí)操作系統(tǒng)也會(huì)為 ServerSocket 實(shí)例創(chuàng)建一個(gè)底層數(shù)據(jù)結(jié)構(gòu),這個(gè)數(shù)據(jù)結(jié)構(gòu)中包含指定監(jiān)聽的端口號(hào)和包含監(jiān)聽地址的通配符,通常情況下都是“*”即監(jiān)聽所有地址。之后當(dāng)調(diào)用 accept() 方法時(shí),將進(jìn)入阻塞狀態(tài),等待客戶端的請(qǐng)求。當(dāng)一個(gè)新的請(qǐng)求到來(lái)時(shí),將為這個(gè)連接創(chuàng)建一個(gè)新的套接字?jǐn)?shù)據(jù)結(jié)構(gòu),該套接字?jǐn)?shù)據(jù)的信息包含的地址和端口信息正 是請(qǐng)求源地址和端口。這個(gè)新創(chuàng)建的數(shù)據(jù)結(jié)構(gòu)將會(huì)關(guān)聯(lián)到 ServerSocket 實(shí)例的一個(gè)未完成的連接數(shù)據(jù)結(jié)構(gòu)列表中,注意這時(shí)服務(wù)端與之對(duì)應(yīng)的 Socket 實(shí)例并沒有完成創(chuàng)建,而要等到與客戶端的三次握手完成后,這個(gè)服務(wù)端的 Socket 實(shí)例才會(huì)返回,并將這個(gè) Socket 實(shí)例對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)從未完成列表中移到已完成列表中。所以 ServerSocket 所關(guān)聯(lián)的列表中每個(gè)數(shù)據(jù)結(jié)構(gòu),都代表與一個(gè)客戶端的建立的 TCP 連接。

    數(shù)據(jù)傳輸

    傳輸數(shù)據(jù)是我們建立連接的主要目的,如何通過 Socket 傳輸數(shù)據(jù),下面將詳細(xì)介紹。

    當(dāng)連接已經(jīng)建立成功,服務(wù)端和客戶端都會(huì)擁有一個(gè) Socket 實(shí)例,每個(gè) Socket 實(shí)例都有一個(gè) InputStream 和 OutputStream,正是通過這兩個(gè)對(duì)象來(lái)交換數(shù)據(jù)。同時(shí)我們也知道網(wǎng)絡(luò) I/O 都是以字節(jié)流傳輸?shù)?。?dāng) Socket 對(duì)象創(chuàng)建時(shí),操作系統(tǒng)將會(huì)為 InputStream 和 OutputStream 分別分配一定大小的緩沖區(qū),數(shù)據(jù)的寫入和讀取都是通過這個(gè)緩存區(qū)完成的。寫入端將數(shù)據(jù)寫到 OutputStream 對(duì)應(yīng)的 SendQ 隊(duì)列中,當(dāng)隊(duì)列填滿時(shí),數(shù)據(jù)將被發(fā)送到另一端 InputStream 的 RecvQ 隊(duì)列中,如果這時(shí) RecvQ 已經(jīng)滿了,那么 OutputStream 的 write 方法將會(huì)阻塞直到 RecvQ 隊(duì)列有足夠的空間容納 SendQ 發(fā)送的數(shù)據(jù)。值得特別注意的是,這個(gè)緩存區(qū)的大小以及寫入端的速度和讀取端的速度非常影響這個(gè)連接的數(shù)據(jù)傳輸效率,由于可能會(huì)發(fā)生阻塞,所以網(wǎng)絡(luò) I/O 與磁盤 I/O 在數(shù)據(jù)的寫入和讀取還要有一個(gè)協(xié)調(diào)的過程,如果兩邊同時(shí)傳送數(shù)據(jù)時(shí)可能會(huì)產(chǎn)生死鎖,在后面 NIO 部分將介紹避免這種情況。

    NIO 的工作方式

    BIO 帶來(lái)的挑戰(zhàn)

    BIO 即阻塞 I/O,不管是磁盤 I/O 還是網(wǎng)絡(luò) I/O,數(shù)據(jù)在寫入 OutputStream 或者從 InputStream 讀取時(shí)都有可能會(huì)阻塞。一旦有線程阻塞將會(huì)失去 CPU 的使用權(quán),這在當(dāng)前的大規(guī)模訪問量和有性能要求情況下是不能接受的。雖然當(dāng)前的網(wǎng)絡(luò) I/O 有一些解決辦法,如一個(gè)客戶端一個(gè)處理線程,出現(xiàn)阻塞時(shí)只是一個(gè)線程阻塞而不會(huì)影響其它線程工作,還有為了減少系統(tǒng)線程的開銷,采用線程池的辦法來(lái)減少線 程創(chuàng)建和回收的成本,但是有一些使用場(chǎng)景仍然是無(wú)法解決的。如當(dāng)前一些需要大量 HTTP 長(zhǎng)連接的情況,像淘寶現(xiàn)在使用的 Web 旺旺項(xiàng)目,服務(wù)端需要同時(shí)保持幾百萬(wàn)的 HTTP 連接,但是并不是每時(shí)每刻這些連接都在傳輸數(shù)據(jù),這種情況下不可能同時(shí)創(chuàng)建這么多線程來(lái)保持連接。即使線程的數(shù)量不是問題,仍然有一些問題還是無(wú)法避免 的。如這種情況,我們想給某些客戶端更高的服務(wù)優(yōu)先級(jí),很難通過設(shè)計(jì)線程的優(yōu)先級(jí)來(lái)完成,另外一種情況是,我們需要讓每個(gè)客戶端的請(qǐng)求在服務(wù)端可能需要訪 問一些競(jìng)爭(zhēng)資源,由于這些客戶端是在不同線程中,因此需要同步,而往往要實(shí)現(xiàn)這些同步操作要遠(yuǎn)遠(yuǎn)比用單線程復(fù)雜很多。以上這些情況都說明,我們需要另外一 種新的 I/O 操作方式。

    NIO 的工作機(jī)制

    我們先看一下 NIO 涉及到的關(guān)聯(lián)類圖,如下:

    圖 9.NIO 相關(guān)類圖

    上圖中有兩個(gè)關(guān)鍵類:Channel 和 Selector,它們是 NIO 中兩個(gè)核心概念。我們還用前面的城市交通工具來(lái)繼續(xù)比喻 NIO 的工作方式,這里的 Channel 要比 Socket 更加具體,它可以比作為某種具體的交通工具,如汽車或是高鐵等,而 Selector 可以比作為一個(gè)車站的車輛運(yùn)行調(diào)度系統(tǒng),它將負(fù)責(zé)監(jiān)控每輛車的當(dāng)前運(yùn)行狀態(tài):是已經(jīng)出戰(zhàn)還是在路上等等,也就是它可以輪詢每個(gè) Channel 的狀態(tài)。這里還有一個(gè) Buffer 類,它也比 Stream 更加具體化,我們可以將它比作為車上的座位,Channel 是汽車的話就是汽車上的座位,高鐵上就是高鐵上的座位,它始終是一個(gè)具體的概念,與 Stream 不同。Stream 只能代表是一個(gè)座位,至于是什么座位由你自己去想象,也就是你在去上車之前并不知道,這個(gè)車上是否還有沒有座位了,也不知道上的是什么車,因?yàn)槟悴⒉荒苓x 擇,這些信息都已經(jīng)被封裝在了運(yùn)輸工具(Socket)里面了,對(duì)你是透明的。NIO 引入了 Channel、Buffer 和 Selector 就是想把這些信息具體化,讓程序員有機(jī)會(huì)控制它們,如:當(dāng)我們調(diào)用 write() 往 SendQ 寫數(shù)據(jù)時(shí),當(dāng)一次寫的數(shù)據(jù)超過 SendQ 長(zhǎng)度是需要按照 SendQ 的長(zhǎng)度進(jìn)行分割,這個(gè)過程中需要有將用戶空間數(shù)據(jù)和內(nèi)核地址空間進(jìn)行切換,而這個(gè)切換不是你可以控制的。而在 Buffer 中我們可以控制 Buffer 的 capacity,并且是否擴(kuò)容以及如何擴(kuò)容都可以控制。

    理解了這些概念后我們看一下,實(shí)際上它們是如何工作的,下面是典型的一段 NIO 代碼:

    清單 2. NIO 工作代碼示例

    public void selector() throws IOException { ByteBuffer buffer = ByteBuffer.allocate(1024); Selector selector = Selector.open(); ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.configureBlocking(false);//設(shè)置為非阻塞方式 ssc.socket().bind(new InetSocketAddress(8080)); ssc.register(selector, SelectionKey.OP_ACCEPT);//注冊(cè)監(jiān)聽的事件 while (true) { Set selectedKeys = selector.selectedKeys();//取得所有key集合 Iterator it = selectedKeys.iterator(); while (it.hasNext()) { SelectionKey key = (SelectionKey) it.next(); if ((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) { ServerSocketChannel ssChannel = (ServerSocketChannel) key.channel(); SocketChannel sc = ssChannel.accept();//接受到服務(wù)端的請(qǐng)求 sc.configureBlocking(false); sc.register(selector, SelectionKey.OP_READ); it.remove(); } else if ((key.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) { SocketChannel sc = (SocketChannel) key.channel(); while (true) { buffer.clear(); int n = sc.read(buffer);//讀取數(shù)據(jù) if (n <= 0) { break; } buffer.flip(); } it.remove(); } } } }

    調(diào)用 Selector 的靜態(tài)工廠創(chuàng)建一個(gè)選擇器,創(chuàng)建一個(gè)服務(wù)端的 Channel 綁定到一個(gè) Socket 對(duì)象,并把這個(gè)通信信道注冊(cè)到選擇器上,把這個(gè)通信信道設(shè)置為非阻塞模式。然后就可以調(diào)用 Selector 的 selectedKeys 方法來(lái)檢查已經(jīng)注冊(cè)在這個(gè)選擇器上的所有通信信道是否有需要的事件發(fā)生,如果有某個(gè)事件發(fā)生時(shí),將會(huì)返回所有的 SelectionKey,通過這個(gè)對(duì)象 Channel 方法就可以取得這個(gè)通信信道對(duì)象從而可以讀取通信的數(shù)據(jù),而這里讀取的數(shù)據(jù)是 Buffer,這個(gè) Buffer 是我們可以控制的緩沖器。

    在上面的這段程序中,是將 Server 端的監(jiān)聽連接請(qǐng)求的事件和處理請(qǐng)求的事件放在一個(gè)線程中,但是在實(shí)際應(yīng)用中,我們通常會(huì)把它們放在兩個(gè)線程中,一個(gè)線程專門負(fù)責(zé)監(jiān)聽客戶端的連接請(qǐng)求,而 且是阻塞方式執(zhí)行的;另外一個(gè)線程專門來(lái)處理請(qǐng)求,這個(gè)專門處理請(qǐng)求的線程才會(huì)真正采用 NIO 的方式,像 Web 服務(wù)器 Tomcat 和 Jetty 都是這個(gè)處理方式,關(guān)于 Tomcat 和 Jetty 的 NIO 處理方式可以參考文章《 Jetty 的工作原理和與 Tomcat 的比較》。

    下圖是描述了基于 NIO 工作方式的 Socket 請(qǐng)求的處理過程:


    圖 10. 基于 NIO 的 Socket 請(qǐng)求的處理過程


    上圖中的 Selector 可以同時(shí)監(jiān)聽一組通信信道(Channel)上的 I/O 狀態(tài),前提是這個(gè) Selector 要已經(jīng)注冊(cè)到這些通信信道中。選擇器 Selector 可以調(diào)用 select() 方法檢查已經(jīng)注冊(cè)的通信信道上的是否有 I/O 已經(jīng)準(zhǔn)備好,如果沒有至少一個(gè)信道 I/O 狀態(tài)有變化,那么 select 方法會(huì)阻塞等待或在超時(shí)時(shí)間后會(huì)返回 0。上圖中如果有多個(gè)信道有數(shù)據(jù),那么將會(huì)將這些數(shù)據(jù)分配到對(duì)應(yīng)的數(shù)據(jù) Buffer 中。所以關(guān)鍵的地方是有一個(gè)線程來(lái)處理所有連接的數(shù)據(jù)交互,每個(gè)連接的數(shù)據(jù)交互都不是阻塞方式,所以可以同時(shí)處理大量的連接請(qǐng)求。

    Buffer 的工作方式

    上面介紹了 Selector 將檢測(cè)到有通信信道 I/O 有數(shù)據(jù)傳輸時(shí),通過 selelct() 取得 SocketChannel,將數(shù)據(jù)讀取或?qū)懭?Buffer 緩沖區(qū)。下面討論一下 Buffer 如何接受和寫出數(shù)據(jù)?

    Buffer 可以簡(jiǎn)單的理解為一組基本數(shù)據(jù)類型的元素列表,它通過幾個(gè)變量來(lái)保存這個(gè)數(shù)據(jù)的當(dāng)前位置狀態(tài),也就是有四個(gè)索引。如下表所示:


    表 1.Buffer 中的參數(shù)項(xiàng)
    索引說明
    capacity緩沖區(qū)數(shù)組的總長(zhǎng)度
    position下一個(gè)要操作的數(shù)據(jù)元素的位置
    limit緩沖區(qū)數(shù)組中不可操作的下一個(gè)元素的位置,limit<=capacity
    mark用于記錄當(dāng)前 position 的前一個(gè)位置或者默認(rèn)是 0

    在實(shí)際操作數(shù)據(jù)時(shí)它們有如下關(guān)系圖:

    我們通過 ByteBuffer.allocate(11) 方法創(chuàng)建一個(gè) 11 個(gè) byte 的數(shù)組緩沖區(qū),初始狀態(tài)如上圖所示,position 的位置為 0,capacity 和 limit 默認(rèn)都是數(shù)組長(zhǎng)度。當(dāng)我們寫入 5 個(gè)字節(jié)時(shí)位置變化如下圖所示:
    這時(shí)我們需要將緩沖區(qū)的 5 個(gè)字節(jié)數(shù)據(jù)寫入 Channel 通信信道,所以我們需要調(diào)用 byteBuffer.flip() 方法,數(shù)組的狀態(tài)又發(fā)生如下變化:

    這時(shí)底層操作系統(tǒng)就可以從緩沖區(qū)中正確讀取這 5 個(gè)字節(jié)數(shù)據(jù)發(fā)送出去了。在下一次寫數(shù)據(jù)之前我們?cè)谡{(diào)一下 clear() 方法。緩沖區(qū)的索引狀態(tài)又回到初始位置。

    這里還要說明一下 mark,當(dāng)我們調(diào)用 mark() 時(shí),它將記錄當(dāng)前 position 的前一個(gè)位置,當(dāng)我們調(diào)用 reset 時(shí),position 將恢復(fù) mark 記錄下來(lái)的值。

    還有一點(diǎn)需要說明,通過 Channel 獲取的 I/O 數(shù)據(jù)首先要經(jīng)過操作系統(tǒng)的 Socket 緩沖區(qū)再將數(shù)據(jù)復(fù)制到 Buffer 中,這個(gè)的操作系統(tǒng)緩沖區(qū)就是底層的 TCP 協(xié)議關(guān)聯(lián)的 RecvQ 或者 SendQ 隊(duì)列,從操作系統(tǒng)緩沖區(qū)到用戶緩沖區(qū)復(fù)制數(shù)據(jù)比較耗性能,Buffer 提供了另外一種直接操作操作系統(tǒng)緩沖區(qū)的的方式即 ByteBuffer.allocateDirector(size),這個(gè)方法返回的 byteBuffer 就是與底層存儲(chǔ)空間關(guān)聯(lián)的緩沖區(qū),它的操作方式與 linux2.4 內(nèi)核的 sendfile 操作方式類似。


    I/O 調(diào)優(yōu)

    下面就磁盤 I/O 和網(wǎng)絡(luò) I/O 的一些常用的優(yōu)化技巧進(jìn)行總結(jié)如下:

    磁盤 I/O 優(yōu)化

    性能檢測(cè)

    我們的應(yīng)用程序通常都需要訪問磁盤讀取數(shù)據(jù),而磁盤 I/O 通常都很耗時(shí),我們要判斷 I/O 是否是一個(gè)瓶頸,我們有一些參數(shù)指標(biāo)可以參考:

    如我們可以壓力測(cè)試應(yīng)用程序看系統(tǒng)的 I/O wait 指標(biāo)是否正常,例如測(cè)試機(jī)器有 4 個(gè) CPU,那么理想的 I/O wait 參數(shù)不應(yīng)該超過 25%,如果超過 25% 的話,I/O 很可能成為應(yīng)用程序的性能瓶頸。Linux 操作系統(tǒng)下可以通過 iostat 命令查看。

    通常我們?cè)谂袛?I/O 性能時(shí)還會(huì)看另外一個(gè)參數(shù)就是 IOPS,我們應(yīng)用程序需要最低的 IOPS 是多少,而我們的磁盤的 IOPS 能不能達(dá)到我們的要求。每個(gè)磁盤的 IOPS 通常是在一個(gè)范圍內(nèi),這和存儲(chǔ)在磁盤的數(shù)據(jù)塊的大小和訪問方式也有關(guān)。但是主要是由磁盤的轉(zhuǎn)速?zèng)Q定的,磁盤的轉(zhuǎn)速越高磁盤的 IOPS 也越高。

    現(xiàn)在為了提高磁盤 I/O 的性能,通常采用一種叫 RAID 的技術(shù),就是將不同的磁盤組合起來(lái)來(lái)提高 I/O 性能,目前有多種 RAID 技術(shù),每種 RAID 技術(shù)對(duì) I/O 性能提升會(huì)有不同,可以用一個(gè) RAID 因子來(lái)代表,磁盤的讀寫吞吐量可以通過 iostat 命令來(lái)獲取,于是我們可以計(jì)算出一個(gè)理論的 IOPS 值,計(jì)算公式如下所以:

    ( 磁盤數(shù) * 每塊磁盤的 IOPS)/( 磁盤讀的吞吐量 +RAID 因子 * 磁盤寫的吞吐量 )=IOPS

    這個(gè)公式的詳細(xì)信息請(qǐng)查閱參考資料 Understanding Disk I/O。

    提升 I/O 性能

    提升磁盤 I/O 性能通常的方法有:

  • 增加緩存,減少磁盤訪問次數(shù)
  • 優(yōu)化磁盤的管理系統(tǒng),設(shè)計(jì)最優(yōu)的磁盤訪問策略,以及磁盤的尋址策略,這里是在底層操作系統(tǒng)層面考慮的。
  • 設(shè)計(jì)合理的磁盤存儲(chǔ)數(shù)據(jù)塊,以及訪問這些數(shù)據(jù)塊的策略,這里是在應(yīng)用層面考慮的。如我們可以給存放的數(shù)據(jù)設(shè)計(jì)索引,通過尋址索引來(lái)加快和減少磁盤的訪問,還有可以采用異步和非阻塞的方式加快磁盤的訪問效率。
  • 應(yīng)用合理的 RAID 策略提升磁盤 IO,每種 RAID 的區(qū)別我們可以用下表所示:

  • 表 2.RAID 策略
    磁盤陣列說明
    RAID 0數(shù)據(jù)被平均寫到多個(gè)磁盤陣列中,寫數(shù)據(jù)和讀數(shù)據(jù)都是并行的,所以磁盤的 IOPS 可以提高一倍。
    RAID 1RAID 1 的主要作用是能夠提高數(shù)據(jù)的安全性,它將一份數(shù)據(jù)分別復(fù)制到多個(gè)磁盤陣列中。并不能提升 IOPS 但是相同的數(shù)據(jù)有多個(gè)備份。通常用于對(duì)數(shù)據(jù)安全性較高的場(chǎng)合中。
    RAID 5這中設(shè)計(jì)方式是前兩種的折中方式,它將數(shù)據(jù)平均寫到所有磁盤陣列總數(shù)減一的磁盤中,往另外一個(gè)磁盤中寫入這份數(shù)據(jù)的奇偶校驗(yàn)信息。如果其中一個(gè)磁盤損壞,可以通過其它磁盤的數(shù)據(jù)和這個(gè)數(shù)據(jù)的奇偶校驗(yàn)信息來(lái)恢復(fù)這份數(shù)據(jù)。
    RAID 0+1如名字一樣,就是根據(jù)數(shù)據(jù)的備份情況進(jìn)行分組,一份數(shù)據(jù)同時(shí)寫到多個(gè)備份磁盤分組中,同時(shí)多個(gè)分組也會(huì)并行讀寫。

    網(wǎng)絡(luò) I/O 優(yōu)化

    網(wǎng)絡(luò) I/O 優(yōu)化通常有一些基本處理原則:

  • 一個(gè)是減少網(wǎng)絡(luò)交互的次數(shù):要減少網(wǎng)絡(luò)交互的次數(shù)通常我們?cè)谛枰W(wǎng)絡(luò)交互的兩端會(huì)設(shè)置緩存,比如 Oracle 的 JDBC 驅(qū)動(dòng)程序,就提供了對(duì)查詢的 SQL 結(jié)果的緩存,在客戶端和數(shù)據(jù)庫(kù)端都有,可以有效的減少對(duì)數(shù)據(jù)庫(kù)的訪問。關(guān)于 Oracle JDBC 的內(nèi)存管理可以參考《 Oracle JDBC 內(nèi)存管理》。除了設(shè)置緩存還有一個(gè)辦法是,合并訪問請(qǐng)求:如在查詢數(shù)據(jù)庫(kù)時(shí),我們要查 10 個(gè) id,我可以每次查一個(gè) id,也可以一次查 10 個(gè) id。再比如在訪問一個(gè)頁(yè)面時(shí)通過會(huì)有多個(gè) js 或 css 的文件,我們可以將多個(gè) js 文件合并在一個(gè) HTTP 鏈接中,每個(gè)文件用逗號(hào)隔開,然后發(fā)送到后端 Web 服務(wù)器根據(jù)這個(gè) URL 鏈接,再拆分出各個(gè)文件,然后打包再一并發(fā)回給前端瀏覽器。這些都是常用的減少網(wǎng)絡(luò) I/O 的辦法。
  • 減少網(wǎng)絡(luò)傳輸數(shù)據(jù)量的大小:減少網(wǎng)絡(luò)數(shù)據(jù)量的辦法通常是將數(shù)據(jù)壓縮后再傳輸,如 HTTP 請(qǐng)求中,通常 Web 服務(wù)器將請(qǐng)求的 Web 頁(yè)面 gzip 壓縮后在傳輸給瀏覽器。還有就是通過設(shè)計(jì)簡(jiǎn)單的協(xié)議,盡量通過讀取協(xié)議頭來(lái)獲取有用的價(jià)值信息。比如在代理程序設(shè)計(jì)時(shí),有 4 層代理和 7 層代理都是來(lái)盡量避免要讀取整個(gè)通信數(shù)據(jù)來(lái)取得需要的信息。
  • 盡量減少編碼:通常在網(wǎng)絡(luò) I/O 中數(shù)據(jù)傳輸都是以字節(jié)形式的,也就是通常要序列化。但是我們發(fā)送要傳輸?shù)臄?shù)據(jù)都是字符形式的,從字符到字節(jié)必須編碼。但是這個(gè)編碼過程是比較耗時(shí)的,所以 在要經(jīng)過網(wǎng)絡(luò) I/O 傳輸時(shí),盡量直接以字節(jié)形式發(fā)送。也就是盡量提前將字符轉(zhuǎn)化為字節(jié),或者減少字符到字節(jié)的轉(zhuǎn)化過程。
  • 根據(jù)應(yīng)用場(chǎng)景設(shè)計(jì)合適的交互方式:所謂的交互場(chǎng)景主要包括同步與異步阻塞與非阻塞方式,下面將詳細(xì)介紹。
  • 同步與異步

    所謂同步就是一個(gè)任務(wù)的完成需要依賴另外一個(gè)任務(wù)時(shí),只有等待被依賴的任務(wù)完成后,依賴的任務(wù)才能算完成,這是一種可靠的任務(wù)序列。要么成 功都成功,失敗都失敗,兩個(gè)任務(wù)的狀態(tài)可以保持一致。而異步是不需要等待被依賴的任務(wù)完成,只是通知被依賴的任務(wù)要完成什么工作,依賴的任務(wù)也立即執(zhí)行, 只要自己完成了整個(gè)任務(wù)就算完成了。至于被依賴的任務(wù)最終是否真正完成,依賴它的任務(wù)無(wú)法確定,所以它是不可靠的任務(wù)序列。我們可以用打電話和發(fā)短信來(lái)很 好的比喻同步與異步操作。

    在設(shè)計(jì)到 IO 處理時(shí)通常都會(huì)遇到一個(gè)是同步還是異步的處理方式的選擇問題。因?yàn)橥脚c異步的 I/O 處理方式對(duì)調(diào)用者的影響很大,在數(shù)據(jù)庫(kù)產(chǎn)品中都會(huì)遇到這個(gè)問題。因?yàn)?I/O 操作通常是一個(gè)非常耗時(shí)的操作,在一個(gè)任務(wù)序列中 I/O 通常都是性能瓶頸。但是同步與異步的處理方式對(duì)程序的可靠性影響非常大,同步能夠保證程序的可靠性,而異步可以提升程序的性能,必須在可靠性和性能之間做 個(gè)平衡,沒有完美的解決辦法。

    阻塞與非阻塞

    阻塞與非阻塞主要是從 CPU 的消耗上來(lái)說的,阻塞就是 CPU 停下來(lái)等待一個(gè)慢的操作完成 CPU 才接著完成其它的事。非阻塞就是在這個(gè)慢的操作在執(zhí)行時(shí) CPU 去干其它別的事,等這個(gè)慢的操作完成時(shí),CPU 再接著完成后續(xù)的操作。雖然表面上看非阻塞的方式可以明顯的提高 CPU 的利用率,但是也帶了另外一種后果就是系統(tǒng)的線程切換增加。增加的 CPU 使用時(shí)間能不能補(bǔ)償系統(tǒng)的切換成本需要好好評(píng)估。

    兩種的方式的組合

    組合的方式可以由四種,分別是:同步阻塞、同步非阻塞、異步阻塞、異步非阻塞,這四種方式都對(duì) I/O 性能有影響。下面給出分析,并有一些常用的設(shè)計(jì)用例參考。


    表 3. 四種組合方式
    組合方式性能分析
    同步阻塞最常用的一種用法,使用也是最簡(jiǎn)單的,但是 I/O 性能一般很差,CPU 大部分在空閑狀態(tài)。
    同步非阻塞提升 I/O 性能的常用手段,就是將 I/O 的阻塞改成非阻塞方式,尤其在網(wǎng)絡(luò) I/O 是長(zhǎng)連接,同時(shí)傳輸數(shù)據(jù)也不是很多的情況下,提升性能非常有效。
    這種方式通常能提升 I/O 性能,但是會(huì)增加 CPU 消耗,要考慮增加的 I/O 性能能不能補(bǔ)償 CPU 的消耗,也就是系統(tǒng)的瓶頸是在 I/O 還是在 CPU 上。
    異步阻塞這種方式在分布式數(shù)據(jù)庫(kù)中經(jīng)常用到,例如在網(wǎng)一個(gè)分布式數(shù)據(jù)庫(kù)中寫一條記錄,通常會(huì)有一份是同步阻塞的記錄,而還有兩至三份是備份記錄會(huì)寫到其它機(jī)器上,這些備份記錄通常都是采用異步阻塞的方式寫 I/O。
    異步阻塞對(duì)網(wǎng)絡(luò) I/O 能夠提升效率,尤其像上面這種同時(shí)寫多份相同數(shù)據(jù)的情況。
    異步非阻塞這種組合方式用起來(lái)比較復(fù)雜,只有在一些非常復(fù)雜的分布式情況下使用,像集群之間的消息同步機(jī)制一般用這種 I/O 組合方式。如 Cassandra 的 Gossip 通信機(jī)制就是采用異步非阻塞的方式。
    它適合同時(shí)要傳多份相同的數(shù)據(jù)到集群中不同的機(jī)器,同時(shí)數(shù)據(jù)的傳輸量雖然不大,但是卻非常頻繁。這種網(wǎng)絡(luò) I/O 用這個(gè)方式性能能達(dá)到最高。

    雖然異步和非阻塞能夠提升 I/O 的性能,但是也會(huì)帶來(lái)一些額外的性能成本,例如會(huì)增加線程數(shù)量從而增加 CPU 的消耗,同時(shí)也會(huì)導(dǎo)致程序設(shè)計(jì)的復(fù)雜度上升。如果設(shè)計(jì)的不合理的話反而會(huì)導(dǎo)致性能下降。在實(shí)際設(shè)計(jì)時(shí)要根據(jù)應(yīng)用場(chǎng)景綜合評(píng)估一下。

    下面舉一些異步和阻塞的操作實(shí)例:

    在 Cassandra 中要查詢數(shù)據(jù)通常會(huì)往多個(gè)數(shù)據(jù)節(jié)點(diǎn)發(fā)送查詢命令,但是要檢查每個(gè)節(jié)點(diǎn)返回?cái)?shù)據(jù)的完整性,所以需要一個(gè)異步查詢同步結(jié)果的應(yīng)用場(chǎng)景,部分代碼如下:

    清單 3.異步查詢同步結(jié)果


    class AsyncResult implements IAsyncResult{ private byte[] result_; private AtomicBoolean done_ = new AtomicBoolean(false); private Lock lock_ = new ReentrantLock(); private Condition condition_; private long startTime_; public AsyncResult(){ condition_ = lock_.newCondition();// 創(chuàng)建一個(gè)鎖 startTime_ = System.currentTimeMillis(); } /*** 檢查需要的數(shù)據(jù)是否已經(jīng)返回,如果沒有返回阻塞 */ public byte[] get(){ lock_.lock(); try{ if (!done_.get()){condition_.await();} }catch (InterruptedException ex){ throw new AssertionError(ex); }finally{lock_.unlock();} return result_; } /*** 檢查需要的數(shù)據(jù)是否已經(jīng)返回 */ public boolean isDone(){return done_.get();} /*** 檢查在指定的時(shí)間內(nèi)需要的數(shù)據(jù)是否已經(jīng)返回,如果沒有返回拋出超時(shí)異常 */ public byte[] get(long timeout, TimeUnit tu) throws TimeoutException{ lock_.lock(); try{ boolean bVal = true; try{ if ( !done_.get() ){ long overall_timeout = timeout - (System.currentTimeMillis() - startTime_); if(overall_timeout > 0)// 設(shè)置等待超時(shí)的時(shí)間 bVal = condition_.await(overall_timeout, TimeUnit.MILLISECONDS); else bVal = false; } }catch (InterruptedException ex){ throw new AssertionError(ex); } if ( !bVal && !done_.get() ){// 拋出超時(shí)異常 throw new TimeoutException("Operation timed out."); } }finally{lock_.unlock(); } return result_; } /*** 該函數(shù)拱另外一個(gè)線程設(shè)置要返回的數(shù)據(jù),并喚醒在阻塞的線程 */ public void result(Message response){ try{ lock_.lock(); if ( !done_.get() ){ result_ = response.getMessageBody();// 設(shè)置返回的數(shù)據(jù) done_.set(true); condition_.signal();// 喚醒阻塞的線程 } }finally{lock_.unlock();} } }


    總結(jié)

    本文闡述的內(nèi)容較多,從 Java 基本 I/O 類庫(kù)結(jié)構(gòu)開始說起,主要介紹了磁盤 I/O 和網(wǎng)絡(luò) I/O 的基本工作方式,最后介紹了關(guān)于 I/O 調(diào)優(yōu)的一些方法。

    《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的深入分析 Java I/O 的工作机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    狠狠五月天 | 日韩欧美精品免费 | 美女视频永久黄网站免费观看国产 | 五月婷网站 | 国产亚洲精品免费 | 手机av看片 | 国产精品毛片完整版 | 国产精品久久久久久模特 | 国产精品不卡一区 | 日韩城人在线 | 99久久久成人国产精品 | 91系列在线观看 | 天天操夜夜拍 | 日韩免费一区二区在线观看 | 国产成人精品综合 | 亚洲观看黄色网 | 黄色亚洲免费 | 亚洲欧美一区二区三区孕妇写真 | 日韩高清一区在线 | 国产精品久久久久久久免费观看 | 免费黄av| 久久手机免费视频 | 久久久私人影院 | 免费情趣视频 | 国产又黄又猛又粗 | 国产成人在线网站 | 亚洲免费在线观看视频 | 国产精品激情偷乱一区二区∴ | 麻豆视频免费播放 | 久久精品一区二区 | 天天激情天天干 | 人人艹视频 | 国产在线观看,日本 | 在线日本看片免费人成视久网 | 日日夜夜网站 | 欧美淫视频 | 国产精品av电影 | 天天操月月操 | 国内揄拍国产精品 | 在线观看成人一级片 | 婷婷色九月| 91麻豆精品国产91久久久更新时间 | 99精品黄色 | 国产精品一区二区三区久久久 | 国产精品不卡一区 | 欧美午夜理伦三级在线观看 | 久久综合久久综合久久 | 人人澡超碰碰97碰碰碰软件 | 91看片在线免费观看 | 美女网站色在线观看 | 日韩在线视频网址 | 久久久久久久久久久久久影院 | 日韩免费 | 美女国产网站 | 久久不射影院 | 久久综合色影院 | 天天躁日日躁狠狠 | 久久99免费 | 97电影手机 | 一区二区三区在线不卡 | 国产美女精品视频 | 亚洲欧美日韩精品一区二区 | 中文字幕高清在线 | 福利电影一区二区 | 亚洲丝袜一区二区 | 不卡中文字幕av | 日韩中字在线观看 | 国产精品乱看 | 五月婷婷视频在线 | 国产成人精品一区二区在线观看 | 中文在线中文a | 久久久精品国产一区二区 | 麻豆久久一区 | 国产99视频在线观看 | 久久综合狠狠综合久久狠狠色综合 | 久久久久免费观看 | 色视频在线观看 | 国产成人久久77777精品 | www.99久久.com | 在线国产福利 | 天天激情天天干 | 中文字幕网站视频在线 | 视频成人永久免费视频 | 色婷婷激情 | 午夜国产福利在线 | 成人午夜电影免费在线观看 | 国产一区二区不卡在线 | 久草免费在线视频观看 | 国产精品久久久免费看 | 久久艹影院 | 最新国产一区二区三区 | 最近久乱中文字幕 | 亚洲精品观看 | 日韩精品亚洲专区在线观看 | 日韩午夜视频在线观看 | 久久国产精品久久久久 | 国产一区二区电影在线观看 | 二区视频在线 | 国产日韩视频在线 | 一区二区三区免费播放 | 91在线永久 | 在线观看一区二区视频 | 欧美精品中文字幕亚洲专区 | 最近高清中文在线字幕在线观看 | 久久综合五月 | 日韩激情在线视频 | 天堂入口网站 | 色综合天天狠天天透天天伊人 | 黄色成人av | 国产女做a爱免费视频 | 国产精品欧美一区二区 | 久久不卡视频 | 免费观看全黄做爰大片国产 | 国产在线精品一区二区三区 | 中文字幕在线观看第二页 | 极品嫩模被强到高潮呻吟91 | 91日本在线播放 | 日韩中文在线观看 | 激情xxxx| 国产精品 中文在线 | 成人h在线 | 精品伊人久久久 | 九九久久免费视频 | 午夜精品久久久久久久99热影院 | 九九九九九国产 | 国产免费叼嘿网站免费 | 韩国精品在线 | 国内精自线一二区永久 | 狠狠操夜夜操 | 久久亚洲日本 | 久久久电影 | 天天色成人网 | 精品国产乱码一区二区三区在线 | 91色国产在线 | 91探花国产综合在线精品 | 国产精品福利在线观看 | 九色91在线| 亚洲乱码国产乱码精品天美传媒 | 在线观看黄色av | 亚洲欧洲一区二区在线观看 | 日本一区二区高清不卡 | 中文免费在线观看 | 国产精品久久久亚洲 | 久久99亚洲精品久久 | 成 人 黄 色 视频 免费观看 | 综合久久网 | 9草在线| 久久久九色精品国产一区二区三区 | 亚洲另类视频在线观看 | 狠狠色狠狠色综合日日92 | 精品国产一区二区三区蜜臀 | 日韩av不卡播放 | 中文字幕亚洲精品在线观看 | 国产黄色免费观看 | 91伊人久久大香线蕉蜜芽人口 | 丝袜制服天堂 | 成人免费看片98欧美 | 色婷婷国产精品一区在线观看 | 中文字幕日韩高清 | 日韩一区二区三区在线观看 | 成人免费xyz网站 | 精品视频区 | 欧美成人按摩 | 久久精品96| 成人午夜久久 | 成全在线视频免费观看 | 最近中文字幕在线中文高清版 | 中文十次啦 | 麻豆国产在线视频 | 99久久精品免费看国产 | 91精品视频导航 | 免费精品国产va自在自线 | 国产精品毛片一区视频播不卡 | 色婷婷www| wwwwww黄 | 高清日韩一区二区 | 成人91在线 | 国产成人久久精品77777 | 波多野结衣视频在线 | 九九热免费在线观看 | 国产日韩欧美网站 | 日韩免费在线播放 | 成人三级网站在线观看 | 青青视频一区 | 日韩女同一区二区三区在线观看 | 国产 欧美 在线 | 日日夜夜精品 | 久久久91精品国产一区二区精品 | 四虎在线观看 | 亚洲更新最快 | 又黄又爽免费视频 | 久久久精品电影 | 久久精品中文字幕少妇 | 手机看片久久 | 色婷婷午夜 | 国产精品va在线播放 | 亚洲久久视频 | 一区二区三区四区五区在线视频 | 亚洲成年人在线播放 | 91片黄在线观 | 丁香九月激情 | 国产精品成人久久久久 | 91视频久久久 | 婷婷伊人综合亚洲综合网 | 人人超碰在线 | 午夜色大片在线观看 | 91在线视频一区 | www.av免费观看| 午夜美女网站 | 精精国产xxxx视频在线播放 | 中文在线资源 | av免费电影在线 | 国产精品美女在线观看 | 亚洲精品视频在线免费播放 | 婷婷电影在线观看 | 国产精品久久久久久久久免费 | 国产精品国产三级在线专区 | 九九久久在线看 | 久久艹艹| 一区二区三区中文字幕在线观看 | 成人免费在线播放视频 | 九九九视频在线 | 天堂av网址 | 97在线成人 | 一本一道波多野毛片中文在线 | 久久免费一 | 成人亚洲精品久久久久 | 男女拍拍免费视频 | 亚洲自拍偷拍色图 | 探花在线观看 | 国产成人一区二区三区在线观看 | 成人欧美在线 | 免费观看成年人视频 | 九草在线观看 | 婷婷国产一区二区三区 | 日韩成人高清在线 | 色偷偷888欧美精品久久久 | 久久国产a | 国产一级电影 | 中文乱幕日产无线码1区 | 国产精品综合久久久久 | 久久精品看| 97视频在线免费播放 | 又黄又爽的免费高潮视频 | www.com.黄 | 欧美国产高清 | 97免费视频在线 | 操操操av| 亚洲精品自在在线观看 | 丁香一区二区 | 麻豆视频免费网站 | 2023年中文无字幕文字 | 亚洲综合在线五月天 | av不卡网站 | 天天天天色射综合 | 亚洲视频精选 | 精品特级毛片 | 久久国产免费视频 | 久久视精品 | av免费在线免费观看 | 一区二三国产 | 亚洲精品午夜一区人人爽 | 国内视频一区二区 | 精品久久久久久久久久久久 | 久久玖 | 97色在线| 91麻豆精品一区二区三区 | 亚洲精品国产精品久久99 | 亚洲激情六月 | 黄色片视频免费 | 成年人网站免费观看 | 欧美日韩中文在线观看 | 一区二区三区在线播放 | 成人精品在线 | 黄色免费网战 | 久久免费视频这里只有精品 | 亚洲精品国产精品国自产观看 | 91 在线视频播放 | 久久高清片 | 亚洲精品成人免费 | 日韩激情免费视频 | 在线国产能看的 | 三级在线视频观看 | 国产做a爱一级久久 | www.神马久久| 成人高清在线 | 国产日女人 | 在线观看国产亚洲 | 久久黄色精品视频 | 久久久久久久久久电影 | 日韩性色| 成人午夜影院 | 精品久久久久久久久久久院品网 | 在线视频精品播放 | 久久视了 | 久久综合久久综合九色 | 亚洲天堂精品视频 | 成人一级影视 | 国产成人精品久久久久 | 久久久久国产精品免费网站 | 国产又粗又猛又色又黄视频 | 国产精品一区二区av麻豆 | 丁香五婷 | 国产成人亚洲在线观看 | 97国产视频 | 国产99自拍 | 精品一区二区影视 | 不卡的av电影在线观看 | 四虎在线免费观看 | 国产一二三在线视频 | 香蕉视频在线看 | 免费在线观看一级片 | 超碰97国产精品人人cao | 午夜精品一区二区三区在线视频 | 2022中文字幕在线观看 | 国模精品一区二区三区 | 久草在线视频中文 | 精品美女国产在线 | 中文字幕av在线电影 | 香蕉久久久久 | 色诱亚洲精品久久久久久 | 国产精品美女视频 | 国产韩国精品一区二区三区 | 欧美一级片在线观看视频 | 97视频在线观看网址 | 国模视频一区二区三区 | www.国产视频 | 久久国产免 | 中文字幕国产精品一区二区 | 成人国产精品av | 免费看麻豆 | 成年人三级网站 | 久久综合色天天久久综合图片 | 久久免费视频3 | 婷婷中文字幕综合 | 九色91在线 | 精品一区在线看 | 夜夜操天天 | 精品99免费视频 | 又黄又爽的视频在线观看网站 | 欧美一区二区在线免费观看 | 婷婷色婷婷 | 日韩激情一二三区 | 国产高清综合 | 免费网站在线观看成人 | 欧日韩在线视频 | 国产在线观看免费 | 国产精品免费看久久久8精臀av | 亚洲欧美日韩一级 | 国产特级毛片aaaaaa | 天堂麻豆| 成人免费观看av | 99久热在线精品视频 | 五月亚洲综合 | 91大神在线看 | 中中文字幕av | 午夜久久久久久久 | 欧美精品一区二区免费 | 国产精品99久久久久久人免费 | 国产欧美精品一区二区三区四区 | 久久久国产精品成人免费 | 深爱激情亚洲 | 国产精品婷婷午夜在线观看 | 四虎亚洲精品 | 91成人欧美 | 国产一区二区在线免费视频 | 人人天天夜夜 | 国产综合精品久久 | 久久久久久久久久国产精品 | 综合激情网... | 国产视频午夜 | 日本精品视频网站 | 国产女教师精品久久av | 91视频首页| 色在线视频网 | 欧美日本在线观看视频 | 亚洲精品国偷自产在线99热 | 亚洲视频在线免费看 | 久久理论片 | 国内外成人在线视频 | 97热久久免费频精品99 | 97超在线视频 | 国产99自拍 | 国产日产精品一区二区三区四区的观看方式 | 欧美人zozo | 狠狠久久 | 精品国产aⅴ麻豆 | 亚洲视频久久久久 | 久草视频中文在线 | 欧美国产高清 | 天天色天天干天天色 | 国产精品久久久久一区二区 | 国内久久精品 | 日韩精品一区二区三区免费观看视频 | 狠狠狠狠狠狠干 | 超碰在线个人 | 九九在线国产视频 | 国产资源免费在线观看 | 日韩美女高潮 | 国产精品久久久久久久久久久杏吧 | 国产免费人人看 | 波多野结依在线观看 | 麻豆一级视频 | 中文字幕丝袜一区二区 | 玖玖视频精品 | 国产手机在线观看 | 制服丝袜亚洲 | 久久成人综合 | 日韩精品一区二区免费视频 | .国产精品成人自产拍在线观看6 | 亚洲天堂社区 | 日日夜夜91 | 婷婷久久五月天 | 欧美国产日韩一区二区三区 | 免费看污在线观看 | 最近最新中文字幕视频 | 精品国产精品一区二区夜夜嗨 | 久久av伊人 | 中文字幕第一页在线播放 | www.97视频| 日韩在线观看中文字幕 | 久热只有精品 | 国产一级片一区二区三区 | 91成人看片 | 久久特级毛片 | 黄色在线观看网站 | 久久久影院一区二区三区 | 久久99国产视频 | 99婷婷| 高清久久久久久 | 久草精品视频在线播放 | 欧美精品在线视频 | 久久久久久97三级 | 九色视频网站 | 久久久男人的天堂 | 中文字幕在线播放一区二区 | 国内精品视频免费 | 在线一二三区 | 深爱婷婷网 | 日韩欧美精品一区二区三区经典 | 91欧美精品 | 日本字幕网 | www免费网站在线观看 | 丁香激情视频 | 精品欧美一区二区三区久久久 | 午夜精品久久久久久 | 久久夜色网 | 91在线精品观看 | 日本久久久久久久久 | 日韩高清在线观看 | 91丨九色丨勾搭 | 这里只有精彩视频 | 91av免费在线观看 | 欧美色图88| 最新超碰在线 | 在线免费色视频 | 成人黄色av免费在线观看 | 日韩视频在线不卡 | 日韩高清三区 | 亚洲精品自在在线观看 | 美女国产在线 | 欧美日韩一区二区三区在线免费观看 | 国产精品免费观看在线 | 99视频精品| 久久久久久久久久久久亚洲 | 天天爱天天射 | 黄色在线免费观看网站 | 国产亚洲视频系列 | 日日爱视频 | 黄色网址a| 日本中文一级片 | 天天操天天干天天综合网 | 欧美午夜a | 国产精品免费小视频 | 日韩综合在线观看 | 区一区二区三区中文字幕 | 免费h漫在线观看 | 开心激情婷婷 | 欧美一区日韩一区 | 久久精品欧美视频 | 午夜国产福利视频 | 最近高清中文在线字幕在线观看 | 欧美老女人xx| 成人久久亚洲 | 黄色片免费在线 | 久久久久久久久电影 | 久久综合九色综合久99 | 国产在线观看免费 | 久久手机在线视频 | 亚洲国产精品人久久电影 | 亚洲麻豆精品 | 色吊丝在线永久观看最新版本 | 午夜久久福利视频 | 97超碰人人模人人人爽人人爱 | 国产日韩精品一区二区三区 | 91中文字幕在线视频 | 91亚洲国产成人久久精品网站 | 成人久久综合 | 在线观看91久久久久久 | 久久躁日日躁aaaaxxxx | 成人性生交视频 | 国产福利免费在线观看 | 超碰人人99 | 在线观看第一页 | 日韩大片免费在线观看 | 婷婷狠狠操 | 一区二区国产精品 | 国产系列 在线观看 | 人人超在线公开视频 | 成人影视片 | 亚洲最新av在线 | 超碰av在线免费观看 | 天天干,夜夜爽 | 免费在线色视频 | 欧美精品一区二区三区四区在线 | 88av视频| 久久福利在线 | 亚洲一区二区精品视频 | 久久综合久色欧美综合狠狠 | 91日韩精品视频 | 99国产在线 | 久草在线免费在线观看 | a级成人毛片 | 久久av电影 | 在线亚洲免费视频 | 九九视频免费观看视频精品 | 久草视频免费看 | 成年人在线观看 | 日韩理论在线观看 | 国产99久久精品一区二区永久免费 | 亚洲另类交 | 久久成人在线视频 | 黄色三级在线观看 | 日韩av片免费在线观看 | 亚洲激情在线观看 | 久久艹综合 | 国产精品免费在线视频 | 欧美人体xx | 天天干天天干天天射 | 在线观看黄色国产 | 亚洲视频每日更新 | 一区二区激情 | 精品一区 在线 | 久久久久久久久久久免费 | wwwwww国产 | 黄色午夜 | 最新中文字幕 | 久久香蕉电影 | 日韩一区二区免费播放 | 亚洲mv大片欧洲mv大片免费 | 国产精品久久久久久久久久久久午 | 日日成人网| 91av在线免费| 高清视频一区二区三区 | 天天插伊人 | 天天干天天搞天天射 | 激情网五月 | 久久国产成人午夜av影院宅 | 久久男人中文字幕资源站 | 美女黄频在线观看 | 四虎影院在线观看av | 一二区av | 五月天精品视频 | 婷婷久草| 91成年人在线观看 | 亚洲伦理中文字幕 | 国内精品久久久精品电影院 | 亚洲精品福利视频 | 日韩高清在线一区二区 | 成人国产精品一区 | 不卡日韩av | 久久这里只有精品23 | 精品一区二区三区久久 | 99 久久久久 | 伊人狠狠色 | 亚洲清纯国产 | 久久韩国免费视频 | 亚洲黄色一级大片 | 欧美久久影院 | 亚洲国产日本 | 99久久国产免费看 | 网址你懂的在线观看 | 国产精品69久久久久 | 国产一区二区久久久久 | 亚洲天天综合网 | 黄污视频大全 | 91人人爽久久涩噜噜噜 | 日本高清xxxx | 久久99久久精品 | 美女在线国产 | 亚洲精选久久 | 久久精品国亚洲 | 一区二区三区影院 | 狠狠色2019综合网 | 国产小视频在线观看 | 很污的网站 | 91福利试看 | 天天干国产 | 国产精品综合久久 | 在线观看视频在线 | 日韩激情综合 | 在线小视频 | 国产系列在线观看 | 97视频在线免费观看 | 日韩一级黄色av | 亚洲精品一区二区三区在线观看 | 国产一区二区三区免费观看视频 | 日日骑| 日本成人中文字幕在线观看 | 五月婷婷六月综合 | 最近更新中文字幕 | av免费播放 | 精品久久久久久久久久岛国gif | 五月网婷婷 | 香蕉视频在线看 | 激情综合五月网 | 成人久久久久久久久久 | 9999在线| 国产日韩精品在线观看 | 国产91免费在线 | 免费观看黄 | 日韩欧美视频免费看 | 蜜臀av性久久久久av蜜臀妖精 | 9幺看片 | 国产精品久久久久久婷婷天堂 | 91手机视频 | 亚洲日本在线一区 | 国产一二三区在线观看 | 91日韩精品一区 | 日韩在线观看你懂的 | 国产一在线精品一区在线观看 | 久久丁香网| 91亚洲精品国偷拍自产在线观看 | 久久免费电影网 | 国产不卡在线 | 碰超在线观看 | 国产精品99久久久久久久久久久久 | 天天操夜夜操国产精品 | 免费在线色 | 青青河边草观看完整版高清 | 99国产在线 | 在线视频电影 | 最近日本字幕mv免费观看在线 | 一区二区三区四区五区在线视频 | 国产亚洲精品bv在线观看 | 亚洲成av人片在线观看 | 亚洲在线视频观看 | 狠狠狠色丁香婷婷综合久久88 | 国产精品系列在线观看 | 99久久日韩精品免费热麻豆美女 | 日本黄色免费播放 | 欧美色图东方 | 欧美一级免费片 | 天天操天天摸天天爽 | 亚洲涩涩一区 | 亚洲精品午夜国产va久久成人 | 久久99亚洲精品 | 最近中文字幕高清字幕在线视频 | 操久久网 | 免费观看性生活大片 | 国产成a人亚洲精v品在线观看 | 国产伦理一区二区三区 | 亚洲国产午夜精品 | 制服丝袜天堂 | 黄色一级大片免费看 | 国产a国产| 六月激情网| 成人免费观看完整版电影 | 国产原厂视频在线观看 | 久产久精国产品 | 免费h精品视频在线播放 | 国产精品久久久久影院 | 日韩免费在线观看视频 | 国产成人精品一区二区三区在线 | 成人三级视频 | 国产在线精品区 | 久久激情久久 | 久久噜噜少妇网站 | 亚洲91av| 日韩欧美69 | 91在线区 | 免费福利片2019潦草影视午夜 | a黄在线观看 | 欧美成人精品三级在线观看播放 | 成年人网站免费在线观看 | 天天亚洲综合 | 人人精久 | 亚洲精品在线观看免费 | 在线观看第一页 | 国产精品18p | 国产精品久久久区三区天天噜 | 免费在线观看日韩 | 成人av在线资源 | 人人干人人艹 | 午夜精品久久久久久久久久久久久久 | 在线免费观看国产黄色 | 天天干.com| avsex| 天天艹天天干天天 | 久久伊99综合婷婷久久伊 | 波多野结衣在线观看一区二区三区 | 精品一区二区av | 亚洲精品乱码久久久久久久久久 | 狠狠色综合欧美激情 | 丁香六月婷婷开心婷婷网 | 亚洲精品大片www | 久久国产精品视频观看 | 97超碰香蕉 | 亚洲视屏在线播放 | 97超碰资源 | 欧美精品一二 | 中文字幕久久网 | 热久久国产 | 国产精品成人av电影 | 美女天天操 | 99久久久成人国产精品 | 成人在线免费看视频 | 国产精品99久久免费黑人 | 欧美性生活一级片 | 国产精品成人一区二区三区 | 亚洲精品免费在线观看 | 国产精品久久久久久久99 | 色婷婷88av视频一二三区 | 激情网五月婷婷 | 91亚洲夫妻 | 欧美日韩在线观看一区二区三区 | 欧美贵妇性狂欢 | 欧美日韩午夜爽爽 | 亚洲h视频在线 | 97精品欧美91久久久久久 | 欧美另类亚洲 | 久久99久久99精品免费看小说 | 91精品久久久久久久91蜜桃 | 成人av在线影视 | 久久久美女 | 亚洲爱爱视频 | 日韩免费在线网站 | 黄色性av| 麻豆手机在线 | 久久香蕉一区 | 免费观看性生活大片3 | 91九色在线视频观看 | 欧美性色综合网 | www.午夜 | 国产专区视频在线观看 | 久久久久久国产精品 | 麻豆视频免费看 | 最新国产精品视频 | 色偷偷中文字幕 | 成人毛片a | 国产精品免费不 | 久久只精品99品免费久23小说 | 日韩a在线观看 | 成人av电影免费在线播放 | 在线观看亚洲成人 | 国产精品久久久久久久久久久免费 | 国内精品美女在线观看 | av直接看 | 中文字幕文字幕一区二区 | 在线国产视频一区 | 91久久精| 亚洲激情五月 | 日韩1级片 | 久久久香蕉视频 | 久久久久久高潮国产精品视 | 九九免费在线观看 | 国产高清免费在线播放 | 日韩免费一区二区三区 | 欧美视频在线观看免费网址 | 日韩激情久久 | 天天草天天干 | 性色视频在线 | 在线韩国电影免费观影完整版 | 极品久久久 | 色综合久久久 | 国产中文字幕视频在线观看 | 天天摸日日摸人人看 | 懂色av懂色av粉嫩av分享吧 | 亚洲激情综合网 | 91在线看视频 | 国产精品嫩草影院123 | 99久久综合狠狠综合久久 | 69xx视频| 麻豆传媒在线免费看 | 欧美 日韩 视频 | aaawww| 丰满少妇麻豆av | .国产精品成人自产拍在线观看6 | 亚洲免费av网站 | 亚洲高清精品在线 | 伊人婷婷网 | 免费观看xxxx9999片 | 亚洲免费成人av电影 | 欧美福利网站 | 国产精品va在线观看入 | 91探花在线视频 | 日韩欧美在线视频一区二区三区 | 国产香蕉视频在线播放 | 亚洲综合少妇 | 天天干天天干天天射 | 在线观看色视频 | 天天做综合网 | 欧美日韩后 | www.com黄色| 欧美另类高清 videos | 国产免费又爽又刺激在线观看 | 国产精品日韩在线观看 | 欧美一级淫片videoshd | 成人黄大片 | 久久免费影院 | 在线看免费 | 人人爽人人看 | 激情网在线观看 | 久久女同性恋中文字幕 | 最近2019中文免费高清视频观看www99 | 色狠狠久久av五月综合 | 国产男女爽爽爽免费视频 | 国产成人久久精品一区二区三区 | av三级av | 91完整视频 | 久久精品一区二区三区国产主播 | 天天综合网在线观看 | 精品高清美女精品国产区 | 日韩亚洲在线视频 | 99久国产| 午夜国产在线 | 天天操天天谢 | 九九色在线观看 | 国产麻豆果冻传媒在线观看 | 久久理论影院 | 97在线观看免费视频 | 不卡中文字幕av | www.久草视频 | 亚洲精品久 | 国产剧情亚洲 | 亚洲人成在线观看 | 国产精品久久免费看 | 亚洲夜夜网 | 狠狠干网 | 九九免费观看全部免费视频 | 亚欧日韩成人h片 | 91在线免费视频观看 | 免费麻豆| 久久 在线 | av在线一级 | 亚洲aⅴ久久精品 | 91视频在线国产 | 色综合中文字幕 | 天天干天天操天天爱 | 国产精品久久久久久一区二区三区 | 免费看一级一片 | 在线观看久草 | 伊人成人精品 | 在线免费观看一区二区三区 | 日日干日日色 | 国产精品区二区三区日本 | 日本中文一区二区 | 色美女在线 | 欧美日韩高清不卡 | 欧美成人91| 免费看国产a | 麻豆系列在线观看 | 免费电影播放 | 国产99久久久久 | 国产经典三级 | 亚洲欧美成人网 | 日韩黄色免费在线观看 | 最近久乱中文字幕 | 日韩在线视频网 | 黄色91在线观看 | 日韩精品一卡 | 国产精品久久久久三级 | 日韩av免费在线看 | 婷婷激情5月天 | 91免费高清视频 | 国产99久久久国产精品免费看 | 亚洲欧美激情精品一区二区 | 99re8这里有精品热视频免费 | 最新中文字幕 | 麻豆视频免费在线观看 | 色综合久久精品 | 在线看片视频 | 日韩av中文在线 | 中文字幕视频播放 | 天天操夜夜做 | 国产中文字幕视频在线观看 | 亚洲在线精品 | 日韩欧美国产成人 | 欧美91av | 操操操综合| 91精品专区 | 久久久黄视频 | 中文电影网 | 黄色大片免费网站 | 不卡中文字幕av | 国产精品免费一区二区三区在线观看 | 国产综合视频在线观看 | 中文在线中文a | 尤物九九久久国产精品的分类 | 黄色91免费观看 | 97精品一区二区三区 | 中文字幕在线免费看线人 | 亚洲精品永久免费视频 | 色婷婷狠狠五月综合天色拍 | 国产精品99精品 | 中文字幕在线看视频国产 | 国产日韩欧美精品在线观看 | 久久久久免费观看 | 在线视频 区| 日本精品久久久一区二区三区 | 欧美中文字幕第一页 | 亚洲a色| 国产美女在线观看 | 久久久国产精品一区二区三区 | 久久久久久久久久久久久久电影 | 国产日韩欧美自拍 | 综合久久网 | 国产专区在线视频 | 五月婷丁香 | 91超碰免费在线 | 天天做夜夜做 | 91香蕉视频黄 | 一区二区激情视频 | 亚洲最新在线 | 免费高清av在线看 | 亚洲 欧洲 国产 日本 综合 | www.色五月.com | 天天草天天干天天射 | 免费www视频 | 色就是色综合 | 午夜黄色 | 日韩精品在线免费观看 | 久草视频在线看 | 亚洲小视频在线 | 欧美日韩一区二区在线观看 | 超碰在线观看av.com | 国产 一区二区三区 在线 | 欧美在线观看禁18 | 免费观看www小视频的软件 | 中文字幕免费不卡视频 | 色综合久久88色综合天天 | 精品影院 | 国产夫妻性生活自拍 | 玖玖玖在线观看 | 国产精久久 | 久久尤物电影视频在线观看 | 久久久久久美女 | 丁香综合五月 | 婷婷丁香在线视频 | 国产精品久久久久久久久久免费看 | 91精品久久久久久久99蜜桃 | 999在线精品| 精品久久久久一区二区国产 | 五月丁婷婷 | 日b视频国产 | 国产小视频免费观看 | 亚洲欧美日韩国产一区二区三区 | www.伊人网.com| 久久久精品综合 | 91久久久久久久一区二区 | 亚洲.www| 东方av在线免费观看 | 精品国产伦一区二区三区观看说明 | 亚洲在线激情 | 热99在线视频 | 天天草天天干天天 | 91久色蝌蚪 | 97在线免费视频 | av丝袜天堂 | 成人精品99 | av一级在线 | 成人h动漫精品一区二 | 国产精品粉嫩 | 国产又粗又猛又黄又爽 | 热久久影视 | 久久电影网站中文字幕 | 偷拍福利视频一区二区三区 | 婷婷综合成人 | 久久久五月天 | 亚洲干视频在线观看 | 亚洲精品免费看 | 亚洲精品日韩一区二区电影 | 在线观看激情av | 日韩av一区二区在线 | 国内外成人免费在线视频 | 二区三区av | 黄色一级网 | 国产午夜精品免费一区二区三区视频 | 在线国产片 | 久久久久久国产精品 | 久草a在线 | 午夜在线看片 | 日韩av一区二区三区在线观看 | 六月丁香久久 | 亚洲视频免费在线 | 狠狠网站 | 国产亚洲精品福利 | 97激情影院 |