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

世界上最簡單的無鎖哈希表

開發(fā) 后端
無鎖哈希表(Lock-Free Hash Table )可以提高多線程下的性能表現(xiàn),但是因為實現(xiàn)一個無鎖哈希表本身的復(fù)雜度不小。

無鎖哈希表(Lock-Free Hash Table )可以提高多線程下的性能表現(xiàn),但是因為實現(xiàn)一個無鎖哈希表本身的復(fù)雜度不小。(ps:真正的復(fù)雜在于出錯之后的調(diào)試,因為多線程下的調(diào)試本身就很復(fù)雜,引入無鎖數(shù)據(jù)結(jié)構(gòu)之后,傳統(tǒng)的看堆棧信息和打印log都基本上沒有意義了。堆棧中的數(shù)據(jù)可能被并發(fā)訪問破壞,而打印log本身可能會改變程序執(zhí)行時對數(shù)據(jù)訪問的時序。一個比較可行的做法是實現(xiàn)一個無鎖版本和一個傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)+鎖的版本,出錯后通過替換來定位是無鎖數(shù)據(jù)結(jié)構(gòu)本身的bug還是其他邏輯的 bug)。所以對一個項目而言,無鎖數(shù)據(jù)結(jié)構(gòu)基本上是一把雙刃劍。

據(jù)我所知,***個用于實際開發(fā)的無鎖哈希表是 Dr. Cliff Click 為Java而寫。在2007年他發(fā)布了這個無鎖哈希表的源碼并且在google做了關(guān)于它的報告(視頻)。我承認,在我***次看這個報告的時候,我對它的大部分內(nèi)容都不理解。Dr. Cliff Click是這個領(lǐng)域的先驅(qū)。(Maged M. Michael 在IBM做了大量關(guān)于無鎖數(shù)據(jù)結(jié)構(gòu)的研究。這個是2002年的一篇論文,關(guān)于哈希表,http://www.research.ibm.com/people/m/michael/spaa-2002.pdf)

很幸運,6年時間足夠我理解Dr. Cliff Click所做的研究。事實上,你不必做一些前沿的探索,去實現(xiàn)一個***的無鎖哈希表。在這里我將分享我實現(xiàn)的這個版本。我相信有使用C++進行多線程開發(fā)經(jīng)驗的程序員,可以通過這篇博客梳理以前的經(jīng)驗,并且完全理解它。

約束

作為一個程序員,平時我們實現(xiàn)一個數(shù)據(jù)結(jié)構(gòu)會本能的盡可能通用。這不是一件壞事,但是當我們把通用當作一個更重要的目標時,它可能會阻礙我們。在這里我走向另一個極端,實現(xiàn)了一個盡可能簡單的,僅用于一些特殊環(huán)境的哈希表,下面是它的設(shè)計約束:

  1. table 只接受類型為32位整數(shù)的key和value

  2. 所有key必須非零

  3. 所有的value必須非零

  4. table的***數(shù)目固定且必須是2的冪

  5. 唯一可用的操作是SetItem和getItem

  6. 有沒有刪除操作

當然你掌握了這種算法實現(xiàn)機制之后,可以在此基礎(chǔ)上進行擴展,而不受這些限制的約束。(rehash,刪除和遍歷,這些都會增加復(fù)雜度,而且有引發(fā)新的ABA問題的可能性)。

實現(xiàn)方法

有很多種方法來實現(xiàn)一個哈希表。這里我選擇了用我以前的帖子中描述的ArrayOfItems類做一個簡單的修改,(前置擴展閱讀) A Lock-Free… Linear Search?

這個哈希表被我稱為HashTable1,和ArrayOfItems一樣,它采用了一個巨大的key-value pairs數(shù)組實現(xiàn)。

  1. struct Entry  
  2. {  
  3.     mint_atomic32_t key;  
  4.     mint_atomic32_t value;  
  5. };  
  6. Entry *m_entries;  

在hashtable1中,僅僅只有數(shù)組本身而沒有使用鏈接來處理碰撞。數(shù)組全部初始化為0,key為0時對應(yīng)的節(jié)點為空。插入時,會通過線性搜索找到一個空節(jié)點。

ArrayOfItems和HashTable1之間唯一的區(qū)別是,ArrayOfItems是從0開始做線性搜索,而HashTable1使用MurmurHash3′s integer finalizer算法得到一個hash值,然后以這個hash值為起點開始搜索()

  1. inline static uint32_t integerHash(uint32_t h) 
  2.     h ^= h >> 16; 
  3.     h *= 0x85ebca6b; 
  4.     h ^= h >> 13; 
  5.     h *= 0xc2b2ae35; 
  6.     h ^= h >> 16; 
  7.     return h; 

當我們使用相同的key做參數(shù)調(diào)用SetItem或GetItem方法時,它會在相同的index開始做線性搜索,而使用不同的key時,會在不同的 index開始搜索。通過這種方式,可以提高查找到對應(yīng)key所在節(jié)點的速度,并且保證多線程并發(fā)調(diào)用SetItem或GetItem的安全性。

HashTable1采用環(huán)形的搜索,當搜索到尾部時,會從數(shù)組頭部開始繼續(xù)搜索。在數(shù)組滿之前,每次搜索都可以保證返回對應(yīng)key所在的節(jié)點,或者是一個空節(jié)點。這種技巧被稱為open addressing with linear probing,,在我看來這無疑是對lock-free最友好的hash算法,事實上在Dr. Cliff Click為java實現(xiàn)的哈希表中也使用了相同的技巧。

 

代碼

SetItem的實現(xiàn)。它會掃描整個數(shù)組并且將value保存在與key對應(yīng)的節(jié)點或空節(jié)點。這段代碼與ArrayOfItems:: SetItem幾乎相同,唯一的區(qū)別是計算了hash值并且按位與,保證index在數(shù)組邊界內(nèi)。

  1. void HashTable1::SetItem(uint32_t key, uint32_t value) 
  2.     for (uint32_t idx = integerHash(key);; idx++) 
  3.     { 
  4.         idx &= m_arraySize - 1; 
  5.   
  6.         uint32_t prevKey = mint_compare_exchange_strong_32_relaxed(&m_entries[idx].key, 0, key); 
  7.         if ((prevKey == 0) || (prevKey == key)) 
  8.         { 
  9.             mint_store_32_relaxed(&m_entries[idx].value, value); 
  10.             return
  11.         } 
  12.     } 

GetItem的實現(xiàn)也同樣和ArrayOfItems::GetItem有類似的改變。

  1. uint32_t HashTable1::GetItem(uint32_t key) 
  2.     for (uint32_t idx = integerHash(key);; idx++) 
  3.     { 
  4.         idx &= m_arraySize - 1; 
  5.   
  6.         uint32_t probedKey = mint_load_32_relaxed(&m_entries[idx].key); 
  7.         if (probedKey == key) 
  8.             return mint_load_32_relaxed(&m_entries[idx].value); 
  9.         if (probedKey == 0) 
  10.             return 0;          
  11.     } 

上述功能都是線程安全的,無鎖的ArrayOfItems出于同樣的原因:對數(shù)組的元素采用原子操作,使用cas操作修改節(jié)點的key值(使用內(nèi)存柵障保證線程安全,事實上就是重新排列了內(nèi)存訪問指令的執(zhí)行次序)。在上一篇中有更詳細的討論。

***,就像在以前的帖子中,我們可以優(yōu)化SetItem,***次判斷是否可以避免使用CAS操作。如下這種優(yōu)化,可以使示例應(yīng)用程序運行快大約20%。

  1. void HashTable1::SetItem(uint32_t key, uint32_t value) 
  2.     for (uint32_t idx = integerHash(key);; idx++) 
  3.     { 
  4.         idx &= m_arraySize - 1; 
  5.   
  6.         // Load the key that was there. 
  7.         uint32_t probedKey = mint_load_32_relaxed(&m_entries[idx].key); 
  8.         if (probedKey != key) 
  9.         { 
  10.             // The entry was either free, or contains another key. 
  11.             if (probedKey != 0) 
  12.                 continue;           // Usually, it contains another key. Keep probing. 
  13.                   
  14.             // The entry was free. Now let's try to take it using a CAS. 
  15.             uint32_t prevKey = mint_compare_exchange_strong_32_relaxed(&m_entries[idx].key, 0, key); 
  16.             if ((prevKey != 0) && (prevKey != key)) 
  17.                 continue;       // Another thread just stole it from underneath us. 
  18.   
  19.             // Either we just added the key, or another thread did. 
  20.         } 
  21.           
  22.         // Store the value in this array entry. 
  23.         mint_store_32_relaxed(&m_entries[idx].value, value); 
  24.         return
  25.     } 

這個就是幾乎可以精簡的最簡單的無鎖哈希表,這里是它的代碼鏈接: source and header。

一個忠告:與ArrayOfItems一樣,HashTable1上的所有操作都采用了relaxed memory ordering做限制。因此,當在HashTable1中設(shè)置標記,共享一些數(shù)據(jù)供其他線程訪問時,必須事先插入release fence。同樣訪問數(shù)據(jù)的線程在調(diào)用GetItem前需要acquire fence。

  1. // Shared variables 
  2. char message[256]; 
  3. HashTable1 collection; 
  4.   
  5. void PublishMessage() 
  6.     // Write to shared memory non-atomically. 
  7.     strcpy(message, "I pity the fool!"); 
  8.       
  9.     // Release fence: The only way to safely pass non-atomic data between threads using Mintomic. 
  10.     mint_thread_fence_release(); 
  11.       
  12.     // Set a flag to indicate to other threads that the message is ready. 
  13.     collection.SetItem(SHARED_FLAG_KEY, 1) 

簡單樣例

對HashTable1的一些測試對比,在上一篇帖子我做個一個類似的測試。它交替執(zhí)行2個測試:一個采用2個線程,每個線程交替插入6000個key不同的item,另一個每個線程交替插入12000個key相同但是value不同的item。

 

代碼放在GitHub上,你可以自己編譯和執(zhí)行。編譯說明見README.md

在HashTable1沒有滿時—少于80%時—HashTable1表現(xiàn)的很好,我也許應(yīng)該為這個說法做一些基準測試。但是以以往的常規(guī)的哈希表 作為基準,我敢肯定你很難實現(xiàn)出性能更好的無鎖哈希表。這似乎奇怪,HashTable1基于ArrayOfItems,看起來會很低效。當然,任何哈希 表中,總會有發(fā)生碰撞的風(fēng)險,而降階到ArrayOfItems的風(fēng)險并不為0。但是使用一個足夠大的數(shù)組和類似MurmurHash3這樣的hash函 數(shù),這種情況出現(xiàn)的很少。

在實際的工作中,我已經(jīng)使用了一個和這個類似的hash-table。這是一個游戲開發(fā)的項目,我的工作是解決使用內(nèi)存分配跟蹤工具(memory tracker)之后對一個讀寫鎖激烈的爭用。遷移到無鎖哈希表的過程非常棘手。相對HashTable1需要更復(fù)雜的數(shù)據(jù)結(jié)構(gòu),key和value都是 指針而不是簡單的整數(shù)。因此有必要在哈希表內(nèi)部插入memory ordering。最終在此模式下運行:最壞情況下游戲的幀率提高了4-10 FPS。

原文鏈接:http://preshing.com/20130605/the-worlds-simplest-lock-free-hash-table

譯文鏈接:http://blog.jobbole.com/39186/

責(zé)任編輯:陳四芳 來源: 伯樂在線
相關(guān)推薦

2018-11-06 12:22:18

排序算法代碼

2023-07-31 08:59:46

軟件FossilSQLite

2014-09-05 09:08:58

2010-09-02 13:21:46

2013-04-24 09:57:08

Excel微軟

2025-03-27 00:45:00

2025-03-13 00:35:00

2015-11-25 09:41:05

數(shù)據(jù)中心

2014-02-11 09:58:19

環(huán)保數(shù)據(jù)中心泰坦

2013-07-09 10:11:41

程序設(shè)計大賽程序員

2025-10-10 03:00:00

2024-10-14 10:58:13

2025-11-11 02:55:00

OracleJavaScriptES5

2024-01-11 09:11:08

數(shù)據(jù)庫SQLite管理

2025-01-09 11:10:15

2024-07-15 09:06:51

2018-12-04 15:46:53

編程語言Python

2013-05-08 09:38:28

InteropNetSDN網(wǎng)絡(luò)設(shè)備供應(yīng)商

2018-07-19 19:07:33

語言編程語言程序

2009-09-11 10:41:36

數(shù)據(jù)中心
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲欧美偷拍卡通变态| 蜜臀av一区二区在线免费观看| 日韩精品一区二区三区老鸭窝| 日本香蕉视频在线观看| yellow视频在线观看一区二区| 国产中文字幕二区| 麻豆国产在线播放| 久久99久久99小草精品免视看| 免费97视频在线精品国自产拍| 久久性爱视频网站| 国产一区二区三区影视| 一区二区三区自拍| 欧美日韩喷水| 精品国产乱码一区二区三| 一区二区三区国产在线| 色久欧美在线视频观看| 波多野结衣加勒比| 四虎精品永久免费| 亚洲一区二区三区四区不卡| 少妇精品久久久久久久久久| 亚洲国产精品成人久久蜜臀| 日韩av不卡在线观看| 欧美激情视频网站| 萌白酱视频在线| 日韩系列在线| 欧美一级一区二区| 美女一区二区三区视频| 91在线三级| 国产精品成人免费在线| 欧美精品免费观看二区| 高h放荡受浪受bl| 极品少妇一区二区三区精品视频| 欧美在线观看网站| 国产精品99无码一区二区| 天天做天天爱天天爽综合网| 亚洲图片欧洲图片av| 亚洲最大免费视频| 中文久久电影小说| 欧美欧美欧美欧美| 午夜免费精品视频| wwww在线观看免费视频| 亚洲精品菠萝久久久久久久| 9999在线观看| 1769视频在线播放免费观看| 国产亚洲女人久久久久毛片| 久久亚洲国产精品日日av夜夜| 亚洲精品久久久久久久久久| 韩国理伦片一区二区三区在线播放| 国产精品99久久久久久www| 久久99精品波多结衣一区| 一区二区视频欧美| 国外成人在线视频| 182在线观看视频| 97在线精品| 中文字幕日韩高清| 日本美女黄色一级片| 色喇叭免费久久综合网| 在线电影中文日韩| 成人免费视频入口| 国产精品久久久乱弄| 久久国产一区二区三区| 婷婷激情四射网| 亚洲最新色图| 久久久久久久久久久网站| 国产亚洲精品久久久久久打不开 | 快射av在线播放一区| 国产精品国产三级国产aⅴ中文| 视频一区视频二区视频三区视频四区国产 | 国产在线视频精品一区| 亚洲曰本av电影| 亚洲第一成年人网站| 东方aⅴ免费观看久久av| 国产精品中出一区二区三区| 五月婷婷丁香花| 91在线你懂得| 亚洲精品国产精品久久| 男人资源在线播放| 亚洲一区二区五区| 欧美a v在线播放| 欧美日韩免费观看视频| 欧美日本国产视频| 国产精品99久久久精品无码| 欧美a大片欧美片| 国产午夜精品一区理论片飘花 | 成人毛片免费看| 久久久国产一区二区| 国产亚洲成人精品| 视频一区在线播放| 91香蕉嫩草影院入口| 东京干手机福利视频| 久久在线观看免费| 亚洲 国产 欧美一区| √天堂8在线网| 岛国视频午夜一区免费在线观看| 手机看片福利日韩| 欧洲精品99毛片免费高清观看 | 成人午夜在线视频一区| 欧美性受xxxx狂喷水| 日本一区二区三级电影在线观看| 手机成人av在线| 午夜激情在线播放| 555夜色666亚洲国产免| 亚洲精品乱码久久久久久不卡| 成人高清电影网站| 韩剧1988免费观看全集| 亚洲怡红院av| 97久久超碰精品国产| 中文字幕在线亚洲三区| 中文字幕影音在线| 欧美大片一区二区三区| 少妇愉情理伦三级| 亚洲伦伦在线| 亚洲aa在线观看| 91短视频版在线观看www免费| 亚洲成人在线免费| 日本一二区免费| 九色成人国产蝌蚪91| 欧美寡妇偷汉性猛交| 中文有码在线播放| 26uuu亚洲| 国产美女永久无遮挡| 黑人一区二区三区| 亚洲男人天堂古典| 国产手机在线视频| 国产很黄免费观看久久| 亚洲欧洲久久| 成人看片网页| 国产丝袜视频一区| 免费观看一区二区三区毛片| 国产成人精品影院| 久久久国产精华液999999| 裤袜国产欧美精品一区| 日韩激情片免费| 日本熟妇毛耸耸xxxxxx| 国产剧情一区二区三区| 亚洲在线视频一区二区| 日韩av免费| 亚洲精品日韩丝袜精品| 久久不卡免费视频| 成人av网址在线| 欧美黄色免费网址| 久久视频社区| 欧美精品情趣视频| 99久久精品国产一区二区成人| 国产精品午夜在线观看| 91淫黄看大片| 欧美综合久久| 国产精品一区二区久久国产| 97视频在线观看网站| 91激情在线视频| 亚洲黄色小说视频| 视频一区二区中文字幕| 色噜噜色狠狠狠狠狠综合色一| 一根才成人网| 中国china体内裑精亚洲片| 色老头在线视频| 中文字幕乱码一区二区免费| 亚洲成人av免费看| 我不卡伦不卡影院| 91在线|亚洲| 亚洲妇熟xxxx妇色黄| 欧美大片免费久久精品三p| 国产成人啪精品午夜在线观看| 成人a区在线观看| 9久久9毛片又大又硬又粗| 天堂网av成人| 国产精品久久久av| 老司机av在线免费看| 日韩欧美国产精品| 日韩精品――中文字幕| 国产精品久久久久久久久久东京 | 91精品中文在线| 国产激情在线| 精品国产乱码久久久久久久久| 久久久久97国产| 99久久久久久| 国产免费人做人爱午夜视频| 波多野结衣一区| 亚洲自拍小视频| 麻豆视频在线看| 一区二区三区精品99久久| 91国在线视频| 亚洲福中文字幕伊人影院| 久久国产精品无码一级毛片| 日韩成人一区二区三区在线观看| 天天爱天天做天天操| 乱中年女人伦av一区二区| 国产成人91久久精品| 黄色动漫在线观看| 日韩国产在线播放| 91精品国自产| 欧美日韩日本国产| 久草视频手机在线| 91视频com| 制服丝袜中文字幕第一页 | 国内外成人免费激情在线视频 | 精品国产自在精品国产浪潮| 亚洲精品无码专区| 欧美视频一区在线| 久热这里只有精品在线| 国产欧美精品一区二区三区四区| 色婷婷综合在线观看| 香蕉精品999视频一区二区| 亚洲欧美日韩精品在线| 加勒比久久高清| 国产一区欧美二区三区| 蜜桃av在线播放| 欧美成人免费在线观看| 国产私人尤物无码不卡| 精品国产91洋老外米糕| 一级片在线观看视频| 欧美性猛交xxxx免费看| 色婷婷在线视频观看| 国产欧美综合在线观看第十页| 亚洲图片欧美另类| 黑人巨大精品欧美一区| 久久综合久久色| 亚洲经典三级| 国产亚洲精品久久久久久久| 日韩电影免费在线观看| 蜜桃传媒视频第一区入口在线看| 欧美一区一区| 国产中文字幕91| 不卡一二三区| 欧美激情影音先锋| av在线麻豆| xxx成人少妇69| 国产理论电影在线观看| 精品一区二区三区电影| 黑人乱码一区二区三区av| 欧美一区二区三区视频| 一区二区美女视频| 欧美丝袜自拍制服另类| 欧美一区免费看| 欧美视频中文在线看| 国产精品7777777| 亚洲伊人色欲综合网| 全程偷拍露脸中年夫妇| 亚洲欧美偷拍卡通变态| 日本中文在线视频| 《视频一区视频二区| 刘亦菲国产毛片bd| 中文字幕av一区 二区| 亚洲最大成人综合网| 国产亚洲va综合人人澡精品 | 伊人春色精品| 麻豆av一区二区| 亚洲区小说区| 欧美午夜精品久久久久久蜜| 欧美女优在线视频| 日本成人看片网址| 视频一区中文| 婷婷五月色综合| 色综合咪咪久久网| 91制片厂免费观看| 国产一区欧美| 成 年 人 黄 色 大 片大 全| 亚洲人成久久| 能在线观看的av| 日韩制服丝袜av| 亚洲一级片网站| 国产一区三区三区| 国偷自产av一区二区三区麻豆| 国产99久久精品| 182在线视频| 久久久久久免费| 欧美xxxx精品| 亚洲乱码精品一二三四区日韩在线| 久久久久亚洲av无码专区体验| 亚洲影视资源网| 探花视频在线观看| 欧美性猛交xxxxxxxx| 国产精品久久综合青草亚洲AV| 欧美一二三四在线| 天天射,天天干| 亚洲午夜av电影| 国产1区在线| 97精品国产97久久久久久免费 | 日本高清视频在线播放| 欧美刺激性大交免费视频| 成人爽a毛片免费啪啪动漫| 55夜色66夜色国产精品视频| 亚州一区二区三区| 亚洲综合最新在线| 日韩影视高清在线观看| 亚洲精品中文字幕乱码三区不卡| 永久91嫩草亚洲精品人人| 免费看国产曰批40分钟| 麻豆成人久久精品二区三区小说| 在线观看视频在线观看| 99精品视频在线免费观看| 人成免费在线视频| 夜夜爽夜夜爽精品视频| 进去里视频在线观看| 欧美成人高清电影在线| 免费在线观看污视频| 萌白酱国产一区二区| 欧美第一视频| 国产91一区二区三区| 欧美另类69xxxxx| 人妻av中文系列| 久久精品国产一区二区三| 插我舔内射18免费视频| 国产精品国产三级国产a | 欧美日韩一区二区在线视频| 亚洲黄色小说网| 中文字幕亚洲一区二区三区五十路| 国产精品一品| 国产一区在线播放| 亚洲人成网77777色在线播放| 亚洲欧美日韩不卡| 丝袜脚交一区二区| xxxx黄色片| 一区二区三区中文字幕在线观看| 九九热最新视频| 亚洲精品动漫久久久久| 怡红院av在线| 成人av资源在线播放| 蜜臀久久99精品久久一区二区| 精品无码av无码免费专区| 美女爽到高潮91| 亚欧洲乱码视频| 激情懂色av一区av二区av| www.蜜桃av.com| 欧美成人sm免费视频| 日韩成人综合网站| 日本一区二区三区视频免费看| 亚洲免费大片| 精品人妻在线视频| 亚洲精品成a人| av网站在线免费看| 久久精品国产亚洲精品2020| 久久福利在线| 无遮挡亚洲一区| 日韩高清一区在线| 亚洲做受高潮无遮挡| 五月婷婷综合网| 欧美一区二区三区黄片 | 在线观看福利电影| 国产专区一区二区| 亚洲国产高清一区二区三区| 好吊操视频这里只有精品| 亚洲精品亚洲人成人网| 97人妻精品一区二区三区软件| 日日摸夜夜添一区| 欧美成人黄色| 亚洲第一精品区| 国产一二三精品| 国产高潮国产高潮久久久91| 欧美一区二区三区在线看| 污网站在线免费看| 国产精品国产三级国产专区53| 国内精品99| 国模无码视频一区| 五月天婷婷综合| 青青草在线免费视频| 国产精国产精品| 成人激情诱惑| 婷婷激情综合五月天| 亚洲宅男天堂在线观看无病毒| 亚洲精品成av人片天堂无码| 国内精品久久久久影院优 | 粉嫩在线一区二区三区视频| 国产午夜精品无码| 亚洲精品一区二区网址| 在线成人视屏| 亚洲第一精品区| 成人精品免费看| 亚洲色成人www永久网站| 久久精品国产亚洲精品2020| 超碰cao国产精品一区二区| 北条麻妃在线视频观看| 国产精品美女久久久久aⅴ| 国产白浆在线观看| 51午夜精品视频| 久久精品国产68国产精品亚洲| wwwxxxx在线观看| 色噜噜狠狠色综合欧洲selulu| 欧美黑人激情| 激情五月综合色婷婷一区二区 | 亚洲va电影大全| 99国产精品99久久久久久粉嫩| 亚洲一区二区自偷自拍| 欧美一区二区私人影院日本| 蜜桃视频动漫在线播放| 亚洲一区尤物| 99久久99久久免费精品蜜臀| 亚洲网站免费观看| 韩国一区二区电影| 欧美岛国激情| 无码一区二区精品| 欧美日韩精品欧美日韩精品一| 国精一区二区三区| 午夜午夜精品一区二区三区文| 国产成人免费视频网站 | 亚洲韩国欧洲国产日产av| 成人精品国产| 天堂资源在线亚洲视频| 国产成人在线电影| 免费av网站在线|