婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 在Linux平臺下分析死鎖問題的方法

在Linux平臺下分析死鎖問題的方法

熱門標簽:安陽百應電銷機器人加盟 百度中國地圖標注中心 潮州地圖標注 pageadm實現地圖標注 百度地圖標注開鎖電話 琿春市地圖標注app 公司400電話辦理價格 山東企業電銷機器人價格 依蘭縣地圖標注app

死鎖 (deallocks): 是指兩個或兩個以上的進程(線程)在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處于死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程(線程)稱為死鎖進程(線程)。 由于資源占用是互斥的,當某個進程提出申請資源后,使得有關進程(線程)在無外力協助下,永遠分配不到必需的資源而無法繼續運行,這就產生了一種特殊現象死鎖。

一種交叉持鎖死鎖的情形,此時執行程序中兩個或多個線程發生永久堵塞(等待),每個線程都在等待被其它線程占用并堵塞了的資源。例如,如果線程 1 鎖住了記錄 A 并等待記錄 B,而線程 2 鎖住了記錄 B 并等待記錄 A,這樣兩個線程就發生了死鎖現象。在計算機系統中 , 如果系統的資源分配策略不當,更常見的可能是程序員寫的程序有錯誤等,則會導致進程因競爭資源不當而產生死鎖的現象。

產生死鎖的四個必要條件

(1) 互斥條件:一個資源每次只能被一個進程(線程)使用。

(2) 請求與保持條件:一個進程(線程)因請求資源而阻塞時,對已獲得的資源保持不放。

(3) 不剝奪條件 : 此進程(線程)已獲得的資源,在末使用完之前,不能強行剝奪。

(4) 循環等待條件 : 多個進程(線程)之間形成一種頭尾相接的循環等待資源關系。

圖 1. 交叉持鎖的死鎖示意圖:

注釋:在執行 func2 和 func4 之后,子線程 1 獲得了鎖 A,正試圖獲得鎖 B,但是子線程 2 此時獲得了鎖 B,正試圖獲得鎖 A,所以子線程 1 和子線程 2 將沒有辦法得到鎖 A 和鎖 B,因為它們各自被對方占有,永遠不會釋放,所以發生了死鎖的現象。

使用 pstack 和 gdb 工具對死鎖程序進行分析

pstack 在 Linux 平臺上的簡單介紹

pstack 是 Linux(比如 Red Hat Linux 系統、Ubuntu Linux 系統等)下一個很有用的工具,它的功能是打印輸出此進程的堆棧信息。可以輸出所有線程的調用關系棧。

gdb 在 Linux 平臺上的簡單介紹

GDB 是 GNU 開源組織發布的一個強大的 UNIX 下的程序調試工具。Linux 系統中包含了 GNU 調試程序 gdb,它是一個用來調試 C 和 C++ 程序的調試器。可以使程序開發者在程序運行時觀察程序的內部結構和內存的使用情況 .

gdb 所提供的一些主要功能如下所示:

1 運行程序,設置能影響程序運行的參數和環境 ;

2 控制程序在指定的條件下停止運行;

3 當程序停止時,可以檢查程序的狀態;

4 當程序 crash 時,可以檢查 core 文件;

5 可以修改程序的錯誤,并重新運行程序;

6 可以動態監視程序中變量的值;

7 可以單步執行代碼,觀察程序的運行狀態。

gdb 程序調試的對象是可執行文件或者進程,而不是程序的源代碼文件。然而,并不是所有的可執行文件都可以用 gdb 調試。如果要讓產生的可執行文件可以用來調試,需在執行 g++(gcc)指令編譯程序時,加上 -g 參數,指定程序在編譯時包含調試信息。調試信息包含程序里的每個變量的類型和在可執行文件里的地址映射以及源代碼的行號。gdb 利用這些信息使源代碼和機器碼相關聯。gdb 的基本命令較多,不做詳細介紹,大家如果需要進一步了解,請參見 gdb 手冊。

清單 1. 測試程序

#include  
 #include  
 #include  

 pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; 
 pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER; 
 pthread_mutex_t mutex3 = PTHREAD_MUTEX_INITIALIZER; 
 pthread_mutex_t mutex4 = PTHREAD_MUTEX_INITIALIZER; 

 static int sequence1 = 0; 
 static int sequence2 = 0; 

 int func1() 
 { 
    pthread_mutex_lock(mutex1); 
    ++sequence1; 
    sleep(1); 
    pthread_mutex_lock(mutex2); 
    ++sequence2; 
    pthread_mutex_unlock(mutex2); 
    pthread_mutex_unlock(mutex1); 

    return sequence1; 
 } 

 int func2() 
 { 
    pthread_mutex_lock(mutex2); 
    ++sequence2; 
    sleep(1); 
    pthread_mutex_lock(mutex1); 
    ++sequence1; 
    pthread_mutex_unlock(mutex1); 
    pthread_mutex_unlock(mutex2); 

    return sequence2; 
 } 

 void* thread1(void* arg) 
 { 
    while (1) 
    { 
        int iRetValue = func1(); 

        if (iRetValue == 100000) 
        { 
            pthread_exit(NULL); 
        } 
    } 
 } 

 void* thread2(void* arg) 
 { 
    while (1) 
    { 
        int iRetValue = func2(); 

        if (iRetValue == 100000) 
        { 
            pthread_exit(NULL); 
        } 
    } 
 } 

 void* thread3(void* arg) 
 { 
    while (1) 
    { 
        sleep(1); 
        char szBuf[128]; 
        memset(szBuf, 0, sizeof(szBuf)); 
        strcpy(szBuf, "thread3"); 
    } 
 } 

 void* thread4(void* arg) 
 { 
    while (1) 
    { 
        sleep(1); 
        char szBuf[128]; 
        memset(szBuf, 0, sizeof(szBuf)); 
        strcpy(szBuf, "thread3"); 
    } 
 } 

 int main() 
 { 
    pthread_t tid[4]; 
    if (pthread_create(tid[0], NULL, thread1, NULL) != 0) 
    { 
        _exit(1); 
    } 
    if (pthread_create(tid[1], NULL, thread2, NULL) != 0) 
    { 
        _exit(1); 
    } 
    if (pthread_create(tid[2], NULL, thread3, NULL) != 0) 
    { 
        _exit(1); 
    } 
    if (pthread_create(tid[3], NULL, thread4, NULL) != 0) 
    { 
        _exit(1); 
    } 

    sleep(5); 
    //pthread_cancel(tid[0]); 

    pthread_join(tid[0], NULL); 
    pthread_join(tid[1], NULL); 
    pthread_join(tid[2], NULL); 
    pthread_join(tid[3], NULL); 

    pthread_mutex_destroy(mutex1); 
    pthread_mutex_destroy(mutex2); 
    pthread_mutex_destroy(mutex3); 
    pthread_mutex_destroy(mutex4); 

    return 0; 
 } 

清單 2. 編譯測試程序

 [dyu@xilinuxbldsrv purify]$ g++ -g lock.cpp -o lock -lpthread 

清單 3. 查找測試程序的進程號

 [dyu@xilinuxbldsrv purify]$ ps -ef|grep lock 
 dyu       6721  5751  0 15:21 pts/3    00:00:00 ./lock 

清單 4. 對死鎖進程第一次執行 pstack(pstack –進程號)的輸出結果

 [dyu@xilinuxbldsrv purify]$ pstack 6721 
 Thread 5 (Thread 0x41e37940 (LWP 6722)): 
 #0  0x0000003d1a80d4c4 in __lll_lock_wait () from /lib64/libpthread.so.0 
 #1  0x0000003d1a808e1a in _L_lock_1034 () from /lib64/libpthread.so.0 
 #2  0x0000003d1a808cdc in pthread_mutex_lock () from /lib64/libpthread.so.0 
 #3  0x0000000000400a9b in func1() () 
 #4  0x0000000000400ad7 in thread1(void*) () 
 #5  0x0000003d1a80673d in start_thread () from /lib64/libpthread.so.0 
 #6  0x0000003d19cd40cd in clone () from /lib64/libc.so.6 
 Thread 4 (Thread 0x42838940 (LWP 6723)): 
 #0  0x0000003d1a80d4c4 in __lll_lock_wait () from /lib64/libpthread.so.0 
 #1  0x0000003d1a808e1a in _L_lock_1034 () from /lib64/libpthread.so.0 
 #2  0x0000003d1a808cdc in pthread_mutex_lock () from /lib64/libpthread.so.0 
 #3  0x0000000000400a17 in func2() () 
 #4  0x0000000000400a53 in thread2(void*) () 
 #5  0x0000003d1a80673d in start_thread () from /lib64/libpthread.so.0 
 #6  0x0000003d19cd40cd in clone () from /lib64/libc.so.6 
 Thread 3 (Thread 0x43239940 (LWP 6724)): 
 #0  0x0000003d19c9a541 in nanosleep () from /lib64/libc.so.6 
 #1  0x0000003d19c9a364 in sleep () from /lib64/libc.so.6 
 #2  0x00000000004009bc in thread3(void*) () 
 #3  0x0000003d1a80673d in start_thread () from /lib64/libpthread.so.0 
 #4  0x0000003d19cd40cd in clone () from /lib64/libc.so.6 
 Thread 2 (Thread 0x43c3a940 (LWP 6725)): 
 #0  0x0000003d19c9a541 in nanosleep () from /lib64/libc.so.6 
 #1  0x0000003d19c9a364 in sleep () from /lib64/libc.so.6 
 #2  0x0000000000400976 in thread4(void*) () 
 #3  0x0000003d1a80673d in start_thread () from /lib64/libpthread.so.0 
 #4  0x0000003d19cd40cd in clone () from /lib64/libc.so.6 
 Thread 1 (Thread 0x2b984ecabd90 (LWP 6721)): 
 #0  0x0000003d1a807b35 in pthread_join () from /lib64/libpthread.so.0 
 #1  0x0000000000400900 in main ()    

清單 5. 對死鎖進程第二次執行 pstack(pstack –進程號)的輸出結果

 [dyu@xilinuxbldsrv purify]$ pstack 6721 
 Thread 5 (Thread 0x40bd6940 (LWP 6722)): 
 #0  0x0000003d1a80d4c4 in __lll_lock_wait () from /lib64/libpthread.so.0 
 #1  0x0000003d1a808e1a in _L_lock_1034 () from /lib64/libpthread.so.0 
 #2  0x0000003d1a808cdc in pthread_mutex_lock () from /lib64/libpthread.so.0 
 #3  0x0000000000400a87 in func1() () 
 #4  0x0000000000400ac3 in thread1(void*) () 
 #5  0x0000003d1a80673d in start_thread () from /lib64/libpthread.so.0 
 #6  0x0000003d19cd40cd in clone () from /lib64/libc.so.6 
 Thread 4 (Thread 0x415d7940 (LWP 6723)): 
 #0  0x0000003d1a80d4c4 in __lll_lock_wait () from /lib64/libpthread.so.0 
 #1  0x0000003d1a808e1a in _L_lock_1034 () from /lib64/libpthread.so.0 
 #2  0x0000003d1a808cdc in pthread_mutex_lock () from /lib64/libpthread.so.0 
 #3  0x0000000000400a03 in func2() () 
 #4  0x0000000000400a3f in thread2(void*) () 
 #5  0x0000003d1a80673d in start_thread () from /lib64/libpthread.so.0 
 #6  0x0000003d19cd40cd in clone () from /lib64/libc.so.6 
 Thread 3 (Thread 0x41fd8940 (LWP 6724)): 
 #0  0x0000003d19c7aec2 in memset () from /lib64/libc.so.6 
 #1  0x00000000004009be in thread3(void*) () 
 #2  0x0000003d1a80673d in start_thread () from /lib64/libpthread.so.0 
 #3  0x0000003d19cd40cd in clone () from /lib64/libc.so.6 
 Thread 2 (Thread 0x429d9940 (LWP 6725)): 
 #0  0x0000003d19c7ae0d in memset () from /lib64/libc.so.6 
 #1  0x0000000000400982 in thread4(void*) () 
 #2  0x0000003d1a80673d in start_thread () from /lib64/libpthread.so.0 
 #3  0x0000003d19cd40cd in clone () from /lib64/libc.so.6 
 Thread 1 (Thread 0x2af906fd9d90 (LWP 6721)): 
 #0  0x0000003d1a807b35 in pthread_join () from /lib64/libpthread.so.0 
 #1  0x0000000000400900 in main () 

連續多次查看這個進程的函數調用關系堆棧進行分析:當進程吊死時,多次使用 pstack 查看進程的函數調用堆棧,死鎖線程將一直處于等鎖的狀態,對比多次的函數調用堆棧輸出結果,確定哪兩個線程(或者幾個線程)一直沒有變化且一直處于等鎖的狀態(可能存在兩個線程 一直沒有變化)。

輸出分析:

根據上面的輸出對比可以發現,線程 1 和線程 2 由第一次 pstack 輸出的處在 sleep 函數變化為第二次 pstack 輸出的處在 memset 函數。但是線程 4 和線程 5 一直處在等鎖狀態(pthread_mutex_lock),在連續兩次的 pstack 信息輸出中沒有變化,所以我們可以推測線程 4 和線程 5 發生了死鎖。

Gdb into thread輸出:

清單 6. 然后通過 gdb attach 到死鎖進程

   (gdb) info thread 
  5 Thread 0x41e37940 (LWP 6722)  0x0000003d1a80d4c4 in __lll_lock_wait () 
  from /lib64/libpthread.so.0 
  4 Thread 0x42838940 (LWP 6723)  0x0000003d1a80d4c4 in __lll_lock_wait () 
  from /lib64/libpthread.so.0 
  3 Thread 0x43239940 (LWP 6724)  0x0000003d19c9a541 in nanosleep () 
 from /lib64/libc.so.6 
  2 Thread 0x43c3a940 (LWP 6725)  0x0000003d19c9a541 in nanosleep () 
 from /lib64/libc.so.6 
 * 1 Thread 0x2b984ecabd90 (LWP 6721)  0x0000003d1a807b35 in pthread_join () 
 from /lib64/libpthread.so.0 

清單 7. 切換到線程 5 的輸出

 (gdb) thread 5 
 [Switching to thread 5 (Thread 0x41e37940 (LWP 6722))]#0  0x0000003d1a80d4c4 in 
 __lll_lock_wait () from /lib64/libpthread.so.0 
 (gdb) where 
 #0  0x0000003d1a80d4c4 in __lll_lock_wait () from /lib64/libpthread.so.0 
 #1  0x0000003d1a808e1a in _L_lock_1034 () from /lib64/libpthread.so.0 
 #2  0x0000003d1a808cdc in pthread_mutex_lock () from /lib64/libpthread.so.0 
 #3  0x0000000000400a9b in func1 () at lock.cpp:18 
 #4  0x0000000000400ad7 in thread1 (arg=0x0) at lock.cpp:43 
 #5  0x0000003d1a80673d in start_thread () from /lib64/libpthread.so.0 
 #6  0x0000003d19cd40cd in clone () from /lib64/libc.so.6 

清單 8. 線程 4 和線程 5 的輸出

 (gdb) f 3 
 #3  0x0000000000400a9b in func1 () at lock.cpp:18 
 18          pthread_mutex_lock(mutex2); 
 (gdb) thread 4 
 [Switching to thread 4 (Thread 0x42838940 (LWP 6723))]#0  0x0000003d1a80d4c4 in 
 __lll_lock_wait () from /lib64/libpthread.so.0 
 (gdb) f 3 
 #3  0x0000000000400a17 in func2 () at lock.cpp:31 
 31          pthread_mutex_lock(mutex1); 
 (gdb) p mutex1 
 $1 = {__data = {__lock = 2, __count = 0, __owner = 6722, __nusers = 1, __kind = 0, 
 __spins = 0, __list = {__prev = 0x0, __next = 0x0}}, 
  __size = "\002\000\000\000\000\000\000\000B\032\000\000\001", '\000'
 , __align = 2} 
 (gdb) p mutex3 
 $2 = {__data = {__lock = 0, __count = 0, __owner = 0, __nusers = 0, 
 __kind = 0, __spins = 0, __list = {__prev = 0x0, __next = 0x0}}, 
 __size = '\000' , __align = 0} 
 (gdb) p mutex2 
 $3 = {__data = {__lock = 2, __count = 0, __owner = 6723, __nusers = 1, 
 __kind = 0, __spins = 0, __list = {__prev = 0x0, __next = 0x0}}, 
  __size = "\002\000\000\000\000\000\000\000C\032\000\000\001", '\000'
 , __align = 2} 
 (gdb) 

從上面可以發現,線程 4 正試圖獲得鎖 mutex1,但是鎖 mutex1 已經被 LWP 為 6722 的線程得到(__owner = 6722),線程 5 正試圖獲得鎖 mutex2,但是鎖 mutex2 已經被 LWP 為 6723 的 得到(__owner = 6723),從 pstack 的輸出可以發現,LWP 6722 與線程 5 是對應的,LWP 6723 與線程 4 是對應的。所以我們可以得出, 線程 4 和線程 5 發生了交叉持鎖的死鎖現象。查看線程的源代碼發現,線程 4 和線程 5 同時使用 mutex1 和 mutex2,且申請順序不合理。

總結

本文簡單介紹了一種在 Linux 平臺下分析死鎖問題的方法,對一些死鎖問題的分析有一定作用。希望對大家有幫助。理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和解除死鎖。所以,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確定資源的合理分配算法,避免進程永久占據系統資源。此外,也要防止進程在處于等待狀態的情況下占用資源 , 在系統運行過程中,對進程發出的每一個系統能夠滿足的資源申請進行動態檢查,并根據檢查結果決定是否分配資源,若分配后系統可能發生死鎖,則不予分配,否則予以分配。因此,對資源的分配要給予合理的規劃,使用有序資源分配法和銀行家算法等是避免死鎖的有效方法。

標簽:淘寶邀評 滄州 樂山 榆林 河池 山南 河北 保定

巨人網絡通訊聲明:本文標題《在Linux平臺下分析死鎖問題的方法》,本文關鍵詞  在,Linux,平,臺下,分析,死鎖,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《在Linux平臺下分析死鎖問題的方法》相關的同類信息!
  • 本頁收集關于在Linux平臺下分析死鎖問題的方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日韩一区二区三区av| 91久久国产最好的精华液| 国产精品伊人色| 日韩欧美亚洲一区二区| 亚洲午夜电影网| 成人激情免费网站| 国产精品久线观看视频| 日本aⅴ亚洲精品中文乱码| 日韩亚洲欧美成人一区| 成人黄色777网| 日本一道高清亚洲日美韩| 久久网这里都是精品| 国产麻豆精品在线| 国产精品福利一区二区| 精品福利在线导航| 91久久国产最好的精华液| 日韩中文字幕亚洲一区二区va在线| 91精品国产入口| 日本网站在线观看一区二区三区 | 伊人婷婷欧美激情| 狠狠狠色丁香婷婷综合久久五月| 欧美日韩亚洲不卡| 日韩精品国产欧美| 精品污污网站免费看| 国产精品美女久久久久高潮| 国产精品一区二区久激情瑜伽| 欧美精品一区二区三区一线天视频| 精品在线播放午夜| 久久亚洲免费视频| 国产成人精品www牛牛影视| 中文字幕色av一区二区三区| 北岛玲一区二区三区四区| 日韩理论片中文av| 欧美精品aⅴ在线视频| 日韩欧美在线综合网| 亚洲mv在线观看| 精品国产91亚洲一区二区三区婷婷| 国产在线播精品第三| 日韩视频免费观看高清在线视频| 91麻豆精品国产91久久久久久久久| 亚洲精品视频免费看| 日韩欧美中文一区| 在线影视一区二区三区| 日韩国产精品久久| 国产精品卡一卡二| 欧美无砖专区一中文字| 麻豆专区一区二区三区四区五区| 欧美中文字幕一区| 亚洲一区二区影院| 久久久综合激的五月天| 日韩精品在线网站| 九色|91porny| 欧美一区二区三区的| 国产剧情av麻豆香蕉精品| 国产精品久线在线观看| 久久先锋影音av鲁色资源网| 欧美日韩免费观看一区三区| 在线观看网站黄不卡| 日本电影欧美片| 成人免费毛片app| 美女视频一区二区| 色狠狠色狠狠综合| 国产一区在线看| 日本一区二区高清| 色婷婷综合久久久中文字幕| 亚洲一二三四在线| 亚洲人成影院在线观看| 久久精品一区二区三区不卡牛牛| 在线电影国产精品| 欧美三级乱人伦电影| 91黄色激情网站| 欧美写真视频网站| 99这里都是精品| 久久福利资源站| 日精品一区二区三区| 亚洲网友自拍偷拍| 一区二区三区免费观看| 午夜欧美电影在线观看| 亚洲欧美日韩国产一区二区三区 | 久久综合狠狠综合久久激情| 色欧美片视频在线观看在线视频| 成人激情开心网| 一本到不卡免费一区二区| 色综合咪咪久久| 99re8在线精品视频免费播放| 免费成人性网站| 国产电影一区二区三区| 国产精品亚洲专一区二区三区 | 99久久精品国产观看| 欧美性受极品xxxx喷水| 91视视频在线直接观看在线看网页在线看| 一本久道中文字幕精品亚洲嫩| 色播五月激情综合网| 欧美喷潮久久久xxxxx| 亚洲欧美日韩国产综合在线| 国产日韩一级二级三级| 亚洲综合视频网| 亚洲一卡二卡三卡四卡| 有码一区二区三区| 免费高清在线一区| 亚洲国产cao| 天堂av在线一区| 亚洲国产精品久久不卡毛片| 秋霞av亚洲一区二区三| 久久精品国产99| 欧美大胆人体bbbb| 国产精品乱码一区二区三区软件 | 久国产精品韩国三级视频| 日韩黄色片在线观看| 麻豆精品蜜桃视频网站| 色综合视频在线观看| 中文字幕免费不卡| 日韩av二区在线播放| 国产一区 二区 三区一级| 日韩欧美一区电影| 制服丝袜亚洲网站| 亚洲精品成人精品456| 成人午夜av影视| 首页亚洲欧美制服丝腿| 欧美高清精品3d| 精品一区二区三区免费毛片爱| 欧美色欧美亚洲另类二区| 蜜桃一区二区三区四区| 伊人一区二区三区| 一区二区中文视频| 亚洲欧洲精品一区二区三区 | 日本亚洲三级在线| 亚洲日本护士毛茸茸| 五月综合激情婷婷六月色窝| 精品一区二区三区的国产在线播放| 亚洲免费看黄网站| 5566中文字幕一区二区电影| 色av综合在线| 精品免费国产一区二区三区四区| 日韩一区二区三区高清免费看看| 在线精品亚洲一区二区不卡| 久久色.com| 亚洲激情自拍偷拍| 日欧美一区二区| 大尺度一区二区| 一本色道久久综合亚洲精品按摩| 国产精品一区三区| 国产精品成人一区二区艾草| 国产在线精品一区二区夜色| 欧美视频精品在线观看| 亚洲一区二区欧美| 91色.com| 免费成人美女在线观看| 中文字幕免费一区| 欧美三级中文字幕| 亚洲国产sm捆绑调教视频 | 亚洲猫色日本管| 亚洲男人天堂一区| 国产综合久久久久影院| 国产一区二区三区免费在线观看| 7878成人国产在线观看| 亚洲久草在线视频| 一本色道亚洲精品aⅴ| 色88888久久久久久影院野外| 亚洲天堂网中文字| www.日韩精品| 欧美视频在线不卡| 亚洲欧洲精品一区二区三区不卡| 国内精品视频666| 日韩亚洲电影在线| 久久99久久99小草精品免视看| 日韩三区在线观看| 午夜激情一区二区三区| 欧美在线免费视屏| 一区在线播放视频| 91免费版在线| 中文字幕在线不卡一区二区三区| 日本aⅴ精品一区二区三区| 日韩欧美国产综合| 天天av天天翘天天综合网| 欧美精品一区男女天堂| 99精品视频一区| 亚洲影视在线观看| 日韩一区二区视频| 在线一区二区观看| 亚洲视频你懂的| 成人白浆超碰人人人人| 国产精品女同一区二区三区| 欧美影院精品一区| 亚洲综合视频在线| 日韩美女天天操| 国产麻豆成人传媒免费观看| 久久久久久夜精品精品免费| 蜜桃久久久久久久| 久久综合久色欧美综合狠狠| 国产69精品一区二区亚洲孕妇| 一区二区三区在线免费| 欧美刺激脚交jootjob| 成人晚上爱看视频| 蜜臀av一区二区三区| 久久久亚洲高清| 欧美在线一二三| 韩国午夜理伦三级不卡影院| 亚洲一级二级三级在线免费观看| xvideos.蜜桃一区二区|