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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

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

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

Java 的 I/O 類庫的基本架構(gòu)

I/O 問題是任何編程語言都無法回避的問題,可以說 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è)因素來展開的。

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

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

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

    輸入流根據(jù)數(shù)據(jù)類型和操作方式又被劃分成若干個(gè)子類,每個(gè)子類分別處理不同操作類型,OutputStream 輸出流的類層次結(jié)構(gòu)也是類似,如下圖所示:

    圖 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) {}

    FileReader 類就是按照上面的工作方式讀取文件的,FileReader 是繼承了 InputStreamReader 類,實(shí)際上是讀取文件流,然后通過 StreamDecoder 解碼成 char,只不過這里的解碼字符集是默認(rèn)字符集。

    寫入也是類似的過程如下圖所示:

    圖 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)用程序只能通過文件來操作磁盤上的數(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ì)象來標(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)來回答,至于文件系統(tǒng)的相關(guān)細(xì)節(jié)可以參考另外的文章。

    Java Socket 的工作機(jī)制

    Socket 這個(gè)概念沒有對(duì)應(yīng)到一個(gè)具體的實(shí)體,它是描述計(jì)算機(jī)之間完成相互通信一種抽象功能。打個(gè)比方,可以把 Socket 比作為兩個(gè)城市之間的交通工具,有了它,就可以在城市之間來回穿梭了。交通工具有多種,每種交通工具也有相應(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é)議來建立 TCP 連接。建立 TCP 連接需要底層 IP 協(xié)議來尋址網(wǎng)絡(luò)中的主機(jī)。我們知道網(wǎng)絡(luò)層使用的 IP 協(xié)議可以幫助我們根據(jù) IP 地址來找到目標(biāo)主機(jī),但是一臺(tái)主機(jī)上可能運(yùn)行著多個(gè)應(yīng)用程序,如何才能與指定的應(yīng)用程序通信就要通過 TCP 或 UPD 的地址也就是端口號(hào)來指定。這樣就可以通過一個(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)求到來時(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ì)象來交換數(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 帶來的挑戰(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)線程的開銷,采用線程池的辦法來減少線程創(chuàng)建和回收的成本,但是有一些使用場(chǎng)景仍然是無法解決的。如當(dāng)前一些需要大量 HTTP 長(zhǎng)連接的情況,像淘寶現(xiàn)在使用的 Web 旺旺項(xiàng)目,服務(wù)端需要同時(shí)保持幾百萬的 HTTP 連接,但是并不是每時(shí)每刻這些連接都在傳輸數(shù)據(jù),這種情況下不可能同時(shí)創(chuàng)建這么多線程來保持連接。即使線程的數(shù)量不是問題,仍然有一些問題還是無法避免的。如這種情況,我們想給某些客戶端更高的服務(wù)優(yōu)先級(jí),很難通過設(shè)計(jì)線程的優(yōu)先級(jí)來完成,另外一種情況是,我們需要讓每個(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è)核心概念。我們還用前面的城市交通工具來繼續(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 方法來檢查已經(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è)線程專門來處理請(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è)線程來處理所有連接的數(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è)變量來保存這個(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 記錄下來的值。

    還有一點(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ù),就是將不同的磁盤組合起來來提高 I/O 性能,目前有多種 RAID 技術(shù),每種 RAID 技術(shù)對(duì) I/O 性能提升會(huì)有不同,可以用一個(gè) RAID 因子來代表,磁盤的讀寫吞吐量可以通過 iostat 命令來獲取,于是我們可以計(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ì)索引,通過尋址索引來加快和減少磁盤的訪問,還有可以采用異步和非阻塞的方式加快磁盤的訪問效率。
  • 應(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)信息來恢復(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ù)庫端都有,可以有效的減少對(duì)數(shù)據(jù)庫的訪問。關(guān)于 Oracle JDBC 的內(nèi)存管理可以參考《 Oracle JDBC 內(nèi)存管理》。除了設(shè)置緩存還有一個(gè)辦法是,合并訪問請(qǐng)求:如在查詢數(shù)據(jù)庫時(shí),我們要查 10 個(gè) id,我可以每次查一個(gè) id,也可以一次查 10 個(gè) id。再比如在訪問一個(gè)頁面時(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 頁面 gzip 壓縮后在傳輸給瀏覽器。還有就是通過設(shè)計(jì)簡(jiǎn)單的協(xié)議,盡量通過讀取協(xié)議頭來獲取有用的價(jià)值信息。比如在代理程序設(shè)計(jì)時(shí),有 4 層代理和 7 層代理都是來盡量避免要讀取整個(gè)通信數(shù)據(jù)來取得需要的信息。
  • 盡量減少編碼:通常在網(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ù)序列。我們可以用打電話和發(fā)短信來很好的比喻同步與異步操作。

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

    阻塞與非阻塞

    阻塞與非阻塞主要是從 CPU 的消耗上來說的,阻塞就是 CPU 停下來等待一個(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ù)庫中經(jīng)常用到,例如在網(wǎng)一個(gè)分布式數(shù)據(jù)庫中寫一條記錄,通常會(huì)有一份是同步阻塞的記錄,而還有兩至三份是備份記錄會(huì)寫到其它機(jī)器上,這些備份記錄通常都是采用異步阻塞的方式寫 I/O。
    異步阻塞對(duì)網(wǎng)絡(luò) I/O 能夠提升效率,尤其像上面這種同時(shí)寫多份相同數(shù)據(jù)的情況。
    異步非阻塞這種組合方式用起來比較復(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ì)帶來一些額外的性能成本,例如會(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 類庫結(jié)構(gòu)開始說起,主要介紹了磁盤 I/O 和網(wǎng)絡(luò) I/O 的基本工作方式,最后介紹了關(guān)于 I/O 調(diào)優(yōu)的一些方法。

    來源:http://www.ibm.com/developerworks/cn/java/j-lo-javaio/

    轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/3820829.html

    總結(jié)

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

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

    91精品国产成人 | 久久男人中文字幕资源站 | 4438全国亚洲精品在线观看视频 | 欧美激情片在线观看 | 在线91色 | 成人a v视频| 91精品国产一区二区在线观看 | 国产一区视频在线播放 | 久久国产亚洲 | 四虎最新入口 | 亚洲国产黄色片 | 五月天综合激情 | 91精品视频观看 | 精选久久| 91高清在线| 黄色大片日本 | 精品免费一区二区三区 | 最近免费中文字幕 | 超碰av免费 | 国产精品99久久99久久久二8 | 久久久久久久久久免费 | 奇米影视999| 久草视频在 | 免费av大全 | 久久久久久欧美二区电影网 | a色视频| 精品a视频 | 99精品久久只有精品 | 国产精品18毛片一区二区 | 奇米影视777四色米奇影院 | 综合网色 | 国产无套精品久久久久久 | 最近在线中文字幕 | 一区二区亚洲精品 | 久久国产一区 | 2020天天干夜夜爽 | 精品婷婷 | 午夜在线观看 | 国内毛片毛片 | 日本黄色免费播放 | 成人免费在线播放视频 | 精品久久久久久久久久久久久 | 精品一区二区三区四区在线 | 啪啪免费视频网站 | 亚洲成人av一区二区 | 缴情综合网五月天 | 欧美最猛性xxxxx亚洲精品 | 精品少妇一区二区三区在线 | 91激情视频在线 | 成人高清在线观看 | 五月婷婷激情五月 | 六月婷婷色| 亚洲v欧美v国产v在线观看 | 国产丝袜网站 | 久久九九免费视频 | 最近的中文字幕大全免费版 | 欧美日韩国产一区二区三区 | 美女免费视频网站 | 成人a在线观看高清电影 | 日韩中文字幕一区 | 极品国产91在线网站 | av高清一区二区三区 | 四虎国产精品免费观看视频优播 | 久久精品一区二区三区国产主播 | 国内外成人免费在线视频 | 亚洲理论电影 | 国产一区二区在线精品 | 国内精品视频免费 | av免费看在线 | 国内丰满少妇猛烈精品播 | 黄色三级免费片 | 日韩在线观看你懂的 | 99久久精品久久久久久清纯 | 国产色在线观看 | 久久好看免费视频 | 国产一区二区电影在线观看 | 国产91在线观 | 久久久久久久久久久网站 | 久热免费在线观看 | 四虎国产精品免费观看视频优播 | 日韩在线大片 | 99色在线| 丁香婷婷久久 | bayu135国产精品视频 | 正在播放 久久 | www.色婷婷| 片网站 | 国产少妇在线观看 | www.五月天婷婷.com | 久久精品www人人爽人人 | 一区二区三区精品在线 | 精品国产成人在线 | 欧美亚洲成人xxx | 美女福利视频网 | 亚洲视频精品在线 | 99在线热播精品免费99热 | 欧美日韩视频网站 | 成人app在线免费观看 | 九九在线免费视频 | 久久99热久久99精品 | 在线免费观看羞羞视频 | 久久久久久在线观看 | 国产色在线观看 | av观看在线观看 | 国产一级片免费观看 | 97在线资源 | 黄色大片视频网站 | 天天射天天操天天干 | 久久国产高清视频 | 欧美巨乳波霸 | 日韩大片在线免费观看 | 综合国产在线观看 | 人人狠狠综合久久亚洲婷 | 激情久久一区二区三区 | 国产三级久久久 | 国产精品婷婷午夜在线观看 | 999男人的天堂 | 亚洲国产精品视频 | 国产视频一区二区三区在线 | 亚洲精品午夜久久久久久久 | 久久免费国产电影 | 国产精品女教师 | 免费在线观看成人av | 久久视频在线 | 在线观看视频一区二区三区 | 91人人爽人人爽人人精88v | 中文字幕免费久久 | 午夜精品视频一区 | 91视频高清免费 | 99精品99 | 国产专区在线播放 | 久久久免费在线观看 | 91成年视频| 亚洲欧洲精品一区二区 | 久久免费成人网 | 国产精品成人一区 | 国产精品 国产精品 | 91综合视频在线观看 | 最近免费中文字幕大全高清10 | 亚洲精品视频免费在线观看 | 国产一区二区在线精品 | 天天射天天拍 | 欧美日韩国产精品一区二区 | 国产96在线观看 | 在线观看国产区 | 日日夜夜精品免费观看 | 狠狠色噜噜狠狠狠狠2021天天 | 亚洲精品在线观看av | 人人干人人干人人干 | 久久久久激情 | 精品麻豆入口免费 | 成人99免费视频 | 日韩一片| 中文字幕资源网在线观看 | 婷婷六月天丁香 | 久久精彩 | 久久 地址| 日韩精品一区二区不卡 | 亚洲黄色一级大片 | 五月婷婷在线视频 | 日韩成人高清在线 | 91看片成人 | 福利视频区 | 精品二区久久 | 中文在线www | 久久精品国产精品亚洲 | 在线91网| 亚洲综合视频在线观看 | 九色视频自拍 | 成人黄色中文字幕 | 久草精品视频在线播放 | 91天天操| www.夜夜操.com | 欧美在线视频一区二区三区 | 免费在线激情电影 | 激情五月在线 | 丁香花在线视频观看免费 | 久久91网 | 99久久精品国产亚洲 | 香蕉视频免费在线播放 | 久久久.com | 国产福利精品视频 | 91天天操| 外国av网 | 国产精品久久久久久久久费观看 | 日本黄色a级大片 | 五月天激情在线 | 日韩欧美电影在线 | 日韩三级视频在线观看 | 国产精品免费一区二区 | 2021国产在线视频 | 久草在线费播放视频 | 麻豆视频国产在线观看 | 波多野结衣在线观看一区二区三区 | 国产不卡视频在线 | 国产裸体视频bbbbb | 亚洲区精品视频 | 国产在线观看,日本 | 成 人 黄 色视频免费播放 | 美女免费视频一区 | 国产黄色片免费观看 | 精品视频久久 | 久草在线高清 | 亚洲男男gaygay无套同网址 | 天天操夜夜想 | 美女视频黄频大全免费 | 伊人av综合| 美女网站在线 | 久热只有精品 | 午夜精品一区二区三区四区 | 一级片免费视频 | 超级碰99| 久久a热6 | 成人国产精品免费观看 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 久久久久久在线观看 | 精品久久一区 | 国产免费久久精品 | 国产精品一区二区三区在线免费观看 | 中文字幕久久精品一区 | 天天操天天干天天 | 精品主播网红福利资源观看 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 97视频中文字幕 | 欧美特一级 | 狠狠久久伊人 | 日韩天天操 | 精品99免费 | 亚洲欧洲一区二区在线观看 | 四虎国产视频 | 亚洲五月激情 | 国产精品一区二区在线播放 | 91在线视频导航 | 91视频在线观看下载 | 开心激情综合网 | 999久久 | 日韩中文字幕网站 | av免费观看在线 | 亚洲免费小视频 | 欧美性生活免费看 | 国产精品久久久久久久久久久不卡 | 国外成人在线视频网站 | 中文字幕888 | 国产亚洲精品久久久久久电影 | 久av在线| 国产精品视频区 | 狠狠的干狠狠的操 | 色噜噜在线观看视频 | 久久久www成人免费精品张筱雨 | 97色婷婷人人爽人人 | 亚洲三级网站 | 久久精品国产免费 | 五月天色中色 | 成av在线 | 免费男女羞羞的视频网站中文字幕 | 玖玖精品在线 | 精品字幕在线 | 国产特级毛片aaaaaaa高清 | 激情欧美国产 | a在线观看视频 | 日韩久久一区二区 | 日日爱av| 日韩性久久| 色姑娘综合天天 | 精品国产一区二区三区不卡 | 国产 亚洲 欧美 在线 | 午夜精品电影一区二区在线 | 久久国产精品视频免费看 | 国产亚洲精品久久久久久 | 91大神dom调教在线观看 | 蜜臀av性久久久久蜜臀av | 奇米影视777影音先锋 | 日韩在线视频一区二区三区 | 久久成人国产精品一区二区 | 精品国产一区二区三区不卡 | 久久av一区二区三区亚洲 | 国产999久久久 | 久久久精品国产一区二区 | 五月天丁香视频 | 久久天堂亚洲 | 久久精品最新 | 欧美日韩一级久久久久久免费看 | 又黄又爽又刺激 | 久久精品99精品国产香蕉 | 在线免费观看成人 | www亚洲一区 | 亚洲精品乱码久久久一二三 | 欧美一级免费高清 | 美女久久久久久 | 久久精品网站视频 | 亚洲影音先锋 | 国产一区二区三区免费在线观看 | 麻豆久久久久 | 亚洲电影图片小说 | 欧美在线你懂的 | 国产高清不卡一区二区三区 | 天天爽人人爽夜夜爽 | 国产视频精品网 | 日韩欧美高清一区二区 | av电影在线免费观看 | 日本性xxx| 日韩在线免费视频 | 亚洲黄色一级视频 | 免费www视频| 欧美日韩二区三区 | 香蕉视频久久 | 亚洲精品永久免费视频 | 国产黄a三级三级三级三级三级 | 91av资源在线 | 天天色天天上天天操 | 美女免费电影 | 日韩色综合网 | 97品白浆高清久久久久久 | 日产乱码一二三区别在线 | 97超碰.com| 九九热精品在线 | 成年人免费看片 | 国产成人免费在线 | av中文天堂在线 | 99电影456麻豆 | 98久久| 久久久精品欧美一区二区免费 | 三级av免费观看 | 国产麻豆电影 | 日韩a在线观看 | 91麻豆文化传媒在线观看 | 91免费视频网站在线观看 | 天天爽天天爽天天爽 | 免费在线观看黄色网 | 亚洲成人家庭影院 | 久久激情久久 | 亚洲国产一区二区精品专区 | 一区二区三区四区久久 | 久久久久久久久久免费 | 超碰在线中文字幕 | 免费观看版 | 波多野结衣在线观看一区 | 国产小视频免费在线网址 | 蜜臀av麻豆 | 亚洲综合黄色 | 婷婷色站| www.天天色 | 婷婷精品在线视频 | www操操操 | 91亚洲精品久久久蜜桃 | 99久久久久国产精品免费 | 国内精品久久影院 | 伊人网站 | 97国产精品久久 | 亚洲精品高清在线观看 | 国产香蕉久久精品综合网 | 日本中文字幕网 | 黄网站色欧美视频 | 激情婷婷在线观看 | 国产精品专区在线 | 一区二区三区av在线 | 久久人人爽人人爽人人片 | 国产精品成人自产拍在线观看 | 国产四虎影院 | 免费麻豆视频 | 91黄色小网站 | 国产精品一区二区吃奶在线观看 | 欧美视频18 | 天天操天天射天天插 | 福利一区在线 | 亚洲综合五月 | 久久看片 | 狠狠操夜夜操 | 欧美精品一二三 | 精品国产99 | 色99中文字幕 | 日韩激情片在线观看 | 九九亚洲精品 | 99色免费 | 在线视频一区二区 | 亚洲涩涩涩 | 国产一级二级三级在线观看 | 久久久久久久av麻豆果冻 | 国产区网址 | 黄色大片视频网站 | 国产精品手机看片 | 成人h电影 | 色网站免费在线观看 | 97热久久免费频精品99 | 一区二区三区免费播放 | 亚洲欧美激情精品一区二区 | 久久艹在线 | 精品国产综合区久久久久久 | 国产一区久久 | 久久成人麻豆午夜电影 | 国产一二三区在线观看 | 国产日韩精品一区二区三区 | 久青草国产在线 | 久久久午夜影院 | 亚洲综合狠狠干 | 在线观看中文字幕一区二区 | 日韩av免费一区二区 | 精品国产乱码久久久久久三级人 | 国产破处视频在线播放 | av在线播放快速免费阴 | 免费看国产曰批40分钟 | 黄色片免费在线 | 特级西西444www大胆高清无视频 | 国产一级免费av | 日韩专区视频 | av解说在线 | 国产精品免费久久久久久久久久中文 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 天天激情在线 | 国产精美视频 | 亚洲一区日韩在线 | 国产成人一区二区三区久久精品 | 久久久国产影视 | 亚洲成人免费在线 | 在线成人中文字幕 | 91精品伦理 | 欧美在线久久 | 久久久久中文字幕 | 成人av影院在线观看 | 激情久久五月 | 天天草夜夜 | 99精品在线免费在线观看 | 夜色.com| 色亚洲激情 | 国产亚洲欧美精品久久久久久 | 国产成人精品一区二区三区免费 | 一区二区av| 亚洲视频在线观看网站 | 欧美日韩一区二区视频在线观看 | 亚洲在线免费视频 | 成人午夜电影免费在线观看 | 国产999视频 | 中文字幕在线观看视频免费 | 亚洲欧美日韩不卡 | caobi视频| 亚洲一区二区91 | a在线v| 久久综合九色综合欧美狠狠 | 免费黄色激情视频 | 精品久久久久久一区二区里番 | 日本少妇久久久 | 中文字幕免费不卡视频 | 91视频免费看网站 | 久久精品欧美 | 日韩午夜高清 | 精品欧美小视频在线观看 | 2018好看的中文在线观看 | 黄色在线视频网址 | 日日爽 | 狠狠色综合网站久久久久久久 | 最新国产一区二区三区 | 国产精品久久久久久久久久久久午 | 国产资源免费 | 日韩一区精品 | 久久久久久久久精 | 日韩在线观看你懂的 | 免费在线一区二区 | 日韩视频免费观看高清 | 成年美女黄网站色大片免费看 | 久久99视频免费 | 99精品一区二区 | 天堂在线成人 | 99久久www免费 | 免费看黄色小说的网站 | 中文字幕在线播放一区 | 天天插日日插 | 成人午夜在线观看 | 久久久久免费看 | 久久激五月天综合精品 | 91精品国产乱码 | 6080yy午夜一二三区久久 | 激情五月婷婷激情 | 一区二区激情 | 色人久久| 精品在线观看视频 | 男女免费视频观看 | 在线观看久草 | 婷婷伊人综合 | 国产精品久久久久久999 | 91麻豆精品一区二区三区 | 国产精品网站一区二区三区 | 蜜臀av性久久久久av蜜臀三区 | 色视频在线 | 亚洲第一中文字幕 | 久草网站 | 亚洲色图美腿丝袜 | 欧美一区在线看 | 天天曰天天爽 | 波多野结衣精品视频 | 91手机视频 | 久草在线资源观看 | 国产乱对白刺激视频在线观看女王 | 欧美日韩精品综合 | 免费一级片久久 | 91精品国产91久久久久福利 | 一区二区三区视频 | 精品免费久久久久 | 日韩精品视频一二三 | 亚洲视频aaa| 日韩欧美一区二区三区在线 | 欧美91精品久久久久国产性生爱 | 国产高清在线免费观看 | 久久天天躁狠狠躁亚洲综合公司 | 久久久福利影院 | 91在线视频免费91 | 日韩在线中文字幕视频 | 91成熟丰满女人少妇 | 日日干夜夜操视频 | 国产一区二区午夜 | 一区二区视频在线看 | 成人免费看黄 | 91在线资源 | 久久精品国产美女 | 日韩免费av网址 | 日韩免费精品 | 免费av高清 | 久久国产综合视频 | 99成人免费视频 | 日韩一区二区三区免费视频 | 精品国产一区二 | 国产亚洲无 | www.亚洲黄 | www黄com | av性网站 | 在线免费亚洲 | 国产精品久久久久久久久毛片 | 人成免费网站 | 久久视频国产精品免费视频在线 | 亚洲小视频在线观看 | 全黄网站 | 伊人电影天堂 | 国产一级片免费观看 | 91在线视频在线观看 | 四虎成人精品永久免费av九九 | 成人黄色大片在线免费观看 | 在线视频麻豆 | 色在线最新 | 久草网站 | av亚洲产国偷v产偷v自拍小说 | 国产中文视频 | 一本一本久久a久久精品综合 | 色综合婷婷 | 亚洲精品国久久99热 | 欧美午夜久久久 | 玖玖在线视频观看 | 亚洲1区在线 | 亚洲成人av在线播放 | 97福利视频 | 久久激情日本aⅴ | 国产中出在线观看 | a级片网站 | 91视频一8mav| 亚洲精品五月天 | 99视频黄 | 国产视频 亚洲精品 | 黄色一级免费电影 | 久久人人添人人爽添人人88v | 久久精品牌麻豆国产大山 | 激情小说网站亚洲综合网 | 99久久综合国产精品二区 | av电影不卡 | 欧美一级欧美一级 | 欧美日韩在线观看视频 | 天天操天天射天天插 | 久久久久久久久免费 | 天天射天天干天天插 | 偷拍福利视频一区二区三区 | 国产网站av | 五月婷婷久 | 欧美日韩99 | 国产色综合天天综合网 | 久久综合之合合综合久久 | 色婷婷综合视频在线观看 | 久久国产手机看片 | 看v片| 青青河边草观看完整版高清 | 精品99免费 | 亚洲激情精品 | 日韩在线精品视频 | 黄色成年 | 国产精品系列在线 | 男女激情麻豆 | 国产小视频免费观看 | 亚洲经典精品 | 五月婷婷在线综合 | 国产视频精选在线 | 激情网在线视频 | 99re热精品视频 | 久久激情五月婷婷 | 国产精品爽爽爽 | 天天插天天色 | 亚洲一区二区三区毛片 | 日韩特黄一级欧美毛片特黄 | 99人成在线观看视频 | 色多多视频在线 | 国产亚洲精品久久久久秋 | 国内成人av | 久久免费精彩视频 | 伊人影院在线观看 | 999日韩| 最新三级在线 | 99久在线精品99re8热视频 | 五月激情av | av高清不卡 | 精品一二三四五区 | 香蕉在线观看 | 中文字幕欲求不满 | 91超碰在线播放 | 九九视频精品免费 | 91毛片在线观看 | 国产精品久久久999 国产91九色视频 | 制服丝袜在线91 | 国产成人黄色片 | 一本一本久久aa综合精品 | 日本久久久久久久久 | 九九在线高清精品视频 | 午夜国产福利视频 | 美女一二三区 | 国产中文字幕一区二区 | www久久国产 | 国产一区二区三区在线 | 午夜精品视频福利 | 九九免费在线看完整版 | 五月天综合色激情 | 99久久这里有精品 | 久久免费视频5 | 五月网婷婷 | 免费福利片2019潦草影视午夜 | 久久久精品国产免费观看一区二区 | 国产在线一线 | 成人av一级片 | 国产首页 | 精品国产一区二区在线 | 久久久久久久久久久久久久免费看 | 综合久久综合久久 | 黄色毛片在线看 | 五月综合 | 97久久久免费福利网址 | 91精品视频在线看 | 日韩午夜大片 | 亚洲国产精品第一区二区 | 成人免费 在线播放 | 国产精品女主播一区二区三区 | 国产一区在线看 | 欧美日韩视频一区二区三区 | 久久久久亚洲精品国产 | 久久精品视频在线观看免费 | 欧美男同视频网站 | 奇米影视8888在线观看大全免费 | 911精品美国片911久久久 | 亚洲精品字幕在线观看 | av一区二区在线观看中文字幕 | 久久综合影音 | 91日韩在线播放 | 激情在线网址 | 日本成人中文字幕在线观看 | 久久人人97超碰精品888 | 国产黄色片一级 | 91久久国产综合精品女同国语 | 亚洲激情 欧美激情 | 亚洲一区二区三区在线看 | 日韩精品欧美视频 | 久久久999免费视频 日韩网站在线 | 99爱精品在线 | 久久久综合精品 | 欧美性视频网站 | 久久有精品| www.黄色网.com | 最近日韩中文字幕中文 | 久久成人麻豆午夜电影 | 91精品秘密在线观看 | 亚洲精品h | 久久电影网站中文字幕 | 亚洲精品国产成人av在线 | 亚洲成a人片在线观看网站口工 | 欧美与欧洲交xxxx免费观看 | 国产一区二区三区四区大秀 | 欧美a√大片 | 91精品欧美一区二区三区 | 欧美日韩免费一区二区三区 | 国产69精品久久久久99尤 | 久久激情片 | 亚洲一区二区精品在线 | www.天天操.com| 久久视频免费在线观看 | 黄色成人在线观看 | 欧美最猛性xxxx | 欧美精品在线观看一区 | 在线岛国av | 国产精品久久一区二区无卡 | 欧美日韩中文在线观看 | 狠狠色丁香久久婷婷综合五月 | 在线观看日韩一区 | 久久精品国产第一区二区三区 | 日韩在线免费观看视频 | 成人国产一区 | 在线免费黄色 | 手机在线看永久av片免费 | 91成人精品视频 | 天天操天天操天天操天天操 | 亚州精品天堂中文字幕 | 色成人亚洲 | 一级黄色片在线免费观看 | 婷婷色站 | 国产免费大片 | 天天操天天摸天天干 | 国产无遮挡又黄又爽在线观看 | 中文字幕亚洲欧美 | 中文字幕一区二区三区四区视频 | 91丝袜美腿 | 天天干天天操人体 | 国产精品美女毛片真酒店 | 成人黄色影片在线 | 国产精品毛片久久 | 高清av影院 | 狠狠狠干狠狠 | 国内久久久久久 | 黄色软件视频网站 | 精品v亚洲v欧美v高清v | 日韩艹| www黄免费 | 国产精品99久久久久久久久久久久 | 免费97视频 | 国产成人精品久久久 | 欧美精品成人在线 | 草久草久 | 国产99久久九九精品免费 | 97操操 | 久久婷婷一区二区三区 | 人人舔人人舔 | 久久99热这里只有精品 | 91精品毛片| 久久99视频 | www日韩| 午夜视频在线观看一区二区三区 | 99久久影视 | 国产女v资源在线观看 | 天天操天天干天天插 | 欧美极品裸体 | 国产 在线观看 | 亚洲精品国久久99热 | 一级欧美日韩 | 国产高清精品在线观看 | 国产在线精品福利 | 欧美天堂视频在线 | 91福利区一区二区三区 | 亚洲精品日韩一区二区电影 | 国产视频1 | 天天干,狠狠干 | ww亚洲ww亚在线观看 | 国产精品一区二区三区在线免费观看 | 激情电影在线观看 | 精品一二三区视频 | 国产欧美精品一区二区三区 | www日韩在线观看 | 视频国产在线观看18 | 91精品一区国产高清在线gif | av一区在线播放 | 久久久久久蜜av免费网站 | 精品国产_亚洲人成在线 | 久久视频免费在线观看 | 久久国产精品免费 | 黄色片软件网站 | 国产精品一区二区美女视频免费看 | 成人免费视频视频在线观看 免费 | 黄色的视频网站 | 美女久久久久久 | 国产精品刺激对白麻豆99 | 国产中文字幕在线看 | 精品你懂的 | 免费成人av网站 | 国产精品视频免费在线观看 | 911国产在线观看 | 欧美a级在线播放 | 播五月综合 | www.夜夜夜| 91麻豆精品国产91久久久久久 | 久久精品这里热有精品 | 亚洲欧美日韩精品久久久 | 国产视频导航 | 超碰免费av | 久久超级碰视频 | 美女视频黄免费网站 | 国产一区二区三区在线 | 国产精品一区二区久久久 | 午夜三级毛片 | 黄色毛片视频免费 | 国产精品女同一区二区三区久久夜 | 天天色天天射天天操 | 日韩欧美大片免费观看 | 国产一级黄 | 在线观看日韩精品视频 | 国产日产精品久久久久快鸭 | 精品成人网 | 亚洲精品在线免费 | 婷婷在线色 | 五月天堂色 | 久久久久亚洲精品成人网小说 | av解说在线观看 | 91视频在线观看免费 | 天天亚洲综合 | 亚洲日本va中文字幕 | 日韩在线免费观看视频 | 麻豆91精品视频 | 婷婷在线色 | 日日干美女 | 国产一区视频在线 | av手机版| 成人全视频免费观看在线看 | 91视频在线 | 久久男人中文字幕资源站 | 91网站在线视频 | 成人免费看片98欧美 | 在线av资源 | 国产一区二区在线播放 | 九色福利视频 | 日本性视频 | 久久免费的精品国产v∧ | 久久理论影院 | 最新日本中文字幕 | 天天操天天操天天操天天操 | 91免费在线视频 | 日p视频 | 欧美综合色在线图区 | 亚洲黄色影院 | 国产免费影院 | 国产欧美最新羞羞视频在线观看 | 日本资源中文字幕在线 | 五月天堂色 | 91在线精品一区二区 | 日韩有码在线播放 | 97av色| 久久 亚洲视频 | 精品在线视频一区 | 久久久久亚洲精品中文字幕 | 精品五月天 | av中文字幕在线电影 | 91热爆视频 | 激情欧美一区二区三区免费看 | 国产在线精品福利 | 国内少妇自拍视频一区 | 91亚洲网| 9999国产| 91探花在线| 深夜免费小视频 | 久久久精华网 | 国产高清视频在线播放 | 日韩影片在线观看 | 亚洲一级黄色大片 | 国模吧一区 | 9992tv成人免费看片 | 国产亚洲精品美女久久 | 超碰在线成人 | 亚洲精品乱码久久久久久蜜桃动漫 | 超碰在线98 | 精品在线观看一区二区 | 五月婷婷播播 | 免费看一级黄色大全 | 97超碰免费| 一区二区三区视频网站 | 91久久久久久久一区二区 | 全久久久久久久久久久电影 | 一本一本久久a久久 | 99久高清在线观看视频99精品热在线观看视频 | 欧美欧美| 欧美在线视频一区二区三区 | 国产一区二区在线视频观看 | 日日夜夜艹 | 天天爱天天操天天射 | 中文字幕一区二区三区四区 | 91av视频在线观看免费 | 韩国av免费在线 | 99精品国产免费久久久久久下载 | 亚洲精品在 | 欧美91精品国产自产 | 亚洲激情小视频 | 高清中文字幕av | 久久美女精品 | 亚洲一区欧美激情 | 伊人开心激情 | 一区二区三区免费在线 | 91精品办公室少妇高潮对白 | 伊人网综合在线观看 | 一区二区三区播放 | 天天色天天干天天 | 99国产在线 | www91在线观看 | 91pony九色丨交换 | 日韩免费一级电影 | 日韩精品极品视频 | 久久久精品国产一区二区三区 | 精品96久久久久久中文字幕无 | 在线中文字幕播放 | 日本色小说视频 | 国内免费久久久久久久久久久 | 女人魂免费观看 | 日韩视频在线播放 | 九九热免费视频在线观看 | 欧美日韩一区二区免费在线观看 | 亚洲精品久久久蜜桃直播 | 日韩中文字幕免费视频 | 亚洲精选视频免费看 | 天天看天天操 | 国产999视频在线观看 | 干综合网 | 亚洲国产中文在线观看 | 日韩啪啪小视频 | 最近中文字幕大全中文字幕免费 | 观看免费av| 国产亚洲精品久久久久久大师 | 麻豆精品传媒视频 | 日本大尺码专区mv | 欧美最新另类人妖 | 97精品在线| 一区二区电影网 | 99精品免费在线 | 国产视频欧美视频 | 国产伦理久久 | 插综合网| 天天躁日日躁狠狠躁av麻豆 | 成人久久视频 | 国产高清无线码2021 | 国产色视频网站2 | 免费观看成人av | 国产精品九九久久99视频 | 91亚洲影院 | 久草观看 | 91久久精品一区 | 久久er99热精品一区二区 | 亚洲一区欧美激情 | 国产精品免费久久久久久久久久中文 | 免费在线观看的av网站 | 免费色视频在线 | 色天堂在线视频 | 亚洲激情综合 | 99久久精品网 | 看黄色.com| 国产午夜麻豆影院在线观看 | 久久免费a| 成人在线视频免费观看 | 亚洲精品五月天 | 免费观看黄色12片一级视频 | 国产视频黄 | 欧美va天堂va视频va在线 | 不卡电影免费在线播放一区 | 国产精品美女久久久久久久久久久 | 天天插天天干 | www.com.黄| 97视频免费 | 高清不卡毛片 | 中文字幕 国产精品 | 天天天天天天干 | 最近日本中文字幕 | 亚洲精品毛片一级91精品 | 亚洲午夜久久久久久久久 | 人人插人人搞 | 国产精品96久久久久久吹潮 | 色婷婷综合视频在线观看 | 中国精品少妇 | 亚洲精品午夜一区人人爽 | 五月婷久 | 久久你懂的 | 成年人免费观看国产 | 亚洲区色 | 免费在线观看av的网站 | 久精品视频| 九九热在线免费观看 | 天天看天天干 | 99热精品国产一区二区在线观看 | 久久久久久久av | 99爱这里只有精品 | 久操久| 97国产大学生情侣白嫩酒店 | 日本韩国精品一区二区在线观看 | 97在线观看免费观看 | www国产亚洲精品 | 在线观看911视频 | 日本精品小视频 | 狠狠躁日日躁狂躁夜夜躁av | av蜜桃在线 | 久章操| av三区在线 | 欧美成人在线免费观看 | 又湿又紧又大又爽a视频国产 | 久久久香蕉视频 | 91丨精品丨蝌蚪丨白丝jk | 欧美高清视频不卡网 | 丁香五婷| 国产免费久久精品 | 超碰在线观看av | 久久久精品免费观看 | 中文超碰字幕 | 欧美日韩99 | 精品国偷自产在线 | 日本丶国产丶欧美色综合 | 久久婷五月| 国产97在线播放 | 国产精品69av|