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

在Linux上,你做死鎖分析的簡(jiǎn)單方法

系統(tǒng) Linux 系統(tǒng)運(yùn)維
死鎖 (deallocks): 是指兩個(gè)或兩個(gè)以上的進(jìn)程(線程)在執(zhí)行過程中,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象,若無外力作用,它們都將無法推進(jìn)下去。此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程(線程)稱為死鎖進(jìn)程(線程)。 由于資源占用是互斥的,當(dāng)某個(gè)進(jìn)程提出申請(qǐng)資源后,使得有關(guān)進(jìn)程(線程)在無外力協(xié)助下,永遠(yuǎn)分配不到必需的資源而無法繼續(xù)運(yùn)行,這就產(chǎn)生了一種特殊現(xiàn)象死鎖。

簡(jiǎn)介

死鎖 (deallocks): 是指兩個(gè)或兩個(gè)以上的進(jìn)程(線程)在執(zhí)行過程中,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象,若無外力作用,它們都將無法推進(jìn)下去。此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程(線程)稱為死鎖進(jìn)程(線程)。 由于資源占用是互斥的,當(dāng)某個(gè)進(jìn)程提出申請(qǐng)資源后,使得有關(guān)進(jìn)程(線程)在無外力協(xié)助下,永遠(yuǎn)分配不到必需的資源而無法繼續(xù)運(yùn)行,這就產(chǎn)生了一種特殊現(xiàn)象死鎖。

一種交叉持鎖死鎖的情形,此時(shí)執(zhí)行程序中兩個(gè)或多個(gè)線程發(fā)生***堵塞(等待),每個(gè)線程都在等待被其它線程占用并堵塞了的資源。例如,如果線程 1 鎖住了記錄 A 并等待記錄 B,而線程 2 鎖住了記錄 B 并等待記錄 A,這樣兩個(gè)線程就發(fā)生了死鎖現(xiàn)象。在計(jì)算機(jī)系統(tǒng)中 , 如果系統(tǒng)的資源分配策略不當(dāng),更常見的可能是程序員寫的程序有錯(cuò)誤等,則會(huì)導(dǎo)致進(jìn)程因競(jìng)爭(zhēng)資源不當(dāng)而產(chǎn)生死鎖的現(xiàn)象。

產(chǎn)生死鎖的四個(gè)必要條件

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

(2) 請(qǐng)求與保持條件:一個(gè)進(jìn)程(線程)因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放。

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

(4) 循環(huán)等待條件 : 多個(gè)進(jìn)程(線程)之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。

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

 

 

 

交叉持鎖的死鎖

 

注釋:在執(zhí)行 func2 和 func4 之后,子線程 1 獲得了鎖 A,正試圖獲得鎖 B,但是子線程 2 此時(shí)獲得了鎖 B,正試圖獲得鎖 A,所以子線程 1 和子線程 2 將沒有辦法得到鎖 A 和鎖 B,因?yàn)樗鼈兏髯员粚?duì)方占有,永遠(yuǎn)不會(huì)釋放,所以發(fā)生了死鎖的現(xiàn)象。

使用 pstack 和 gdb 工具對(duì)死鎖程序進(jìn)行分析

pstack 在 Linux 平臺(tái)上的簡(jiǎn)單介紹

pstack 是 Linux(比如 Red Hat Linux 系統(tǒng)、Ubuntu Linux 系統(tǒng)等)下一個(gè)很有用的工具,它的功能是打印輸出此進(jìn)程的堆棧信息。可以輸出所有線程的調(diào)用關(guān)系棧。

gdb 在 Linux 平臺(tái)上的簡(jiǎn)單介紹

GDB 是 GNU 開源組織發(fā)布的一個(gè)強(qiáng)大的 UNIX 下的程序調(diào)試工具。Linux 系統(tǒng)中包含了 GNU 調(diào)試程序 gdb,它是一個(gè)用來調(diào)試 C 和 C++ 程序的調(diào)試器??梢允钩绦蜷_發(fā)者在程序運(yùn)行時(shí)觀察程序的內(nèi)部結(jié)構(gòu)和內(nèi)存的使用情況 .

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

1 運(yùn)行程序,設(shè)置能影響程序運(yùn)行的參數(shù)和環(huán)境 ;

2 控制程序在指定的條件下停止運(yùn)行;

3 當(dāng)程序停止時(shí),可以檢查程序的狀態(tài);

4 當(dāng)程序 crash 時(shí),可以檢查 core 文件;

5 可以修改程序的錯(cuò)誤,并重新運(yùn)行程序;

6 可以動(dòng)態(tài)監(jiān)視程序中變量的值;

7 可以單步執(zhí)行代碼,觀察程序的運(yùn)行狀態(tài)。

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

清單 1. 測(cè)試程序

  1. #include <unistd.h>  
  2. #include <pthread.h>  
  3. #include <string.h>  
  4.  
  5. pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;  
  6. pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;  
  7. pthread_mutex_t mutex3 = PTHREAD_MUTEX_INITIALIZER;  
  8. pthread_mutex_t mutex4 = PTHREAD_MUTEX_INITIALIZER;  
  9.  
  10. static int sequence1 = 0;  
  11. static int sequence2 = 0;  
  12.  
  13. int func1()  
  14. {  
  15.    pthread_mutex_lock(&mutex1);  
  16.    ++sequence1;  
  17.    sleep(1);  
  18.    pthread_mutex_lock(&mutex2);  
  19.    ++sequence2;  
  20.    pthread_mutex_unlock(&mutex2);  
  21.    pthread_mutex_unlock(&mutex1);  
  22.  
  23.    return sequence1;  
  24. }  
  25.  
  26. int func2()  
  27. {  
  28.    pthread_mutex_lock(&mutex2);  
  29.    ++sequence2;  
  30.    sleep(1);  
  31.    pthread_mutex_lock(&mutex1);  
  32.    ++sequence1;  
  33.    pthread_mutex_unlock(&mutex1);  
  34.    pthread_mutex_unlock(&mutex2);  
  35.  
  36.    return sequence2;  
  37. }  
  38.  
  39. void* thread1(void* arg)  
  40. {  
  41.    while (1)  
  42.    {  
  43.        int iRetValue = func1();  
  44.  
  45.        if (iRetValue == 100000)  
  46.        {  
  47.            pthread_exit(NULL);  
  48.        }  
  49.    }  
  50. }  
  51.  
  52. void* thread2(void* arg)  
  53. {  
  54.    while (1)  
  55.    {  
  56.        int iRetValue = func2();  
  57.  
  58.        if (iRetValue == 100000)  
  59.        {  
  60.            pthread_exit(NULL);  
  61.        }  
  62.    }  
  63. }  
  64.  
  65. void* thread3(void* arg)  
  66. {  
  67.    while (1)  
  68.    {  
  69.        sleep(1);  
  70.        char szBuf[128];  
  71.        memset(szBuf, 0, sizeof(szBuf));  
  72.        strcpy(szBuf, "thread3");  
  73.    }  
  74. }  
  75.  
  76. void* thread4(void* arg)  
  77. {  
  78.    while (1)  
  79.    {  
  80.        sleep(1);  
  81.        char szBuf[128];  
  82.        memset(szBuf, 0, sizeof(szBuf));  
  83.        strcpy(szBuf, "thread3");  
  84.    }  
  85. }  
  86.  
  87. int main()  
  88. {  
  89.    pthread_t tid[4];  
  90.    if (pthread_create(&tid[0], NULL, &thread1, NULL) != 0)  
  91.    {  
  92.        _exit(1);  
  93.    }  
  94.    if (pthread_create(&tid[1], NULL, &thread2, NULL) != 0)  
  95.    {  
  96.        _exit(1);  
  97.    }  
  98.    if (pthread_create(&tid[2], NULL, &thread3, NULL) != 0)  
  99.    {  
  100.        _exit(1);  
  101.    }  
  102.    if (pthread_create(&tid[3], NULL, &thread4, NULL) != 0)  
  103.    {  
  104.        _exit(1);  
  105.    }  
  106.  
  107.    sleep(5);  
  108.    //pthread_cancel(tid[0]);  
  109.  
  110.    pthread_join(tid[0], NULL);  
  111.    pthread_join(tid[1], NULL);  
  112.    pthread_join(tid[2], NULL);  
  113.    pthread_join(tid[3], NULL);  
  114.  
  115.    pthread_mutex_destroy(&mutex1);  
  116.    pthread_mutex_destroy(&mutex2);  
  117.    pthread_mutex_destroy(&mutex3);  
  118.    pthread_mutex_destroy(&mutex4);  
  119.  
  120.    return 0;  
  121.  

清單 2. 編譯測(cè)試程序

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

清單 3. 查找測(cè)試程序的進(jìn)程號(hào)

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

清單 4. 對(duì)死鎖進(jìn)程***次執(zhí)行 pstack(pstack –進(jìn)程號(hào))的輸出結(jié)果

  1. [dyu@xilinuxbldsrv purify]$ pstack 6721  
  2.  Thread 5 (Thread 0x41e37940 (LWP 6722)):  
  3.  #0  0x0000003d1a80d4c4 in __lll_lock_wait () from /lib64/libpthread.so.0  
  4.  #1  0x0000003d1a808e1a in _L_lock_1034 () from /lib64/libpthread.so.0  
  5.  #2  0x0000003d1a808cdc in pthread_mutex_lock () from /lib64/libpthread.so.0  
  6.  #3  0x0000000000400a9b in func1() ()  
  7.  #4  0x0000000000400ad7 in thread1(void*) ()  
  8.  #5  0x0000003d1a80673d in start_thread () from /lib64/libpthread.so.0  
  9.  #6  0x0000003d19cd40cd in clone () from /lib64/libc.so.6  
  10.  Thread 4 (Thread 0x42838940 (LWP 6723)):  
  11.  #0  0x0000003d1a80d4c4 in __lll_lock_wait () from /lib64/libpthread.so.0  
  12.  #1  0x0000003d1a808e1a in _L_lock_1034 () from /lib64/libpthread.so.0  
  13.  #2  0x0000003d1a808cdc in pthread_mutex_lock () from /lib64/libpthread.so.0  
  14.  #3  0x0000000000400a17 in func2() ()  
  15.  #4  0x0000000000400a53 in thread2(void*) ()  
  16.  #5  0x0000003d1a80673d in start_thread () from /lib64/libpthread.so.0  
  17.  #6  0x0000003d19cd40cd in clone () from /lib64/libc.so.6  
  18.  Thread 3 (Thread 0x43239940 (LWP 6724)):  
  19.  #0  0x0000003d19c9a541 in nanosleep () from /lib64/libc.so.6  
  20.  #1  0x0000003d19c9a364 in sleep () from /lib64/libc.so.6  
  21.  #2  0x00000000004009bc in thread3(void*) ()  
  22.  #3  0x0000003d1a80673d in start_thread () from /lib64/libpthread.so.0  
  23.  #4  0x0000003d19cd40cd in clone () from /lib64/libc.so.6  
  24.  Thread 2 (Thread 0x43c3a940 (LWP 6725)):  
  25.  #0  0x0000003d19c9a541 in nanosleep () from /lib64/libc.so.6  
  26.  #1  0x0000003d19c9a364 in sleep () from /lib64/libc.so.6  
  27.  #2  0x0000000000400976 in thread4(void*) ()  
  28.  #3  0x0000003d1a80673d in start_thread () from /lib64/libpthread.so.0  
  29.  #4  0x0000003d19cd40cd in clone () from /lib64/libc.so.6  
  30.  Thread 1 (Thread 0x2b984ecabd90 (LWP 6721)):  
  31.  #0  0x0000003d1a807b35 in pthread_join () from /lib64/libpthread.so.0  
  32.  #1  0x0000000000400900 in main ()  

清單 5. 對(duì)死鎖進(jìn)程第二次執(zhí)行 pstack(pstack –進(jìn)程號(hào))的輸出結(jié)果

  1. [dyu@xilinuxbldsrv purify]$ pstack 6721  
  2. Thread 5 (Thread 0x40bd6940 (LWP 6722)):  
  3. #0  0x0000003d1a80d4c4 in __lll_lock_wait () from /lib64/libpthread.so.0  
  4. #1  0x0000003d1a808e1a in _L_lock_1034 () from /lib64/libpthread.so.0  
  5. #2  0x0000003d1a808cdc in pthread_mutex_lock () from /lib64/libpthread.so.0  
  6. #3  0x0000000000400a87 in func1() ()  
  7. #4  0x0000000000400ac3 in thread1(void*) ()  
  8. #5  0x0000003d1a80673d in start_thread () from /lib64/libpthread.so.0  
  9. #6  0x0000003d19cd40cd in clone () from /lib64/libc.so.6  
  10. Thread 4 (Thread 0x415d7940 (LWP 6723)):  
  11. #0  0x0000003d1a80d4c4 in __lll_lock_wait () from /lib64/libpthread.so.0  
  12. #1  0x0000003d1a808e1a in _L_lock_1034 () from /lib64/libpthread.so.0  
  13. #2  0x0000003d1a808cdc in pthread_mutex_lock () from /lib64/libpthread.so.0  
  14. #3  0x0000000000400a03 in func2() ()  
  15. #4  0x0000000000400a3f in thread2(void*) ()  
  16. #5  0x0000003d1a80673d in start_thread () from /lib64/libpthread.so.0  
  17. #6  0x0000003d19cd40cd in clone () from /lib64/libc.so.6  
  18. Thread 3 (Thread 0x41fd8940 (LWP 6724)):  
  19. #0  0x0000003d19c7aec2 in memset () from /lib64/libc.so.6  
  20. #1  0x00000000004009be in thread3(void*) ()  
  21. #2  0x0000003d1a80673d in start_thread () from /lib64/libpthread.so.0  
  22. #3  0x0000003d19cd40cd in clone () from /lib64/libc.so.6  
  23. Thread 2 (Thread 0x429d9940 (LWP 6725)):  
  24. #0  0x0000003d19c7ae0d in memset () from /lib64/libc.so.6  
  25. #1  0x0000000000400982 in thread4(void*) ()  
  26. #2  0x0000003d1a80673d in start_thread () from /lib64/libpthread.so.0  
  27. #3  0x0000003d19cd40cd in clone () from /lib64/libc.so.6  
  28. Thread 1 (Thread 0x2af906fd9d90 (LWP 6721)):  
  29. #0  0x0000003d1a807b35 in pthread_join () from /lib64/libpthread.so.0  
  30. #1  0x0000000000400900 in main ()  

連續(xù)多次查看這個(gè)進(jìn)程的函數(shù)調(diào)用關(guān)系堆棧進(jìn)行分析:當(dāng)進(jìn)程吊死時(shí),多次使用 pstack 查看進(jìn)程的函數(shù)調(diào)用堆棧,死鎖線程將一直處于等鎖的狀態(tài),對(duì)比多次的函數(shù)調(diào)用堆棧輸出結(jié)果,確定哪兩個(gè)線程(或者幾個(gè)線程)一直沒有變化且一直處于等鎖的狀態(tài)(可能存在兩個(gè)線程 一直沒有變化)。

輸出分析:

根據(jù)上面的輸出對(duì)比可以發(fā)現(xiàn),線程 1 和線程 2 由***次 pstack 輸出的處在 sleep 函數(shù)變化為第二次 pstack 輸出的處在 memset 函數(shù)。但是線程 4 和線程 5 一直處在等鎖狀態(tài)(pthread_mutex_lock),在連續(xù)兩次的 pstack 信息輸出中沒有變化,所以我們可以推測(cè)線程 4 和線程 5 發(fā)生了死鎖。

Gdb into thread輸出:

清單 6. 然后通過 gdb attach 到死鎖進(jìn)程

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

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

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

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

  1. (gdb) f 3  
  2.  #3  0x0000000000400a9b in func1 () at lock.cpp:18  
  3.  18          pthread_mutex_lock(&mutex2);  
  4.  (gdb) thread 4  
  5.  [Switching to thread 4 (Thread 0x42838940 (LWP 6723))]#0  0x0000003d1a80d4c4 in  
  6.  __lll_lock_wait () from /lib64/libpthread.so.0  
  7.  (gdb) f 3  
  8.  #3  0x0000000000400a17 in func2 () at lock.cpp:31  
  9.  31          pthread_mutex_lock(&mutex1);  
  10.  (gdb) p mutex1  
  11.  $1 = {__data = {__lock = 2, __count = 0, __owner = 6722, __nusers = 1, __kind = 0,  
  12.  __spins = 0, __list = {__prev = 0x0, __next = 0x0}},  
  13.   __size = "\002\000\000\000\000\000\000\000B\032\000\000\001"'\000' 
  14.  <repeats 26 times>, __align = 2}  
  15.  (gdb) p mutex3  
  16.  $2 = {__data = {__lock = 0, __count = 0, __owner = 0, __nusers = 0,  
  17.  __kind = 0, __spins = 0, __list = {__prev = 0x0, __next = 0x0}},  
  18.  __size = '\000' <repeats 39 times>, __align = 0}  
  19.  (gdb) p mutex2  
  20.  $3 = {__data = {__lock = 2, __count = 0, __owner = 6723, __nusers = 1,  
  21.  __kind = 0, __spins = 0, __list = {__prev = 0x0, __next = 0x0}},  
  22.   __size = "\002\000\000\000\000\000\000\000C\032\000\000\001"'\000' 
  23.  <repeats 26 times>, __align = 2}  
  24.  (gdb)  

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

總結(jié)

本文簡(jiǎn)單介紹了一種在 Linux 平臺(tái)下分析死鎖問題的方法,對(duì)一些死鎖問題的分析有一定作用。希望對(duì)大家有幫助。理解了死鎖的原因,尤其是產(chǎn)生死鎖的四個(gè)必要條件,就可以***可能地避免、預(yù)防和解除死鎖。所以,在系統(tǒng)設(shè)計(jì)、進(jìn)程調(diào)度等方面注意如何不讓這四個(gè)必要條件成立,如何確定資源的合理分配算法,避免進(jìn)程***占據(jù)系統(tǒng)資源。此外,也要防止進(jìn)程在處于等待狀態(tài)的情況下占用資源 , 在系統(tǒng)運(yùn)行過程中,對(duì)進(jìn)程發(fā)出的每一個(gè)系統(tǒng)能夠滿足的資源申請(qǐng)進(jìn)行動(dòng)態(tài)檢查,并根據(jù)檢查結(jié)果決定是否分配資源,若分配后系統(tǒng)可能發(fā)生死鎖,則不予分配,否則予以分配。因此,對(duì)資源的分配要給予合理的規(guī)劃,使用有序資源分配法和銀行家算法等是避免死鎖的有效方法。 

責(zé)任編輯:龐桂玉 來源: 嵌入式Linux中文站
相關(guān)推薦

2012-08-13 10:16:34

IBMdW

2021-04-09 10:58:51

UbuntuLinuxWindows 10

2023-07-11 09:24:11

2010-03-15 14:10:34

ubuntu系統(tǒng)

2017-07-17 10:53:06

Linux交換分區(qū)

2019-07-05 09:45:19

UbuntuLinux釋放空間

2010-03-03 13:56:43

Linux ubant

2010-08-27 10:40:58

Linux DHCP服

2018-01-15 14:36:34

Linux負(fù)載CPU

2010-03-10 15:33:31

Linux誤刪除

2009-08-08 09:50:30

Linux操作系統(tǒng)共享內(nèi)存Linux

2010-08-06 13:23:58

NFS配置

2010-06-08 17:46:31

OpenSUSE安裝

2010-07-20 14:07:31

更改TELNET端口

2021-11-02 22:46:01

Windows 11Windows微軟

2019-12-24 11:16:09

Windows 10Windows任務(wù)欄

2010-09-30 14:01:38

2010-11-23 16:21:07

MySQL大表備份

2009-08-12 16:47:36

C#轉(zhuǎn)換農(nóng)歷

2010-05-14 16:41:58

MySQL鏡像數(shù)據(jù)庫
點(diǎn)贊
收藏

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

国产日本在线播放| 国产另类自拍| 国产人妻精品一区二区三区不卡| 成人免费91| 亚洲黄色尤物视频| 久久久7777| 91久久精品国产91性色69| 午夜天堂精品久久久久| 日韩高清av在线| 久久婷婷综合色| 免费在线国产视频| 久久伊99综合婷婷久久伊| 成人观看高清在线观看免费| 自拍偷拍欧美亚洲| 日韩精品二区| 亚洲精品一区二区三区蜜桃下载| 宅男噜噜噜66国产免费观看| 黄网在线观看视频| 国产精品手机在线播放| 欧美一区二区三区视频免费| 欧美日韩亚洲一| 国产黄网站在线观看| 久久综合一区二区| 波多野结衣精品久久| 伊人影院中文字幕| 久久xxxx精品视频| 欧美激情啊啊啊| 日本精品久久久久中文| 欧美大片网址| 日韩精品一区在线| 可以看污的网站| 三级中文字幕在线观看| 亚洲综合免费观看高清完整版 | 亚洲视频一区二区在线观看| 精品国产一区二区三区免费| 国产xxxx在线观看| 麻豆国产精品视频| 国产成人免费av电影| 日韩福利片在线观看| 国产精品二区影院| 久国内精品在线| 欧美三级日本三级| 亚洲精品中文字幕乱码| 俺去亚洲欧洲欧美日韩| 男人的天堂官网| 黑丝美女一区二区| 在线观看亚洲视频| 免费网站在线高清观看| 青草久久视频| 亚洲精品国产欧美| 国产肉体xxxx裸体784大胆| 91精品入口| 精品嫩草影院久久| 免费观看污网站| 91精品啪在线观看国产手机| 精品国产青草久久久久福利| 女性生殖扒开酷刑vk| 成人爽a毛片| 亚洲成人精品视频| 添女人荫蒂视频| 啄木系列成人av电影| 国产亚洲一区二区在线| 美国美女黄色片| 久久国产电影| 久久久精品久久久| 激情五月婷婷在线| aa级大片欧美三级| 国产精品成av人在线视午夜片| 成人a v视频| 麻豆91在线播放| 91在线免费视频| 亚洲精品视频91| 99re热视频精品| 欧美午夜精品理论片a级大开眼界| 噜噜噜在线观看播放视频| 国产欧美在线观看一区| 最新精品视频| 欧洲性视频在线播放| 精品国产成人av| 欧美两根一起进3p做受视频| 国内精品伊人| 日韩精品最新网址| 中国黄色a级片| 日韩亚洲一区在线| 欧美极度另类性三渗透| 日韩免费视频一区二区视频在线观看| 快she精品国产999| 亚洲一区二区三区sesese| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 丝袜美腿亚洲一区二区图片| 成人黄色av网| 日韩一级在线播放| 国产精品久久久久桃色tv| 免费看欧美黑人毛片| 欧美xxxx做受欧美护士| 欧美一区二区二区| 97超碰在线免费观看| 91超碰成人| 欧美资源在线观看| 国产黄色av网站| 久久丝袜美腿综合| 国产日本欧美在线| 自拍网站在线观看| 日韩视频免费观看高清完整版在线观看 | 青青草久久爱| 萌白酱国产一区二区| 久久精品视频7| 国产成人久久精品77777最新版本| 蜜桃999成人看片在线观看| 麻豆91在线| 狠狠躁天天躁日日躁欧美| 麻豆网站免费观看| 欧美日韩在线播放视频| 亚洲91av视频| 精品人妻一区二区三区蜜桃| 国产日韩欧美一区二区三区乱码| a天堂资源在线观看| 久久久久久久性潮| 亚洲男人第一av网站| 国产一级黄色av| 九九在线精品视频| 少妇免费毛片久久久久久久久| 高潮在线视频| 日韩美女在线视频| 九九热最新地址| 久久精品久久精品| 日本一区高清不卡| 天堂а√在线最新版中文在线| 日韩欧美一区二区免费| 欧美日韩色视频| 欧美a一区二区| 精品久久精品久久| 国产在线xxx| 日韩精品在线一区二区| 免费在线观看一级片| 久久爱www久久做| 亚洲精品影院| 精品女同一区二区三区在线观看| 亚洲欧美成人网| 国产成人一级片| www成人在线观看| 69堂免费视频| 亚洲妇女av| 国产99久久精品一区二区永久免费| 四季av日韩精品一区| 亚洲一二三区在线观看| jjzz黄色片| 亚洲成人原创| 久久久精品动漫| 91精品论坛| 亚洲人午夜精品| 做爰视频毛片视频| 国产精品午夜免费| 欧美激情第3页| 亚洲乱码精品| 国产精品三区四区| 乱人伦视频在线| 亚洲欧美综合图区| 波多野结衣视频观看| 中文字幕精品一区| 五月天激情播播| 国语精品一区| 蜜桃精品久久久久久久免费影院 | 色综合久久精品| 五月婷婷欧美激情| 久久av老司机精品网站导航| 福利网在线观看| 日本免费精品| 久久免费视频在线| 精品影院一区| 8x8x8国产精品| 久久精品视频国产| 久久亚洲精品小早川怜子| 日本www.色| 欧美黄色一区| 免费久久99精品国产自| 久久国产三级| 午夜精品久久久久久久白皮肤| 日本天堂在线| 欧美蜜桃一区二区三区| 国产在线观看99| 国产校园另类小说区| 国产精品自在自线| 中文日韩在线| 一区二区三区日韩视频| 欧美日韩另类图片| 国产精品一区二区三区免费视频| 青青青国内视频在线观看软件| 日韩精品免费看| 国产一区二区女内射| 午夜欧美一区二区三区在线播放| 一区二区精品免费| 国产宾馆实践打屁股91| 天天影视综合色| 国产精品av久久久久久麻豆网| 热re99久久精品国产99热| 电影91久久久| 欧美在线视频观看免费网站| 免费黄色网页在线观看| 亚洲精品一区二区在线观看| 一区二区视频网站| 亚洲成人黄色影院| 亚洲女同二女同志奶水| 国产.欧美.日韩| 成人性生生活性生交12| 亚洲国产婷婷| 18视频在线观看娇喘| 久久不卡国产精品一区二区| 波多野结衣精品久久| av成人亚洲| 午夜精品久久久久久久99热| 麻豆免费在线视频| 亚洲欧美在线看| 性生活免费网站| 欧美羞羞免费网站| 亚洲激情视频一区| 国产精品嫩草影院com| 久久无码人妻精品一区二区三区| 国产一区二区伦理片| 无码内射中文字幕岛国片| 在线观看日韩av电影| 亚洲一区二区高清视频| 亚洲婷婷伊人| 国产女主播一区二区三区| 亚洲精品成a人ⅴ香蕉片| 国产成+人+综合+亚洲欧洲| 午夜伦理在线视频| 日韩有码在线播放| 男人的天堂在线免费视频| 精品sm在线观看| 午夜精品久久久久久久96蜜桃| 欧美人与z0zoxxxx视频| 91丨九色丨海角社区| 欧美性猛交xxx| 天天综合天天干| 岛国av一区二区| 亚洲黄色小说图片| 婷婷一区二区三区| 国产成人无码精品久在线观看 | 色偷偷av一区二区三区| yw视频在线观看| 尤物yw午夜国产精品视频明星| 牛牛热在线视频| 亚洲欧洲日本专区| 国产小视频在线观看| 亚洲人成77777在线观看网| 免费动漫网站在线观看| 亚洲人永久免费| 在线观看免费黄视频| 少妇高潮久久77777| 美女av在线播放| 久久久精品免费视频| 影音先锋在线播放| 欧美激情xxxxx| 蜜桃视频在线观看免费视频| 日韩av不卡电影| 伊人久久高清| 成人精品一区二区三区电影黑人| 日韩一区二区三免费高清在线观看| 国产剧情日韩欧美| 日韩成人精品一区二区三区| 91在线免费视频| 亚洲视频国产精品| 久久99精品久久久久久久久久| 日韩超碰人人爽人人做人人添| 欧美第一黄网| 久久中文字幕av一区二区不卡| 免费国产成人看片在线| 亚洲无线视频| 黄色国产精品视频| 日本欧美在线观看| 超碰91在线播放| 成人黄色网址在线观看| 一本加勒比北条麻妃| 国产精品每日更新| 九九热视频精品| 欧美天堂在线观看| 一本到在线视频| 精品播放一区二区| 99中文字幕一区| 欧美精品久久久久| 日韩av超清在线观看| 成人午夜在线观看| 91欧美日韩在线| 蜜桃麻豆91| 国产电影一区二区在线观看| 日韩精品在线中文字幕| 久久综合导航| 精产国品一区二区三区| 91麻豆精东视频| 日本精品在线免费观看| 激情亚洲一区二区三区四区| 亚洲视频在线免费播放| 亚洲国产精品久久91精品| 在线播放麻豆| 欧美一级片一区| 国产亚洲亚洲国产一二区| 久久综合给合久久狠狠色| 999精品一区| 韩国日本在线视频| 丁香桃色午夜亚洲一区二区三区| 一级特黄曰皮片视频| 亚洲电影一区二区三区| 91资源在线视频| 亚洲欧美在线看| wwwww亚洲| 91沈先生在线观看| 精品少妇av| 国产美女网站在线观看| 国产自产v一区二区三区c| 五月天综合视频| 欧美日韩在线视频首页| 亚洲精品久久久狠狠狠爱 | 久久亚洲高清| 欧美国产激情| 午夜视频在线网站| 国产视频一区在线播放| 亚洲精品1区2区3区| 欧美成人国产一区二区| 成人日批视频| 成人久久久久久| 日韩一区二区在线免费| 成年人小视频网站| 久久综合av免费| 在线观看亚洲天堂| 亚洲福利影片在线| 国内高清免费在线视频| 91免费版黄色| 亚洲综合小说| 性鲍视频在线观看| 亚洲欧美日韩一区二区| 国产精品伦一区二区三区| 日韩在线视频免费观看| 日本电影久久久| 亚洲一卡二卡区| 九色porny丨国产精品| 人人澡人人澡人人看| 欧美精品xxxxbbbb| 美女写真理伦片在线看| 成人淫片在线看| 亚洲精品97| 99久久综合网| 亚洲宅男天堂在线观看无病毒| 亚洲国产精品二区| 色综合男人天堂| 成人av地址| 狠狠干 狠狠操| 91麻豆蜜桃一区二区三区| 成人免费毛片视频| 在线观看国产精品日韩av| 久久麻豆视频| 老汉色影院首页| 成人免费黄色大片| 日本va欧美va国产激情| 亚洲欧洲免费视频| 日本久久一区| 99精品一区二区三区的区别| 国产精品一区二区久激情瑜伽| 久久久国产精品人人片| 亚洲精品狠狠操| 日韩成人亚洲| 一卡二卡3卡四卡高清精品视频| 国产在线国偷精品免费看| 久草视频在线免费看| 亚洲国语精品自产拍在线观看| 亚洲美女久久精品| 亚洲精品高清国产一线久久| 国产美女精品人人做人人爽| 久久久久香蕉视频| 日韩精品在线私人| 老司机精品视频网| 国产情侣第一页| 久久久久久一二三区| 一本色道久久综合精品婷婷| 久久久免费精品| 国产九一精品| 女人扒开双腿让男人捅| 日韩欧美一区二区在线| 91涩漫在线观看| 国产精品日韩一区二区三区| 日韩综合小视频| 免费在线观看黄视频| 亚洲欧美国产一区二区三区| 伊人久久精品| 国产二区视频在线播放| 自拍偷拍欧美精品| 天堂91在线| 51国产成人精品午夜福中文下载| 亚洲综合丁香| 中国一级片在线观看| 国产婷婷97碰碰久久人人蜜臀| 色999久久久精品人人澡69 | 美国三级日本三级久久99| 免费网站观看www在线观| 亚洲日韩欧美视频| 岛国av一区| 久久久久久久久久一区| 欧美天天综合色影久久精品| 午夜影院免费在线| 亚洲午夜精品一区二区|