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

關于多線程同步的一切:偽共享

開發
導致f()性能底下的元兇是偽共享(false sharing),那什么是偽共享?

```c++
const size_t shm_size = 16*1024*1024; //16M
static char shm[shm_size];
std::atomic<size_t> shm_offset{0};


void f() {
for (;;) {
auto off = shm_offset.fetch_add(sizeof(long));
if (off >= shm_size) break;
*(long*)(shm + off) = off;
}
}
```

考察上面的程序,shm是一塊16M字節的內存,我測試機器的L3 Cache是32M,所以挑選16M這個值確保shm數組在Cache里能存放得下。

圖片

f()函數在循環里,把shm視為long類型的數組,依次給每個元素賦值,shm_offset用于記錄偏移位置,shm_offset.fetch_add(sizeof(long))原子性的增加shm_offset的值(因為x86_64系統上long的長度為8,所以shm_offset每次增加8字節),并返回增加前的值,對shm上long數組的每個元素賦值后,結束循環從函數返回。

因為shm_offset是atomic類型變量,所以多線程調用f()依然能正常工作,雖然多個線程會競爭shm_offset,但每個線程會排他性的對各long元素賦值,多線程并行會加快對shm的賦值操作。

我們加上多線程調用,代碼如下:

```c++
std::atomic<size_t> step{0};


const int THREAD_NUM = 2;


void work_thread() {
const int N = 10;
for (int n = 1; n <= N; ++n) {
f();
++step;
while (step.load() < n * THREAD_NUM) {}
shm_offset = 0;
}
}


int main() {
std::thread threads[THREAD_NUM];
for (int i = 0; i < THREAD_NUM; ++i) {
threads[i] = std::move(std::thread(work_thread));
}
for (int i = 0; i < THREAD_NUM; ++i) {
threads[i].join();
}
return 0;
}
```

  • main函數里啟動2個工作線程work_thread
  • 工作線程對shm共計賦值N(10)輪,后面的每一輪會訪問Cache里的shm數據,step用于work_thread之間每一輪的同步
  • 工作線程調用完f()后會增加step,等2個工作線程都調用完之后,step的值增加到n * THREAD_NUM后,while()循環結束,重置shm_offset,重新開始新一輪對shm的賦值

編譯后執行上面的程序,產生如下的結果:

```
time ./a.out

real 0m3.406s
user 0m6.740s
sys 0m0.040s
```

time命令用于時間測量,在a.out程序運行完成,會打印耗時,real行顯式耗時3.4秒。

改進版f_fast

我們稍微修改一下f函數,改進版f函數取名f_fast:

```c++
void f_fast() {
for (;;) {
const long inner_loop = 16;
auto off = shm_offset.fetch_add(sizeof(long) * inner_loop);
for (long j = 0; j < inner_loop; ++j) {
if (off >= shm_size) return;
*(long*)(shm + off) = j;
off += sizeof(long);
}
}
}
```

for循環里,shm_offset不再是每次增加8字節(sizeof(long)),而是8*16=128字節,然后在內層的循環里,依次對16個long連續元素賦值,然后下一輪循環又再次增加128字節,直到完成對整個shm的賦值。

編譯后重新執行程序,結果顯示耗時降低到0.06秒,對比前一種耗時3.4秒,f_fast性能大幅提升。

```
time ./a.out

real 0m0.062s
user 0m0.110s
sys 0m0.012s
```

f和f_fast的行為差異

shm數組總共有2M個long元素,因為16M / sizeof(long) => 2M,

1. f()函數行為邏輯

線程1和線程2的work_thread里會交錯地對shm元素賦值,shm的2M個long元素,會順序的一個接一個的派給2個線程去賦值。

例如:

  • 可能元素1由線程1賦值,元素2由線程2賦值,然后元素3和元素4由線程1賦值,然后元素5由線程2賦值...
  • 每次派元素的時候,shm_offset都會atomic的增加8字節,所以不會出現2個線程給1個元素賦值的情況

2. f_fast()函數行為邏輯

  • 每次派元素的時候,shm_offset原子性的增加128字節(16個元素)
  • 這16個字節作為一個整體,派給線程1或者線程2;雖然線程1和線程2還是會交錯的操作shm元素,但是以16個元素(128字節)為單元,這16個連續的元素不會被分派到不同線程
  • 一次派發的16個元素,會在內部循環里被一個接著一個的賦值,在一個線程里執行

為什么f_fast更快?

第一眼感覺是f_fast()里shm_offset.fetch_add()調用頻次降低到了原來的1/16,我們有理由懷疑是原子變量的競爭減少導致程序執行速度加快。

為了驗證,讓我們在內層的循環里加一個原子變量test的fetch_add,test原子變量的競爭會像f()函數里shm_offset.fetch_add()一樣被激烈競爭,修改后的f_fast代碼變成下面這樣:

```c++
void f_fast() {
for (;;) {
const long inner_loop = 16;
auto off = shm_offset.fetch_add(sizeof(long) * inner_loop);
for (long j = 0; j < inner_loop; ++j) {
test.fetch_add(1);
if (off >= shm_size) return;
*(long*)(shm + off) = j;
off += sizeof(long);
}
}
}
```

為了避免test.fetch_add(1)的調用被編譯器優化掉,我們在main函數的最后把test的值打印出來。

編譯后測試一下,結果顯示:執行時間只是稍微增加到`real 0m0.326s`。所以,很顯然,并不是atomic的調用頻次減少導致性能飆升。

我們重新審視f()循環里的邏輯:f()循環里的操作很簡單:原子增加、判斷、賦值。

會不會是賦值太慢?

我們把f()的里賦值注釋掉,再測試一下,發現它的速度得到了很大提升,看來是`*(long*)(shm + off) = off;`這一行代碼執行慢,但這明明只是一行賦值。

我們把它反匯編來看,它只是一個mov指令,源操作數是寄存器,目標操作數是內存地址,從寄存器拷貝數據到一個內存地址,而這個內存數據應該被cache住了,為什么會這么慢呢?

答案

現在揭曉原因,導致f()性能底下的元兇是偽共享(false sharing),那什么是偽共享?

要說清這個問題,還得聯系CPU的架構,以及CPU怎么訪問數據,我們回顧一下關于多核Cache結構:

圖片

背景知識

我們知道現代CPU可以有多個核,每個核有自己的L1-L2緩存,L1又區分數據緩存(L1-DCache)和指令緩存(L1-ICache),L2不區分數據和指令Cache,而L3跨核共享,L3通過內存總線連接到內存,內存被所有CPU所有Core共享。

CPU訪問L1 Cache的速度大約是訪問內存的100倍,Cache作為CPU與內存之間的緩存,減少CPU對內存的訪問頻率。

從內存加載數據到Cache的時候,是以Cache Line為長度單位的,Cache Line的長度通常是64字節。

所以,那怕只讀一個字節,但是包含該字節的整個Cache Line都會被加載到緩存,同樣,如果修改一個字節,那么最終也會導致整個Cache Line被沖刷到內存。

如果一塊內存數據被多個線程訪問,假設多個線程在多個Core上并行執行,那么它便會被加載到多個Core的的Local Cache中;這些線程在哪個Core上運行,就會被加載到哪個Core的Local Cache中,所以,內存中的一個數據,在不同Core的Cache里會同時存在多份拷貝。

如果我們修改了Core1緩存里的某個數據,則該數據所在的Cache Line的狀態需要同步給其他Core的緩存,Core之間可以通過核間消息同步狀態,比如通過發送Invalidate消息給其他核,接收到該消息的核會把對應Cache Line置為無效,然后重新從內存里加載最新數據。

被加載到多個Core緩存中的同一Cache Line,會被標記為共享(Shared)狀態,對共享狀態的緩存行進行修改,需要先獲取緩存行的修改權(獨占),MESI協議用來保證多核緩存的一致性,更多的細節可以參考MESI資料。

示例分析

現在來看看我們的程序。

假設線程1運行在Core1,線程2運行在Core2。

圖片

因為shm被線程1和線程2這兩個線程并發訪問,所以shm的內存數據會以Cache Line粒度,被同時加載到2個Core的Cache,因為被多核共享,所以該Cache Line被標注為Shared狀態。

假設線程1在offset為64的位置寫入了一個8字節的數據(sizeof(long)),要修改一個狀態為Shared的Cache Line,Core1會發送核間通信消息到Core2,去拿到該Cache Line的獨占權,在這之后,Core1才能修改Local Cache。

圖片

線程1執行完`shm_offset.fetch_add(sizeof(long))`后,shm_offset會增加到72。

這時候Core2上運行的線程2也會執行`shm_offset.fetch_add(sizeof(long))`,它返回72并將shm_offset增加到80。

圖片

線程2接下來要修改shm[72]的內存位置,因為shm[64]和shm[72]在一個Cache Line,而這個Cache Line又被置為Invalidate,所以,它需要從內存里重新加載這一個Cache Line,而在這之前,Core1上的線程1需要把Cache Line沖刷到內存,這樣線程2才能加載最新的數據。

圖片

這種交替執行模式,相當于Core1和Core2之間需要頻繁的發送核間消息,收到消息的Core的對應Cache Line被置為無效,并重新從內存里加載數據到Cache,每次修改后都需要把Cache中的數據刷入內存。

這其實相當于廢棄掉了Cache,因為每次讀寫都直接跟內存打交道,Cache的作用不復存在,性能下降。

多核多線程程序,因為并發讀寫同一個Cache Line的數據(臨近位置的內存數據),導致Cache Line的頻繁失效,內存的頻繁Load/Store,從而導致性能急劇下降的現象叫偽共享,偽共享是性能殺手。

另一個偽共享的例子

假設線程x和y,分別修改Data的a和b變量,如果被頻繁調用,根據前面的分析,也會出現性能低下的情況,怎么規避呢?

```c++
struct Data {
int a;
int b;
};

Data data; // global

void thread1() {
data.a = 1;
}

void thread2() {
data.b = 2;
}
```

**空間換時間**

避免Cache偽共享導致性能下降的思路是用空間換時間,通過在a和b成員之間增加填充,讓a、b兩個變量分布到不同的Cache Line,這樣對a和b的修改就會作用于不同Cache Line,就能避免Cache line失效的問題。

```c++
struct Data {
int a;
int padding[60];
int b;
};
```

在Linux kernel中存在__cacheline_aligned_in_smp宏定義用于解決false sharing問題。

圖片

```c
#ifdef CONFIG_SMP
#define __cacheline_aligned_in_smp __cacheline_aligned
#else
#define __cacheline_aligned_in_smp
#endif

struct Data {
int a;
int b __cacheline_aligned_in_smp;
};
```

從上面的宏定義,我們可以看到:

  • 在多核(MP)系統里,該宏定義是 __cacheline_aligned,也就是Cache Line的大小
  • 在單核系統里,該宏定義是空的

偽共享的疑問

既然多CPU多核并發讀寫一個Cache Line里的內存數據,會出現偽共享,那么,我們對`atomic<size_t> shm_offset`的fetch_add()操作也滿足這個條件,多個線程同時對同一個shm_offset變量并發讀寫,那為什么性能不會很差呢?

我們反匯編發現`atomic.fetch_add`會被翻譯成`lock; xadd %rax (%rdx)`,lock是一個指令前綴,配合其他指令使用。

bus lock做的事情就是鎖住總線,然后執行后面的xadd,在此期間,別的線程都不能訪問任何內存數據。

實際上,鎖總線的操作比較重,相當于全局的內存總線鎖,lock前綴之后的指令操作就直接作用于內存,bypass掉緩存,lock也相當于內存屏障。

但翻看Intel手冊發現,執行lock指令,CPU會根據情況自行決定到底是鎖緩存,還是assert #LOCK signal(鎖總線)。

如果訪問的內存區域已經緩存在處理器的緩存行中,Intel的現代處理器則不會assert #LOCK信號,它會對CPU的緩存中的緩存行進行鎖定,在鎖定期間,其它CPU不能同時緩存此數據,在修改之后,通過緩存一致性協議來保證修改的原子性,這個操作被稱為“緩存鎖”。

false sharing對應的是多線程同時讀寫一個Cache Line的多個數據,Core-A修改數據x后,會置Cache Line為Invalid,Core-B讀該緩存行的另一個數據y,需要Core-A把Cache Line Store到內存,Core-B再從內存里Load對應Cache Line,數據要過內存。

而atomic,多個線程修改的是同一個變量。lock指令前綴,應該會用到緩存鎖(鎖Cache Line),atomic在Cache Line里的最新值通過核間消息發送給其他核就可以了,不需要頻繁的Store/Load,所以性能不會那么糟。

責任編輯:趙寧寧 來源: 碼磚雜役
相關推薦

2022-08-21 17:35:31

原子多線程

2022-08-13 11:53:52

多線程內存

2022-08-28 20:28:04

線程lock-free

2020-09-11 10:55:10

useState組件前端

2021-02-19 23:08:27

軟件測試軟件開發

2018-11-23 11:17:24

負載均衡分布式系統架構

2021-02-28 09:47:54

軟件架構軟件開發軟件設計

2021-05-28 07:12:59

Python閉包函數

2020-10-14 08:04:28

JavaScrip

2023-04-20 10:15:57

React組件Render

2011-11-30 09:28:37

iCloud信息圖云計算

2022-04-02 09:38:00

CSS3flex布局方式

2018-01-05 14:23:36

計算機負載均衡存儲

2023-07-10 10:36:17

人工智能AI

2023-02-10 08:44:05

KafkaLinkedIn模式

2021-08-09 14:40:02

物聯網IOT智能家居

2018-01-17 09:15:52

負載均衡算法

2023-04-12 14:04:48

光纖網絡

2023-02-27 15:47:31

2020-11-17 10:38:40

云計算工具技術
點贊
收藏

51CTO技術棧公眾號

国产精品区一区二区三含羞草| 日韩精品中文字幕有码专区| 色爽爽爽爽爽爽爽爽| 精品人妻一区二区三区日产乱码| 雨宫琴音一区二区在线| 亚洲色在线视频| 91视频福利网| 免费亚洲电影| 一区二区三区四区国产精品| 欧美日韩一区二区视频在线 | 欧美日韩免费观看一区二区三区 | 日韩精品一区二区三区老鸭窝| 337p粉嫩大胆噜噜噜鲁| 国产精品一区二区三区视频网站| 91视频免费看| 91久久偷偷做嫩草影院| www.欧美色| 悠悠资源网久久精品| 日韩在线视频导航| 亚洲做受高潮无遮挡| 日韩精品视频在线看| 欧洲精品在线观看| 乱妇乱女熟妇熟女网站| 日韩精品亚洲人成在线观看| 中文字幕av一区 二区| 久久国产欧美精品| xxxx18国产| 国产最新精品精品你懂的| 国产精品91久久久| 亚洲av中文无码乱人伦在线视色| 欧美日一区二区三区在线观看国产免| 中文字幕日韩在线视频| 日韩精品卡通动漫网站| 给我免费播放日韩视频| 日韩欧美国产系列| 性久久久久久久久久久久久久| 久久久人成影片一区二区三区在哪下载 | 欧美三级一区二区| 亚洲精品高清无码视频| 瑟瑟视频在线看| 同产精品九九九| 草草视频在线免费观看| 黄页网站大全在线免费观看| 亚洲精品中文字幕乱码三区| 91制片厂免费观看| 麻豆免费在线观看| 亚洲欧美激情小说另类| 最新av网址在线观看| jizzjizz亚洲| 亚洲午夜电影在线| 日韩精品一区在线视频| 丁香花视频在线观看| 亚洲一级二级在线| 日韩精品在线中文字幕| 玖玖在线播放| 在线观看亚洲成人| 日韩肉感妇bbwbbwbbw| 巨胸喷奶水www久久久| 欧美色视频在线观看| 不卡的av中文字幕| 亚洲成人精品综合在线| 欧美一区二区成人| 亚洲一级Av无码毛片久久精品| 白嫩白嫩国产精品| 日韩精品视频三区| 精品人妻一区二区三区蜜桃视频| 成人免费av| 精品国产一区二区三区久久| 欧美第一页在线观看| 欧美日韩国产综合网| 久久久久久久久综合| 日韩精品1区2区| 日韩高清电影一区| 91免费国产网站| 国产综合在线播放| 久久久精品综合| 国产精品12p| av在线理伦电影| 欧美视频不卡中文| 国产美女18xxxx免费视频| 日韩中文字幕| 亚洲女成人图区| 99久久久免费精品| 亚洲网址在线| 国产suv精品一区二区| 一个人看的www日本高清视频| 国产美女视频一区| 久久综合福利| 国产婷婷视频在线| 色香蕉久久蜜桃| 波多野结衣免费观看| 天堂成人娱乐在线视频免费播放网站| 一区二区三区国产在线观看| 日韩视频中文字幕在线观看| 亚洲精品婷婷| 91在线视频一区| 日本大臀精品| 亚洲欧美另类在线| 黄色片在线免费| 97视频一区| 色黄久久久久久| wwwwww国产| 国外成人福利视频| 日韩欧美在线综合网| 永久免费看mv网站入口78| 亚洲国产一成人久久精品| 国产91对白在线播放| 99国产在线播放| 久久精品日产第一区二区三区高清版| 日韩视频一二三| 国产精品蜜月aⅴ在线| 日韩电影中文字幕在线观看| 裸体武打性艳史| 日韩中文欧美在线| 精品在线视频一区二区| 中文在线手机av| 欧美日韩精品电影| 美女爆乳18禁www久久久久久| 精品动漫一区| 亚洲综合在线小说| 免费大片黄在线观看视频网站| 色综合色狠狠综合色| www.黄色网| 欧美fxxxxxx另类| 国产日本欧美在线观看| 久久久久久久久亚洲精品| 亚洲国产精品一区二区久久| 天天色天天干天天色| 久久国产亚洲| 国产精品久久久久久av福利软件| 天天爽夜夜爽夜夜爽| 一区二区免费看| 天天av天天操| 在线成人激情| 国产中文欧美精品| 日本免费在线观看| 精品污污网站免费看| 99精品欧美一区二区| 久久一二三四| 欧美三级网色| 成人在线免费电影网站| 亚洲性xxxx| 一区二区三区麻豆| 亚洲国产激情av| 深夜黄色小视频| 91影院成人| 7777精品久久久大香线蕉小说| 成人欧美在线| 日韩精品一区在线观看| 免费看一级一片| 不卡的av电影| 人妻有码中文字幕| 九色精品国产蝌蚪| 国产精品视频在线观看| 求av网址在线观看| 日韩午夜av一区| 国产一级中文字幕| 99re热视频这里只精品| 男女午夜激情视频| 色综合咪咪久久网| av成人在线电影| 1234区中文字幕在线观看| 亚洲奶大毛多的老太婆| 波多野结衣一二区| 亚洲少妇中出一区| www.com日本| 亚洲一区二区免费看| 日韩av图片| 成人动漫视频在线观看| 久久久久久成人| 免费播放片a高清在线观看| 欧美视频在线不卡| 欧美爱爱小视频| 99国产欧美另类久久久精品| 免费观看成人网| 99免费精品| 国产一区二区三区四区hd| 久久sese| 超碰日本道色综合久久综合 | 亚洲精品一区二区三区婷婷月| 久久久久久无码精品大片| 国产精品久久久久久久久免费丝袜| 四虎1515hh.com| 制服诱惑一区二区| 中文字幕成人一区| 日本国产精品| 成人黄色生活片| 精品极品在线| 久久久99久久精品女同性| 五月婷婷丁香花| 欧美日本不卡视频| 国产做受高潮漫动| 中文字幕一区二| 插吧插吧综合网| 国产久卡久卡久卡久卡视频精品| 波多野结衣家庭教师视频| 羞羞色午夜精品一区二区三区| 国产综合欧美在线看| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 久9久9色综合| 成人动漫在线观看视频| 久久伊人国产| 午夜精品久久久久久久久久久久| 素人av在线| 亚洲色图美腿丝袜| 成人精品在线播放| 在线成人高清不卡| 337p粉嫩色噜噜噜大肥臀| 亚洲影院在线观看| 女人18毛片毛片毛片毛片区二| 91视频国产资源| 无码av免费精品一区二区三区| 另类中文字幕网| 99精品视频在线看| 一区在线视频观看| 超薄肉色丝袜足j调教99| 精品久久久久久久| 久久精品国产一区二区三区不卡| 欧美日韩黄网站| 国产一区二区在线播放| xxxxx.日韩| 国产福利精品av综合导导航| 欧美日韩国产观看视频| 欧美肥老妇视频| av黄色在线| 久久这里只有精品视频首页| 999在线视频| 一区二区在线视频播放| 精品亚洲成a人片在线观看| 日韩av一区二区在线观看| www.国产麻豆| 欧美va亚洲va在线观看蝴蝶网| 国产三级在线观看视频| 欧美日韩亚洲综合在线 | 正在播放久久| 欧美3p在线观看| 亚洲国产精品一区二区第四页av| 精品一区二区三区在线| 欧日韩一区二区三区| 免费成人av| 色姑娘综合网| 99精品视频在线观看播放| 亚洲成人在线视频网站| 日韩在线精品| 天天爱天天做天天操| 久久久人成影片免费观看| 中文字幕欧美人与畜| 99久久亚洲精品蜜臀| 国产高潮呻吟久久久| 在线精品小视频| 日韩精品免费一区| 一区福利视频| 国内外成人激情视频| 久久精品卡一| www.色欧美| 国产成人aaaa| 亚洲国产综合视频| 国产午夜精品一区二区| 日韩av片在线免费观看| 亚洲欧洲日产国产综合网| 日韩影院一区二区| 午夜精品福利一区二区蜜股av| 国产污污视频在线观看| 日韩欧美在线视频日韩欧美在线视频| 亚洲欧美一二三区| 欧美精品日韩一区| 懂色av蜜臀av粉嫩av分享吧| 亚洲激情在线观看| 精品99又大又爽又硬少妇毛片| 最好看的2019年中文视频| a免费在线观看| 91精品国产色综合久久不卡98口 | 成人日韩av在线| 97青娱国产盛宴精品视频| 欧美精品一区二区三区在线四季| 日韩电影免费网站| 日韩精品综合在线| 日韩av不卡一区二区| 香蕉视频色在线观看| 99久久99久久免费精品蜜臀| 欧美亚洲色综久久精品国产| 夜夜嗨av一区二区三区中文字幕| 亚洲 欧美 日韩 综合| 欧美日韩国产一级片| 亚洲精品911| 一本色道久久88精品综合| caoporn免费在线视频| 人人做人人澡人人爽欧美| 99tv成人影院| 欧美一区1区三区3区公司| 欧美韩国一区| 性生交免费视频| 不卡的看片网站| 老熟妇高潮一区二区三区| 欧美日韩中文字幕| 国产成人麻豆精品午夜在线 | 精品亚洲一区二区三区四区五区高| 成人羞羞网站入口免费| 18黄暴禁片在线观看| 日本不卡在线视频| 国产福利在线观看视频| 亚洲精品福利视频网站| 欧美brazzers| 亚洲精品乱码久久久久久金桔影视 | 国产成人精品免费视| 日本香蕉视频在线观看| 美女看a上一区| 免费在线观看你懂的| 亚洲曰韩产成在线| 精品欧美在线观看| 丝袜情趣国产精品| 玛雅亚洲电影| 精品一区在线播放| 亚洲二区精品| 曰本三级日本三级日本三级| 中文幕一区二区三区久久蜜桃| 国产免费av一区| 亚洲国产精品嫩草影院久久| av在线看片| 91久久久久久久久久| 日韩av专区| 国产精品视频黄色| 国产日韩欧美综合一区| 成人在线免费看视频| 精品不卡在线视频| 国产深夜视频在线观看| 亚洲自拍偷拍色片视频| 午夜精品毛片| 久久久久xxxx| 综合色天天鬼久久鬼色| 又色又爽又黄无遮挡的免费视频| 亚洲无av在线中文字幕| 91精品论坛| 日本电影一区二区三区| 久久亚洲国产精品一区二区| 成人免费看aa片| 欧美日韩国产精品一区| 天堂影院在线| 97视频国产在线| 视频福利一区| www.四虎成人| 久久精品一区八戒影视| 波多野结衣在线观看一区| 国产亚洲精品久久| 日韩制服一区| 特级黄色录像片| 国产精品一区二区不卡| 日韩一级片av| 精品国产免费人成电影在线观看四季 | 韩曰欧美视频免费观看| 性感美女一级片| 欧美最猛黑人xxxx黑人猛叫黄| 竹菊久久久久久久| 一道本视频在线观看| 国产精品国产自产拍高清av | 成人中文字幕电影| 国产情侣在线视频| 亚洲欧美一区二区三区情侣bbw| 欧美xxxx做受欧美护士| 五月天婷亚洲天综合网鲁鲁鲁| 精品在线一区二区三区| 欧美日韩免费做爰视频| 亚洲黄页视频免费观看| 香蕉成人影院| 日本三级中文字幕在线观看| 成人黄色在线网站| 天天干天天色综合| 久久久成人精品视频| 久久99精品久久久久久欧洲站| 国产av无码专区亚洲精品| 国产精品高潮呻吟| 欧美自拍偷拍一区二区| 日韩美女毛茸茸| 蜜臀av粉嫩av懂色av| 成人在线综合网站| 日韩 欧美 中文| 中文字幕日韩精品在线| 久久久久久爱| 一女被多男玩喷潮视频| 中文字幕精品三区| 99国产精品久久久久久久成人| 久久久久久av| 日本精品三区| 在线xxxxx| 欧美午夜不卡在线观看免费| 午夜精品久久久久久久| 男人天堂综合| 成人a在线视频| 亚洲黄色av| 亚洲色图第四色| 欧美sm美女调教| 中文另类视频| 2019日韩中文字幕mv| 欧美激情综合五月色丁香小说| 精品人妻一区二区三区日产乱码 | 在线免费不卡视频| 顶级网黄在线播放| 日本免费高清不卡| 成人精品视频一区| 国产女人高潮时对白|