精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java 拾遺 — CPU Cache 與緩存行

商務辦公
CPU 是計算機的心臟,最終由它來執行所有運算和程序。主內存(RAM)是數據(包括代碼行)存放的地方。這兩者的定義大家應該不會陌生,那 CPU 高速緩存又是什么呢?

[[251190]]

引言

  1. public class Main { 
  2.     static long[][] arr; 
  3.  
  4.     public static void main(String[] args) { 
  5.         arr = new long[1024 * 1024][8]; 
  6.         // 橫向遍歷 
  7.         long marked = System.currentTimeMillis(); 
  8.         for (int i = 0; i < 1024 * 1024; i += 1) { 
  9.             for (int j = 0; j < 8; j++) { 
  10.                 sum += arr[i][j]; 
  11.             } 
  12.         } 
  13.         System.out.println("Loop times:" + (System.currentTimeMillis() - marked) + "ms"); 
  14.  
  15.         marked = System.currentTimeMillis(); 
  16.         // 縱向遍歷 
  17.         for (int i = 0; i < 8; i += 1) { 
  18.             for (int j = 0; j < 1024 * 1024; j++) { 
  19.                 sum += arr[j][i]; 
  20.             } 
  21.         } 
  22.         System.out.println("Loop times:" + (System.currentTimeMillis() - marked) + "ms"); 
  23.     } 

如上述代碼所示,定義了一個二維數組 long[][] arr 并且使用了橫向遍歷和縱向遍歷兩種順序對這個二位數組進行遍歷,遍歷總次數相同,只不過循環的方向不同,代碼中記錄了這兩種遍歷方式的耗時,不妨先賣個關子,他們的耗時會有區別嗎?

這問題問的和中小學試卷中的:“它們之間有區別嗎?如有,請說出區別。”一樣沒有水準,沒區別的話文章到這兒就結束了。事實上,在我的機器上(64 位 mac)多次運行后可以發現:橫向遍歷的耗時大約為 25 ms,縱向遍歷的耗時大約為 60 ms,前者比后者快了 1 倍有余。如果你了解上述現象出現的原因,大概能猜到,今天這篇文章的主角便是他了— CPU Cache&Cache Line。

在學生生涯時,不斷收到這樣建議:《計算機網絡》、《計算機組成原理》、《計算機操作系統》、《數據結構》四門課程是至關重要的,而在我這些年的工作經驗中也不斷地意識到前輩們如此建議的原因。作為一個 Java 程序員,你可以選擇不去理解操作系統,組成原理(相比這二者,網絡和數據結構跟日常工作聯系得相對緊密),這不會降低你的 KPI,但了解他們可以使你寫出更加計算機友好(Mechanical Sympathy)的代碼。

下面的章節將會出現不少操作系統相關的術語,我將逐個介紹他們,并最終將他們與 Java 聯系在一起。

什么是 CPU 高速緩存?

CPU 是計算機的心臟,最終由它來執行所有運算和程序。主內存(RAM)是數據(包括代碼行)存放的地方。這兩者的定義大家應該不會陌生,那 CPU 高速緩存又是什么呢?

在計算機系統中,CPU高速緩存是用于減少處理器訪問內存所需平均時間的部件。在金字塔式存儲體系中它位于自頂向下的第二層,僅次于CPU寄存器。其容量遠小于內存,但速度卻可以接近處理器的頻率。

當處理器發出內存訪問請求時,會先查看緩存內是否有請求數據。如果存在(***),則不經訪問內存直接返回該數據;如果不存在(失效),則要先把內存中的相應數據載入緩存,再將其返回處理器。

緩存之所以有效,主要是因為程序運行時對內存的訪問呈現局部性(Locality)特征。這種局部性既包括空間局部性(Spatial Locality),也包括時間局部性(Temporal Locality)。有效利用這種局部性,緩存可以達到極高的***率。

在處理器看來,緩存是一個透明部件。因此,程序員通常無法直接干預對緩存的操作。但是,確實可以根據緩存的特點對程序代碼實施特定優化,從而更好地利用緩存。

— 維基百科

CPU 緩存架構

左圖為最簡單的高速緩存的架構,數據的讀取和存儲都經過高速緩存,CPU 核心與高速緩存有一條特殊的快速通道;主存與高速緩存都連在系統總線上(BUS),這條總線還用于其他組件的通信。簡而言之,CPU 高速緩存就是位于 CPU 操作和主內存之間的一層緩存。

為什么需要有 CPU 高速緩存?

隨著工藝的提升,最近幾十年 CPU 的頻率不斷提升,而受制于制造工藝和成本限制,目前計算機的內存在訪問速度上沒有質的突破。因此,CPU 的處理速度和內存的訪問速度差距越來越大,甚至可以達到上萬倍。這種情況下傳統的 CPU 直連內存的方式顯然就會因為內存訪問的等待,導致計算資源大量閑置,降低 CPU 整體吞吐量。同時又由于內存數據訪問的熱點集中性,在 CPU 和內存之間用較為快速而成本較高(相對于內存)的介質做一層緩存,就顯得性價比極高了。

為什么需要有 CPU 多級緩存?

結合 圖片 -- CPU 緩存架構,再來看一組 CPU 各級緩存存取速度的對比

  1. 各種寄存器,用來存儲本地變量和函數參數,訪問一次需要1cycle,耗時小于1ns;
  2. L1 Cache,一級緩存,本地 core 的緩存,分成 32K 的數據緩存 L1d 和 32k 指令緩存 L1i,訪問 L1 需要3cycles,耗時大約 1ns;
  3. L2 Cache,二級緩存,本地 core 的緩存,被設計為 L1 緩存與共享的 L3 緩存之間的緩沖,大小為 256K,訪問 L2 需要 12cycles,耗時大約 3ns;
  4. L3 Cache,三級緩存,在同插槽的所有 core 共享 L3 緩存,分為多個 2M 的段,訪問 L3 需要 38cycles,耗時大約 12ns;

大致可以得出結論,緩存層級越接近于 CPU core,容量越小,速度越快,同時,沒有披露的一點是其造價也更貴。所以為了支撐更多的熱點數據,同時追求***的性價比,多級緩存架構應運而生。

什么是緩存行(Cache Line)?

上面我們介紹了 CPU 多級緩存的概念,而之后的章節我們將嘗試忽略“多級”這個特性,將之合并為 CPU 緩存,這對于我們理解 CPU 緩存的工作原理并無大礙。

緩存行 (Cache Line) 便是 CPU Cache 中的最小單位,CPU Cache 由若干緩存行組成,一個緩存行的大小通常是 64 字節(這取決于 CPU),并且它有效地引用主內存中的一塊地址。一個 Java 的 long 類型是 8 字節,因此在一個緩存行中可以存 8 個 long 類型的變量。

多級緩存

試想一下你正在遍歷一個長度為 16 的 long 數組 data[16],原始數據自然存在于主內存中,訪問過程描述如下

  • 訪問 data[0],CPU core 嘗試訪問 CPU Cache,未***。
  • 嘗試訪問主內存,操作系統一次訪問的單位是一個 Cache Line 的大小 — 64 字節,這意味著:既從主內存中獲取到了 data[0] 的值,同時將 data[0] ~ data[7] 加入到了 CPU Cache 之中,for free~
  • 訪問 data[1]~data[7],CPU core 嘗試訪問 CPU Cache,***直接返回。
  • 訪問 data[8],CPU core 嘗試訪問 CPU Cache,未***。
  • 嘗試訪問主內存。重復步驟 2

CPU 緩存在順序訪問連續內存數據時揮發出了***的優勢。試想一下上一篇文章中提到的 PageCache,其實發生在磁盤 IO 和內存之間的緩存,是不是有異曲同工之妙?只不過今天的主角— CPU Cache,相比 PageCache 更加的微觀。

再回到文章的開頭,為何橫向遍歷 arr = new long[1024 * 1024][8] 要比縱向遍歷更快?此處得到了解答,正是更加友好地利用 CPU Cache 帶來的優勢,甚至有一個專門的詞來修飾這種行為 — Mechanical Sympathy。

偽共享

通常提到緩存行,大多數文章都會提到偽共享問題(正如提到 CAS 便會提到 ABA 問題一般)。

偽共享指的是多個線程同時讀寫同一個緩存行的不同變量時導致的 CPU 緩存失效。盡管這些變量之間沒有任何關系,但由于在主內存中鄰近,存在于同一個緩存行之中,它們的相互覆蓋會導致頻繁的緩存未***,引發性能下降。偽共享問題難以被定位,如果系統設計者不理解 CPU 緩存架構,甚至永遠無法發現 — 原來我的程序還可以更快。

偽共享

正如圖中所述,如果多個線程的變量共享了同一個 CacheLine,任意一方的修改操作都會使得整個 CacheLine 失效(因為 CacheLine 是 CPU 緩存的最小單位),也就意味著,頻繁的多線程操作,CPU 緩存將會徹底失效,降級為 CPU core 和主內存的直接交互。

偽共享問題的解決方法便是字節填充。

偽共享-字節填充

我們只需要保證不同線程的變量存在于不同的 CacheLine 即可,使用多余的字節來填充可以做點這一點,這樣就不會出現偽共享問題。在代碼層面如何實現圖中的字節填充呢?

Java6 中實現字節填充

  1. public class PaddingObject{ 
  2.     public volatile long value = 0L;    // 實際數據 
  3.     public long p1, p2, p3, p4, p5, p6; // 填充 
  4. PaddingOb 

PaddingObject 類中需要保存一個 long 類型的 value 值,如果多線程操作同一個 CacheLine 中的 PaddingObject 對象,便無法完全發揮出 CPU Cache 的優勢(想象一下你定義了一個 PaddingObject[] 數組,數組元素在內存中連續,卻由于偽共享導致無法使用 CPU Cache 帶來的沮喪)。

不知道你注意到沒有,實際數據 value + 用于填充的 p1~p6 總共只占據了 7 * 8 = 56 個字節,而 Cache Line 的大小應當是 64 字節,這是有意而為之,在 Java 中,對象頭還占據了 8 個字節,所以一個 PaddingObject 對象可以恰好占據一個 Cache Line。

Java7 中實現字節填充

在 Java7 之后,一個 JVM 的優化給字節填充造成了一些影響,上面的代碼片段 public long p1, p2, p3, p4, p5, p6; 會被認為是無效代碼被優化掉,有回歸到了偽共享的窘境之中。

為了避免 JVM 的自動優化,需要使用繼承的方式來填充。

  1. abstract class AbstractPaddingObject{ 
  2.     protected long p1, p2, p3, p4, p5, p6;// 填充 
  3.  
  4. public class PaddingObject extends AbstractPaddingObject{ 
  5.     public volatile long value = 0L;    // 實際數據 

Tips:實際上我在本地 mac 下測試過 jdk1.8 下的字節填充,并不會出現無效代碼的優化,個人猜測和 jdk 版本有關,不過為了保險起見,還是使用相對穩妥的方式去填充較為合適。

如果你對這個現象感興趣,測試代碼如下:

  1. public final class FalseSharing implements Runnable { 
  2.     public final static int NUM_THREADS = 4; // change 
  3.     public final static long ITERATIONS = 500L * 1000L * 1000L; 
  4.     private final int arrayIndex; 
  5.  
  6.     private static VolatileLong[] longs = new VolatileLong[NUM_THREADS]; 
  7.  
  8.     static { 
  9.         for (int i = 0; i < longs.length; i++) { 
  10.             longs[i] = new VolatileLong(); 
  11.         } 
  12.     } 
  13.  
  14.     public FalseSharing(final int arrayIndex) { 
  15.         this.arrayIndex = arrayIndex; 
  16.     } 
  17.  
  18.     public static void main(final String[] args) throws Exception { 
  19.         final long start = System.currentTimeMillis(); 
  20.         runTest(); 
  21.         System.out.println("duration = " + (System.currentTimeMillis() - start)); 
  22.     } 
  23.  
  24.     private static void runTest() throws InterruptedException { 
  25.         Thread[] threads = new Thread[NUM_THREADS]; 
  26.  
  27.         for (int i = 0; i < threads.length; i++) { 
  28.             threads[i] = new Thread(new FalseSharing(i)); 
  29.         } 
  30.         for (Thread t : threads) { 
  31.             t.start(); 
  32.         } 
  33.         for (Thread t : threads) { 
  34.             t.join(); 
  35.         } 
  36.     } 
  37.  
  38.     public void run() { 
  39.         long i = ITERATIONS + 1; 
  40.         while (0 != --i) { 
  41.             longs[arrayIndex].value = i; 
  42.         } 
  43.     } 
  44.  
  45.     public final static class VolatileLong { 
  46.         public volatile long value = 0L; 
  47.         public long p1, p2, p3, p4, p5, p6; // 填充,可以注釋后對比測試 
  48.     } 
  49.  
  50.  

Java8 中實現字節填充

  1. @Retention(RetentionPolicy.RUNTIME) 
  2. @Target({ElementType.FIELD, ElementType.TYPE}) 
  3. public @interface Contended { 
  4.     String value() default ""

Java8 中終于提供了字節填充的官方實現,這無疑使得 CPU Cache 更加可控了,無需擔心 jdk 的無效字段優化,無需擔心 Cache Line 在不同 CPU 下的大小究竟是不是 64 字節。使用 @Contended 注解可以***的避免偽共享問題。

一些***實踐

可能有讀者會問:作為一個普通開發者,需要關心 CPU Cache 和 Cache Line 這些知識點嗎?這就跟前幾天比較火的話題:「程序員有必要懂 JVM 嗎?」一樣,仁者見仁了。但確實有不少優秀的源碼在關注著這些問題。他們包括:

ConcurrentHashMap

面試中問到要吐的 ConcurrentHashMap 中,使用 @sun.misc.Contended 對靜態內部類 CounterCell 進行修飾。另外還包括并發容器 Exchanger 也有相同的操作。

  1. /* ---------------- Counter support -------------- */ 
  2.  
  3. /** 
  4.  * A padded cell for distributing counts.  Adapted from LongAdder 
  5.  * and Striped64.  See their internal docs for explanation. 
  6.  */ 
  7. @sun.misc.Contended static final class CounterCell { 
  8.     volatile long value; 
  9.     CounterCell(long x) { value = x; } 

Thread

Thread 線程類的源碼中,使用 @sun.misc.Contended 對成員變量進行修飾。

  1. // The following three initially uninitialized fields are exclusively 
  2. // managed by class java.util.concurrent.ThreadLocalRandom. These 
  3. // fields are used to build the high-performance PRNGs in the 
  4. // concurrent code, and we can not risk accidental false sharing. 
  5. // Hence, the fields are isolated with @Contended. 
  6.  
  7. /** The current seed for a ThreadLocalRandom */ 
  8. @sun.misc.Contended("tlr"
  9. long threadLocalRandomSeed; 
  10.  
  11. /** Probe hash value; nonzero if threadLocalRandomSeed initialized */ 
  12. @sun.misc.Contended("tlr"
  13. int threadLocalRandomProbe; 
  14.  
  15. /** Secondary seed isolated from public ThreadLocalRandom sequence */ 
  16. @sun.misc.Contended("tlr"
  17. int threadLocalRandomSecondarySeed; 

RingBuffer

來源于一款優秀的開源框架 Disruptor 中的一個數據結構 RingBuffer ,我后續會專門花一篇文章的篇幅來介紹這個數據結構

  1. abstract class RingBufferPad 
  2.     protected long p1, p2, p3, p4, p5, p6, p7; 
  3.  
  4. abstract class RingBufferFields<E> extends RingBufferPad{} 

 

使用字節填充和繼承的方式來避免偽共享。

 

責任編輯:武曉燕 來源: Kirito的技術分享
相關推薦

2024-09-23 12:35:49

2022-10-12 23:39:46

Java接口屬性

2022-10-11 09:33:04

Java異常Exception

2010-03-30 08:36:26

Java框架StrutsSpring

2021-03-19 16:05:33

CSS CSS 屬性CSS 基礎

2021-12-14 07:40:07

C# 異步流結合體

2021-06-25 10:18:08

JavaScript Array.map 巧技拾遺

2019-12-10 14:51:00

CPU緩存內存

2022-12-12 08:39:09

CPUCache偽共享

2009-09-22 10:50:04

Hibernate c

2014-11-04 10:34:27

JavaCache

2018-08-16 11:30:12

JavaCPU緩存

2013-07-30 10:46:39

CPU Cache并發

2019-11-12 14:40:43

CPU緩存內存

2022-05-13 09:02:34

LinuxBufferCache

2018-07-14 21:59:57

緩存數據庫數據

2020-03-02 09:50:50

程序員技能開發者

2021-06-29 19:26:29

緩存Spring CachSpring

2023-05-05 18:38:33

多級緩存Caffeine開發

2014-11-10 10:27:20

Java
點贊
收藏

51CTO技術棧公眾號

91在线|亚洲| 亚洲色图17p| 欧美极品少妇无套实战| 亚洲国产精品久久久久久6q| 一本色道久久综合亚洲精品不卡 | 婷婷综合在线| 精品国内二区三区| 日av中文字幕| av电影免费在线观看| 粉嫩一区二区三区性色av| 欧美有码在线观看| 中文字幕电影av| 国产精品亚洲一区二区在线观看| 欧美日韩国产中文字幕| 天天综合中文字幕| 能在线看的av| 国产精品正在播放| 国产成人欧美在线观看| 久久人人爽人人爽人人| jvid福利在线一区二区| 亚洲精品在线三区| 九九精品久久久| 国产免费拔擦拔擦8x在线播放 | 91综合国产| 亚洲一区二区视频在线| 亚洲精品视频一区二区三区| 欧美特级特黄aaaaaa在线看| 久久精品国产99国产| 欧美亚洲视频在线看网址| 欧美一区二区网站| 成人久久精品视频| 久久久久久久久久久影院| 外国成人免费视频| 伊人久久久久久久久久久| 精品少妇人妻av一区二区三区| 日韩黄色三级在线观看| 日韩欧美aaa| 国产主播自拍av| 亚洲精品天堂| 亚洲欧洲一区二区在线播放| 欧美激情一区二区三区在线视频| a级片免费视频| 久久99精品国产麻豆婷婷| 日本成人黄色片| 亚洲伊人成人网| 亚洲精品影视| 国内精品小视频| 久久久久亚洲av成人片| 亚洲成人二区| 麻豆国产精品va在线观看不卡 | 日韩极品一区| 在线播放日韩av| www.狠狠爱| 视频一区中文| 国产亚洲精品久久久久久牛牛| 爱爱免费小视频| 久久丝袜视频| 精品香蕉在线观看视频一| 中文在线永久免费观看| 欧美尿孔扩张虐视频| 日韩av一卡二卡| 久久久久久久久久久国产精品| 欧美日韩一区二区三区在线电影| 亚洲福利在线播放| 51调教丨国产调教视频| 九九热爱视频精品视频| 影音先锋欧美精品| 日本女人性生活视频| 一区二区三区四区日韩| 欧美成人午夜影院| 国产一级av毛片| 性欧美精品高清| 国产精品va在线播放| 中文字幕在线播放日韩| 久久精品免费看| 91精品国产综合久久久久久丝袜 | 国产精品一区二区三区乱码| 99久久精品免费看国产一区二区三区 | 六月天综合网| 国产精品视频白浆免费视频| 91 中文字幕| 国产成人av电影免费在线观看| 国产日韩一区欧美| 美州a亚洲一视本频v色道| 久久人人爽人人爽| 亚洲日本无吗高清不卡| 2021国产在线| 欧美日韩人人澡狠狠躁视频| 国产无套粉嫩白浆内谢的出处| 国产成人精品一区二区三区免费 | 国产精品91视频| 亚洲熟妇av乱码在线观看| 国产精品18久久久久久久久| 国内一区二区三区在线视频| 阿v免费在线观看| 一区二区三区免费看视频| 免费无遮挡无码永久视频| 精品久久福利| 亚洲国产精品999| 懂色av粉嫩av浪潮av| 亚洲午夜一级| 国产精品嫩草影院久久久| 亚洲精品久久久久久无码色欲四季| 91麻豆高清视频| 久久免费一级片| 粉嫩虎白女毛片人体| 国产福利在线视频| 亚洲影院久久精品| 自拍偷拍 国产| 国产精品白浆| www国产亚洲精品久久网站| 日本三级理论片| 久久爱另类一区二区小说| 九色91视频| 欧美人与禽性xxxxx杂性| 在线欧美一区二区| 手机在线成人av| 亚洲国产日韩欧美在线| 国产激情久久久| 图片区 小说区 区 亚洲五月| 中文字幕在线不卡一区| 国产黄色特级片| 日本午夜精品| 欧美国产欧美亚洲国产日韩mv天天看完整| 在线免费观看av网址| 成人性生交大片| 国产成人生活片| 六九午夜精品视频| 亚洲天堂第二页| 中国一级特黄毛片| 成人午夜视频在线| 四虎精品欧美一区二区免费| 日本成人在线网站| 中文字幕亚洲国产| 国产成人精品一区二区色戒| 91免费看视频| 欧美 日韩 国产在线观看| 韩国精品福利一区二区三区 | 久久精品人成| 福利在线导航136| 欧美一级免费大片| 国产一区二区精彩视频| 久久国产欧美日韩精品| 亚洲欧洲在线一区| 99久久er| 中文字幕国产亚洲2019| 中文字幕在线观看高清| 欧美国产1区2区| 天美星空大象mv在线观看视频| 国产精品欧美三级在线观看| 国产ts一区二区| 国产在线视频福利| 在线免费亚洲电影| 一级片视频免费看| 日本免费在线视频不卡一不卡二| 欧美少妇一区| 欧美日韩女优| 色噜噜狠狠狠综合曰曰曰88av| 中文字幕永久在线视频| 国产精品污网站| 在线视频一二区| 欧美一区成人| 国产精品一区视频网站| 男人的天堂免费在线视频| 国产婷婷97碰碰久久人人蜜臀| av大全在线观看| 国产欧美精品一区二区三区四区 | 最新国产成人av网站网址麻豆| 中文字幕福利视频| 亚洲天堂精品视频| 涩视频在线观看| 国产精品一二| 亚洲va韩国va欧美va精四季| 亚洲欧美在线综合| 欧美俄罗斯性视频| 色婷婷av一区二区三| 色欧美片视频在线观看在线视频| 国产精品综合激情| 国产成人在线色| 欧美在线观看www| 成人三级视频| 翡翠波斯猫1977年美国| 在线观看欧美日韩电影| 久久精品2019中文字幕| 丰满人妻一区二区三区四区53| 狠狠色香婷婷久久亚洲精品| 永久免费观看片现看| 福利电影一区二区| 91av俱乐部| 欧美黄色一区| 日韩av一区二区三区美女毛片| 95精品视频| 欧美影院在线播放| 曰本三级在线| 亚洲天堂第二页| 亚洲精品久久久久久无码色欲四季 | 欧美福利视频一区二区| 国产精品福利一区| 老熟妇精品一区二区三区| 日本va欧美va欧美va精品| 日韩欧美一级在线| 日韩aaaa| 久久精品一二三区| 国产在线不卡一区二区三区| 秋霞午夜一区二区| 亚洲91av| 中文字幕一区电影| 性插视频在线观看| 777午夜精品免费视频| 欧美国产成人精品一区二区三区| 亚洲激情自拍偷拍| 免费一级特黄3大片视频| 成人午夜免费av| 伊人色在线视频| 久久精品日产第一区二区| 天堂а√在线中文在线| re久久精品视频| 美乳视频一区二区| 大陆精大陆国产国语精品| 国产成人精品在线播放| av今日在线| 欧美成人免费在线观看| 成人在线免费观看| 精品小视频在线| 天堂av资源在线| 精品精品欲导航| 精品二区在线观看| 91精品国产免费| 中文字幕在线日亚洲9| 色综合天天综合| 四虎成人永久免费视频| 无码av免费一区二区三区试看| 欧美三级日本三级| 亚洲柠檬福利资源导航| 中文字幕乱码av| 中文字幕在线一区免费| 最新黄色av网址| 国产精品乱码人人做人人爱 | 精品国产乱码久久久久久婷婷 | 福利视频在线| 日韩亚洲精品视频| 欧美极品另类| 精品国产一区二区三区久久久狼 | 免费观看久久av| 免费久久久一本精品久久区| 色先锋久久影院av| 精品视频在线观看| 亚州精品视频| 日韩和欧美的一区二区| 第一sis亚洲原创| 亚洲国产精品一区二区第一页 | 欧美另类在线播放| 日本高清成人vr专区| 欧美日韩成人免费| 啦啦啦中文在线观看日本| 欧美精品九九久久| 91豆花视频在线播放| 欧美性视频精品| 亚洲欧美小说色综合小说一区| 日韩av免费在线看| 成人国产精品一区二区免费麻豆| 国产精品美女久久久久av超清| 国产网站在线| 国产成人精品在线视频| 欧洲亚洲精品| 99国产高清| 亚洲人成网www| 午夜精品一区二区在线观看的| 99精品视频在线观看播放| 国产一级黄色录像片| 1024日韩| 国产精品拍拍拍| 国产一区二区视频在线| 麻豆精品国产传媒av| 久久蜜臀精品av| 亚洲精品久久久久久国| 亚洲午夜私人影院| 亚洲精品成人在线视频| 欧美人xxxx| 黄色av免费观看| 在线视频日韩精品| 肉肉视频在线观看| 日本免费久久高清视频| 亚洲精品aa| 久久精品日韩精品| 香蕉av一区二区| 成人在线免费在线观看| 久久精品国产99国产精品| 三级视频网站在线观看| 中文字幕av在线一区二区三区| 欧美交换国产一区内射| 一本大道av一区二区在线播放| 97人妻精品一区二区三区视频 | 国产三级国产精品| 国产精品国产三级国产普通话蜜臀 | 麻豆av免费看| 国产亚洲精品福利| 久青草视频在线观看| 日本精品免费观看高清观看| 国产免费无遮挡| 亚洲欧洲一区二区三区在线观看| caoporn免费在线| 国产91色在线播放| 国产福利一区二区精品秒拍| 亚洲一区二区三区精品在线观看| 99视频在线精品国自产拍免费观看| 三级av免费观看| 97超碰欧美中文字幕| 亚洲熟女www一区二区三区| 在线亚洲精品福利网址导航| 亚洲精品一区二区三区新线路| 最新69国产成人精品视频免费 | 91视频8mav| 精品国产一区二区三区噜噜噜| 精品久久久久久无码中文野结衣| 久久99国产精品尤物| av中文字幕免费观看| 亚洲综合另类小说| 国产又粗又长视频| 一区二区三区黄色| 国产拍在线视频| 国产一区二区视频在线免费观看| 9191国语精品高清在线| 亚洲这里只有精品| 久久亚洲综合色一区二区三区| 日本天堂在线视频| 日韩欧美成人一区二区| 黄在线免费观看| 国产精品视频yy9099| 欧美日韩亚洲在线观看| 99爱视频在线| 久久亚洲一区二区三区明星换脸| 国产在线视频99| 日韩欧美自拍偷拍| av中文字幕在线播放| 成人a在线观看| 日本久久黄色| 亚洲综合欧美激情| 国产精品久久免费看| 在线观看国产区| 中文精品99久久国产香蕉| 亚洲第一会所| 亚洲v欧美v另类v综合v日韩v| 日韩av在线播放中文字幕| mm131丰满少妇人体欣赏图| 一本大道av一区二区在线播放| 好男人免费精品视频| 国产精品福利在线观看| 欧美色女视频| www.激情小说.com| 国产精品日韩成人| 亚洲天堂久久久久| 日韩一区二区福利| 成人在线视频区| 欧美视频在线第一页| 成人禁用看黄a在线| 天天爽夜夜爽夜夜爽精品| 日韩精品中文字幕在线| 免费观看欧美大片| 欧美深深色噜噜狠狠yyy| 久久激情五月激情| 欧美又粗又大又长| 亚洲成人久久久| 亚洲最新无码中文字幕久久| 色阁综合av| 国产伦精一区二区三区| 精品无码人妻一区二区三| 亚洲国产一区自拍| 日本欧美不卡| 天天做天天爱天天高潮| 成人亚洲精品久久久久软件| 久久青青草原亚洲av无码麻豆 | 日韩精品一区国产麻豆| 国产黄色大片在线观看| 欧美精品二区三区四区免费看视频 | 8050国产精品久久久久久| 宅男在线一区| 午夜精品久久久久久久99热影院| 一区二区在线看| 欧美日韩激情视频一区二区三区| 国产一区二中文字幕在线看| 欧美精品麻豆| 人妻av无码一区二区三区| 欧美一区二区人人喊爽| 中国色在线日|韩| 一区二区在线高清视频| 北条麻妃国产九九精品视频| 欧美超碰在线观看| 色偷偷av一区二区三区乱| 国产日韩三级| 亚洲天堂av一区二区| 亚洲大片在线观看| 日韩精品毛片| 美女精品国产| 国产酒店精品激情| 天天射天天干天天| 久久久久久久影院| 久久精品国产68国产精品亚洲| 日本黄色录像片| 337p亚洲精品色噜噜噜|