日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入理解CRITICAL_SECTION

發(fā)布時間:2023/12/20 编程问答 72 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解CRITICAL_SECTION 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

摘要


臨界區(qū)是一種防止多個線程同時執(zhí)行一個特定代碼節(jié)的機制,這一主題并沒有引起太多關注,因而人們未能對其深刻理解。在需要跟蹤代碼中的多線程處理的性能時,對?Windows?中臨界區(qū)的深刻理解非常有用。本文深入研究臨界區(qū)的原理,以揭示在查找死鎖和確認性能問題過程中的有用信息。它還包含一個便利的實用工具程序,可以顯示所有臨界區(qū)及其當前狀態(tài)。


在我們許多年的編程實踐中,對于 Win32 臨界區(qū)沒有受到非常多的“under the?hood”關注而感到非常奇怪。當然,您可能了解有關臨界區(qū)初始化與使用的基礎知識,但您是否曾經(jīng)花費時間來深入研究 WINNT.H 中所定義的?CRITICAL_SECTION?
結構呢?在這一結構中有一些非常有意義的好東西被長期忽略。我們將對此進行補充,并向您介紹一些很有意義的技巧,這些技巧對于跟蹤那些難以察覺的多線程處理錯誤非常有用。更重要的是,使用我們的?
MyCriticalSections 實用工具,可以明白如何對 CRITICAL_SECTION?
進行微小地擴展,以提供非常有用的特性,這些特性可用于調(diào)試和性能調(diào)整(要下載完整代碼,參見本文頂部的鏈接)。


老實說,作者們經(jīng)常忽略 CRITICAL_SECTION 結構的部分原因在于它在以下兩個主要 Win32 代碼庫中的實現(xiàn)有很大不同:Microsoft?
Windows 95 和 Windows NTH嗣侵勒飭街執(zhí)肟舛家丫⒄鉤齟罅亢笮姹荊ㄆ渥钚擄姹痙直鷂 Windows Me 和 Windows?
XP),但沒有必要在此處將其一一列出。關鍵在于 Windows XP 現(xiàn)在已經(jīng)發(fā)展得非常完善,開發(fā)商可能很快就會停止對 Windows 95?
系列操作系統(tǒng)的支持。我們在本文中就是這么做的。


誠然,當今最受關注的是 Microsoft .NET Framework,但是良好的舊式 Win32 編程不會很快消失。如果您擁有采用了臨界區(qū)的現(xiàn)有?
Win32 代碼,您會發(fā)現(xiàn)我們的工具以及對臨界區(qū)的說明都非常有用。但是請注意,我們只討論 Windows NT 及其后續(xù)版本,而沒有涉及與 .NET?
相關的任何內(nèi)容,這一點非常重要。


臨界區(qū):簡述


如果您非常熟悉臨界區(qū),并可以不假思索地進行應用,那就可以略過本節(jié)。否則,請向下閱讀,以對這些內(nèi)容進行快速回顧。如果您不熟悉這些基礎內(nèi)容,則本節(jié)之后的內(nèi)容就沒有太大意義。


臨界區(qū)是一種輕量級機制,在某一時間內(nèi)只允許一個線程執(zhí)行某個給定代碼段。通常在修改全局數(shù)據(jù)(如集合類)時會使用臨界區(qū)。事件、多用戶終端執(zhí)行程序和信號量也用于多線程同步,但臨界區(qū)與它們不同,它并不總是執(zhí)行向內(nèi)核模式的控制轉換,這一轉換成本昂貴。稍后將會看到,要獲得一個未占用臨界區(qū),事實上只需要對內(nèi)存做出很少的修改,其速度非常快。只有在嘗試獲得已占用臨界區(qū)時,它才會跳至內(nèi)核模式。這一輕量級特性的缺點在于臨界區(qū)只能用于對同一進程內(nèi)的線程進行同步。


臨界區(qū)由 WINNT.H 中所定義的 RTL_CRITICAL_SECTION 結構表示。因為您的 C++ 代碼通常聲明一個?
CRITICAL_SECTION 類型的變量,所以您可能對此并不了解。研究 WINBASE.H 后您會發(fā)現(xiàn):

typedef RTL_CRITICAL_SECTION CRITICAL_SECTION;

我們將在短時間內(nèi)揭示 RTL_CRITICAL_SECTION 結構的實質。此時,重要問題在于 CRITICAL_SECTION(也稱作?
RTL_CRITICAL_SECTION)只是一個擁有易訪問字段的結構,這些字段可以由 KERNEL32 API 操作。


在將臨界區(qū)傳遞給 InitializeCriticalSection?時(或者更準確地說,是在傳遞其地址時),臨界區(qū)即開始存在。初始化之后,代碼即將臨界區(qū)傳遞給 EnterCriticalSection 和?LeaveCriticalSection API。

一個線程自 EnterCriticalSection 中返回后,所有其他調(diào)用?EnterCriticalSection 的線程都將被阻止,直到第一個線程調(diào)用 LeaveCriticalSection?為止。最后,當不再需要該臨界區(qū)時,一種良好的編碼習慣是將其傳遞給 DeleteCriticalSection。


在臨界區(qū)未被使用的理想情況中,對 EnterCriticalSection?的調(diào)用非常快速,因為它只是讀取和修改用戶模式內(nèi)存中的內(nèi)存位置。否則(在后文將會遇到一種例外情況),阻止于臨界區(qū)的線程有效地完成這一工作,而不需要消耗額外的?CPU?周期。所阻止的線程以內(nèi)核模式等待,在該臨界區(qū)的所有者將其釋放之前,不能對這些線程進行調(diào)度。如果有多個線程被阻止于一個臨界區(qū)中,當另一線程釋放該臨界區(qū)時,只有一個線程獲得該臨界區(qū)。


深入研究:RTL_CRITICAL_SECTION 結構


即使您已經(jīng)在日常工作中使用過臨界區(qū),您也非常可能并沒有真正了解超出文檔之外的內(nèi)容。事實上存在著很多非常容易掌握的內(nèi)容。例如,人們很少知道一個進程的臨界區(qū)是保存于一個鏈表中,并且可以對其進行枚舉。實際上,WINDBG?支持 !locks?
命令,這一命令可以列出目標進程中的所有臨界區(qū)。我們稍后將要談到的實用工具也應用了臨界區(qū)這一鮮為人知的特征。為了真正理解這一實用工具如何工作,有必要真正掌握臨界區(qū)的內(nèi)部結構。記著這一點,現(xiàn)在開始研究?
RTL_CRITICAL_SECTION 結構。為方便起見,將此結構列出如下:

struct RTL_CRITICAL_SECTION {PRTL_CRITICAL_SECTION_DEBUG DebugInfo; LONG LockCount; LONG RecursionCount; HANDLE OwningThread; HANDLE LockSemaphore; ULONG_PTR SpinCount;};

以下各段對每個字段進行說明。


DebugInfo?此字段包含一個指針,指向系統(tǒng)分配的伴隨結構,該結構的類型為?
RTL_CRITICAL_SECTION_DEBUG。這一結構中包含更多極有價值的信息,也定義于 WINNT.H 中。我們稍后將對其進行更深入地研究。


LockCount?這是臨界區(qū)中最重要的一個字段。它被初始化為數(shù)值 -1;此數(shù)值等于或大于 0?
時,表示此臨界區(qū)被占用。當其不等于 -1 時,OwningThread 字段(此字段被錯誤地定義于 WINNT.H 中 — 應當是 DWORD 而不是?
HANDLE)包含了擁有此臨界區(qū)的線程 ID。此字段與 (RecursionCount -1) 數(shù)值之間的差值表示有多少個其他線程在等待獲得該臨界區(qū)。


RecursionCount?
此字段包含所有者線程已經(jīng)獲得該臨界區(qū)的次數(shù)。如果該數(shù)值為零,下一個嘗試獲取該臨界區(qū)的線程將會成功。


OwningThread?此字段包含當前占用此臨界區(qū)的線程的線程標識符。此線程 ID 與?
GetCurrentThreadId 之類的 API 所返回的 ID 相同。


LockSemaphore?
此字段的命名不恰當,它實際上是一個自復位事件,而不是一個信號。它是一個內(nèi)核對象句柄,用于通知操作系統(tǒng):該臨界區(qū)現(xiàn)在空閑。操作系統(tǒng)在一個線程第一次嘗試獲得該臨界區(qū),但被另一個已經(jīng)擁有該臨界區(qū)的線程所阻止時,自動創(chuàng)建這樣一個句柄。應當調(diào)用?
DeleteCriticalSection(它將發(fā)出一個調(diào)用該事件的 CloseHandle 調(diào)用,并在必要時釋放該調(diào)試結構),否則將會發(fā)生資源泄漏。


SpinCount?僅用于多處理器系統(tǒng)。MSDN?
文檔對此字段進行如下說明:“在多處理器系統(tǒng)中,如果該臨界區(qū)不可用,調(diào)用線程將在對與該臨界區(qū)相關的信號執(zhí)行等待操作之前,旋轉 dwSpinCount?
次。如果該臨界區(qū)在旋轉操作期間變?yōu)榭捎?#xff0c;該調(diào)用線程就避免了等待操作。”旋轉計數(shù)可以在多處理器計算機上提供更佳性能,其原因在于在一個循環(huán)中旋轉通常要快于進入內(nèi)核模式等待狀態(tài)。此字段默認值為零,但可以用?
InitializeCriticalSectionAndSpinCount API 將其設置為一個不同值。


RTL_CRITICAL_SECTION_DEBUG 結構


前面我們注意到,在 RTL_CRITICAL_SECTION 結構內(nèi),DebugInfo 字段指向一個?
RTL_CRITICAL_SECTION_DEBUG 結構,該結構給出如下:

struct _RTL_CRITICAL_SECTION_DEBUG { WORD Type; WORD CreatorBackTraceIndex; RTL_CRITICAL_SECTION *CriticalSection; LIST_ENTRY ProcessLocksList; DWORD EntryCount; DWORD ContentionCount; DWORD Spare[ 2 ]; }

這一結構由 InitializeCriticalSection 分配和初始化。它既可以由 NTDLL?
內(nèi)的預分配數(shù)組分配,也可以由進程堆分配。RTL_CRITICAL_SECTION?
的這一伴隨結構包含一組匹配字段,具有迥然不同的角色:有兩個難以理解,隨后兩個提供了理解這一臨界區(qū)鏈結構的關鍵,兩個是重復設置的,最后兩個未使用。


下面是對 RTL_CRITICAL_SECTION 字段的說明。


Type?此字段未使用,被初始化為數(shù)值 0。


CreatorBackTraceIndex?此字段僅用于診斷情形中。在注冊表項?
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution?
Options\YourProgram 之下是 keyfield、GlobalFlag 和 StackTraceDatabaseSizeInMb?
值。注意,只有在運行稍后說明的 Gflags 命令時才會顯示這些值。這些注冊表值的設置正確時,CreatorBackTraceIndex?
字段將由堆棧跟蹤中所用的一個索引值填充。在?MSDN?中搜索 GFlags 文檔中的短語“create user mode stack trace?
database”和“enlarging the user-mode stack trace database”,可以找到有關這一內(nèi)容的更多信息。


CriticalSection?指向與此結構相關的 RTL_CRITICAL_SECTION。圖?
1
?說明該基礎結構以及 RTL_CRITICAL_SECTION、RTL_CRITICAL_SECTION_DEBUG?
和事件鏈中其他參與者之間的關系。




圖 1 臨界區(qū)處理流程



ProcessLocksList?LIST_ENTRY 是用于表示雙向鏈表中節(jié)點的標準 Windows?
數(shù)據(jù)結構。RTL_CRITICAL_SECTION_DEBUG 包含了鏈表的一部分,允許向前和向后遍歷該臨界區(qū)。本文后面給出的實用工具說明如何使用?
Flink(前向鏈接)和 Blink(后向鏈接)字段在鏈表中的成員之間移動。任何從事過設備驅動程序或者研究過 Windows?
內(nèi)核的人都會非常熟悉這一數(shù)據(jù)結構。


EntryCount/ContentionCount?
這些字段在相同的時間、出于相同的原因被遞增。這是那些因為不能馬上獲得臨界區(qū)而進入等待狀態(tài)的線程的數(shù)目。與 LockCount 和 RecursionCount?
字段不同,這些字段永遠都不會遞減。


Spares?
這兩個字段未使用,甚至未被初始化(盡管在刪除臨界區(qū)結構時將這些字段進行了清零)。后面將會說明,可以用這些未被使用的字段來保存有用的診斷值。


即使 RTL_CRITICAL_SECTION_DEBUG?
中包含多個字段,它也是常規(guī)臨界區(qū)結構的必要成分。事實上,如果系統(tǒng)恰巧不能由進程堆中獲得這一結構的存儲區(qū),InitializeCriticalSection?
將返回為 STATUS_NO_MEMORY 的 LastError 結果,然后返回處于不完整狀態(tài)的臨界區(qū)結構。


臨界區(qū)狀態(tài)


當程序執(zhí)行、進入與離開臨界區(qū)時,RTL_CRITICAL_SECTION 和 RTL_CRITICAL_SECTION_DEBUG?
結構中的字段會根據(jù)臨界區(qū)所處的狀態(tài)變化。這些字段由臨界區(qū) API?
中的簿記代碼更新,在后面將會看到這一點。如果程序為多線程,并且其線程訪問是由臨界區(qū)保護的公用資源,則這些狀態(tài)就更有意義。


但是,不管代碼的線程使用情況如何,有兩種狀態(tài)都會出現(xiàn)。第一種情況,如果 LockCount 字段有一個不等于 -1?
的數(shù)值,此臨界區(qū)被占用,OwningThread 字段包含擁有該臨界區(qū)的線程的線程標識符。在多線程程序中,LockCount 與 RecursionCount?
聯(lián)合表明當前有多少線程被阻止于該臨界區(qū)。第二種情況,如果 RecursionCount 是一個大于 1?
的數(shù)值,其告知您所有者線程已經(jīng)重新獲得該臨界區(qū)多少次(也許不必要),該臨界區(qū)既可以通過調(diào)用 EnterCriticalSection、也可以通過調(diào)用?
TryEnterCriticalSection 獲得。大于 1 的任何數(shù)值都表示代碼的效率可能較低或者可能在以后發(fā)生錯誤。例如,訪問公共資源的任何 C++?
類方法可能會不必要地重新進入該臨界區(qū)。


注意,在大多數(shù)時間里,LockCount 與 RecursionCount 字段中分別包含其初始值 -1 和?
0,這一點非常重要。事實上,對于單線程程序,不能僅通過檢查這些字段來判斷是否曾獲得過臨界區(qū)。但是,多線程程序留下了一些標記,可以用來判斷是否有兩個或多個線程試圖同時擁有同一臨界區(qū)。


您可以找到的標記之一是即使在該臨界區(qū)未被占用時 LockSemaphore 字段中仍包含一個非零值。這表示:在某一時間,此臨界區(qū)阻止了一個或多個線程 —?
事件句柄用于通知該臨界區(qū)已被釋放,等待該臨界區(qū)的線程之一現(xiàn)在可以獲得該臨界區(qū)并繼續(xù)執(zhí)行。因為 OS?
在臨界區(qū)阻止另一個線程時自動分配事件句柄,所以如果您在不再需要臨界區(qū)時忘記將其刪除,LockSemaphore 字段可能會導致程序中發(fā)生資源泄漏。


在多線程程序中可能遇到的另一狀態(tài)是 EntryCount 和 ContentionCount?
字段包含一個大于零的數(shù)值。這兩個字段保存有臨界區(qū)對一個線程進行阻止的次數(shù)。在每次發(fā)生這一事件時,這兩個字段被遞增,但在臨界區(qū)存在期間不會被遞減。這些字段可用于間接確定程序的執(zhí)行路徑和特性。例如,EntryCount?
非常高時則意味著該臨界區(qū)經(jīng)歷著大量爭用,可能會成為代碼執(zhí)行過程中的一個潛在瓶頸。


在研究一個死鎖程序時,還會發(fā)現(xiàn)一種似乎無法進行邏輯解釋的狀態(tài)。一個使用非常頻繁的臨界區(qū)的 LockCount 字段中包含一個大于 -1?
的數(shù)值,也就是說它被線程所擁有,但是 OwningThread?
字段為零(這樣就無法找出是哪個線程導致問題)。測試程序是多線程的,在單處理器計算機和多處理器計算機中都會出現(xiàn)這種情況。盡管 LockCount?
和其他值在每次運行中都不同,但此程序總是死鎖于同一臨界區(qū)。我們非常希望知道是否有任何其他開發(fā)人員也遇到了導致這一狀態(tài)的 API 調(diào)用序列。


構建一個更好的捕鼠器


在我們學習臨界區(qū)的工作方式時,非常偶然地得到一些重要發(fā)現(xiàn),利用這些發(fā)現(xiàn)可以得到一個非常好的實用工具。第一個發(fā)現(xiàn)是 ProcessLocksList?
LIST_ENTRY?
字段的出現(xiàn),這使我們想到進程的臨界區(qū)可能是可枚舉的。另一個重大發(fā)現(xiàn)是我們知道了如何找出臨界區(qū)列表的頭。還有一個重要發(fā)現(xiàn)是可以在沒有任何損失的情況下寫?
RTL_CRITICAL_SECTION 的 Spare?
字段(至少在我們的所有測試中如此)。我們還發(fā)現(xiàn)可以很容易地重寫系統(tǒng)的一些臨界區(qū)例程,而不需要對源文件進行任何修改。


最初,我們由一個簡單的程序開始,其檢查一個進程中的所有臨界區(qū),并列出其當前狀態(tài),以查看是否擁有這些臨界區(qū)。如果擁有,則找出由哪個線程擁有,以及該臨界區(qū)阻止了多少個線程?這種做法對于?
OS 的狂熱者們比較適合,但對于只是希望有助于理解其程序的典型的程序員就不是非常有用了。


即使是在最簡單的控制臺模式“Hello World”程序中也存在許多臨界區(qū)。其中大部分是由 USER32 或 GDI32 之類的系統(tǒng) DLL 創(chuàng)建,而這些?
DLL 很少會導致死鎖或性能問題。我們希望有一種方法能濾除這些臨界區(qū),而只留下代碼中所關心的那些臨界區(qū)。RTL_CRITICAL_SECTION_DEBUG?
結構中的 Spare 字段可以很好地完成這一工作。可以使用其中的一個或兩個來指示:這些臨界區(qū)是來自用戶編寫的代碼,而不是來自 OS。


于是,下一個邏輯問題就變?yōu)槿绾未_定哪些臨界區(qū)是來自您編寫的代碼。有些讀者可能還記得 Matt Pietrek 2001 年 1 月的?Under The Hood?專欄中的 LIBCTINY.LIB。LIBCTINY 所采用的一個技巧是一個 LIB?
文件,它重寫了關鍵 Visual C++ 運行時例程的標準實現(xiàn)。將 LIBCTINY.LIB 文件置于鏈接器行的其他 LIB?
之前,鏈接器將使用這一實現(xiàn),而不是使用 Microsoft 所提供的導入庫中的同名后續(xù)版本。


為對臨界區(qū)應用類似技巧,我們創(chuàng)建 InitializeCriticalSection 的一個替代版本及其相關導入庫。將此 LIB 文件置于?
KERNEL32.LIB 之前,鏈接器將鏈接我們的版本,而不是 KERNEL32 中的版本。對 InitializeCriticalSection?
的實現(xiàn)顯示在圖 2?中。此代碼在概念上非常簡單。它首先調(diào)用 KERNEL32.DLL 中的實際?
InitializeCriticalSection。接下來,它獲得調(diào)用 InitializeCriticalSection 的代碼地址,并將其貼至?
RTL_CRITICAL_SECTION_DEBUG 結構的備用字段之一。我們的代碼如何確定調(diào)用代碼的地址呢?x86 CALL?
指令將返回地址置于堆棧中。CriticalSectionHelper 代碼知道該返回地址位于堆棧幀中一個已知的固定位置。


實際結果是:與 CriticalSectionHelper.lib 正確鏈接的任何 EXE 或 DLL 都將導入我們的 DLL?
(CriticalSectionHelper.DLL),并占用應用了備用字段的臨界區(qū)。這樣就使事情簡單了許多。現(xiàn)在我們的實用工具可以簡單地遍歷進程中的所有臨界區(qū),并且只顯示具有正確填充的備用字段的臨界區(qū)信息。那么需要為這一實用工具付出什么代價呢?請稍等,還有更多的內(nèi)容!


因為您的所有臨界區(qū)現(xiàn)在都包含對其進行初始化時的地址,實用工具可以通過提供其初始化地址來識別各個臨界區(qū)。原始代碼地址本身沒有那么有用。幸運的是,DBGHELP.DLL?
使代碼地址向源文件、行號和函數(shù)名稱的轉換變得非常容易。即使一個臨界區(qū)中沒有您在其中的簽名,也可以將其地址提交給?
DBGHELP.DLL。如果將其聲明為一個全局變量,并且如果符號可用,則您就可以在原始源代碼中確定臨界區(qū)的名稱。順便說明一下,如果通過設置?
_NT_SYMBOL_PATH 環(huán)境變量,并設置 DbgHelp 以使用其 Symbol Server 下載功能,從而使 DbgHelp?
發(fā)揮其效用,則會得到非常好的結果。


MyCriticalSections 實用工具


我們將所有這些思想結合起來,提出了 MyCriticalSections 程序。MyCriticalSections?
是一個命令行程序,在不使用參數(shù)運行該程序時可以看到一些選項:

Syntax: MyCriticalSections <PID> [options] Options: /a = all critical sections /e = show only entered critical sections /v = verbose

唯一需要的參數(shù)是 Program ID 或 PID(十進制形式)。可以用多種方法獲得 PID,但最簡單的方法可能就是通過 Task?
Manager。在沒有其他選項時,MyCriticalSections 列出了來自代碼模塊的所有臨界區(qū)狀態(tài),您已經(jīng)將?
CriticalSectionHelper.DLL?
鏈接至這些代碼模塊。如果有可用于這一(些)模塊的符號,代碼將嘗試提供該臨界區(qū)的名稱,以及對其進行初始化的位置。


要查看 MyCriticalSections 是如何起作用的,請運行 Demo.EXE 程序,該程序包含在下載文件中。Demo.EXE?
只是初始化兩個臨界區(qū),并由一對線程進入這兩個臨界區(qū)。圖 3?顯示運行“MyCriticalSections 2040”的結果(其中 2040 為 Demo.EXE 的?
PID)。


在該圖中,列出了兩個臨界區(qū)。在本例中,它們被命名為 csMain 和 yetAnotherCriticalSection。每個“Address:”行顯示了?
CRITICAL_SECTION 的地址及其名稱。“Initialized in”行包含了在其中初始化 CRITICAL_SECTION?
的函數(shù)名。代碼的“Initialized at”行顯示了源文件和初始化函數(shù)中的行號。


對于 csMain 臨界區(qū),您將看到鎖定數(shù)為 0、遞歸數(shù)為?
1,表示一個已經(jīng)被一線程獲得的臨界區(qū),并且沒有其他線程在等待該臨界區(qū)。因為從來沒有線程被阻止于該臨界區(qū),所以 Entry Count 字段為 0。


現(xiàn)在來看 yetAnotherCriticalSection,會發(fā)現(xiàn)其遞歸數(shù)為 3。快速瀏覽 Demo 代碼可以看出:主線程調(diào)用?
EnterCriticalSection 三次,所以事情的發(fā)生與預期一致。但是,還有一個第二線程試圖獲得該臨界區(qū),并且已經(jīng)被阻止。同樣,LockCount?
字段也為 3。此輸出顯示有一個等待線程。


MyCriticalSections 擁有一些選項,使其對于更為勇敢的探索者非常有用。/v?
開關顯示每個臨界區(qū)的更多信息。旋轉數(shù)與鎖定信號字段尤為重要。您經(jīng)常會看到 NTDLL 和其他 DLL?
擁有一些旋轉數(shù)非零的臨界區(qū)。如果一個線程在獲得臨界區(qū)的過程中曾被鎖定,則鎖定信號字段為非零值。/v 開關還顯示了?
RTL_CRITICAL_SECTION_DEBUG 結構中備用字段的內(nèi)容。


/a 開關顯示進程中的所有臨界區(qū),即使其中沒有 CriticalSectionHelper.DLL 簽名也會顯示。如果使用?
/a,則請做好有大量輸出的準備。真正的黑客希望同時使用 /a 和 /v,以顯示進程中全部內(nèi)容的最多細節(jié)。使用 /a 的一個小小的好處是會看到 NTDLL?
中的LdrpLoaderLock 臨界區(qū)。此臨界區(qū)在 DllMain 調(diào)用和其他一些重要時間內(nèi)被占用。LdrpLoaderLock?
是許多不太明顯、表面上難以解釋的死鎖的形成原因之一。(為使 MyCriticalSection 能夠正確標記 LdrpLoaderLock 實例,需要用于?
NTDLL 的 PDB 文件可供使用。)


/e 開關使程序僅顯示當前被占用的臨界區(qū)。未使用 /a 開關時,只顯示代碼中被占用的臨界區(qū)(如備用字段中的簽名所指示)。采用 /a?
開關時,將顯示進程中的全部被占用臨界區(qū),而不考慮其來源。


那么,希望什么時候運行 MyCriticalSections?
呢?一個很明確的時間是在程序被死鎖時。檢查被占用的臨界區(qū),以查看是否有什么使您驚訝的事情。即使被死鎖的程序正運行于調(diào)試器的控制之下,也可以使用?
MyCriticalSections。


另一種使用 MyCriticalSections 的時機是在對有大量多線程的程序進行性能調(diào)整時。在阻塞于調(diào)試器中的一個使用頻繁、非重入函數(shù)時,運行?
MyCriticalSections,查看在該時刻占用了哪些臨界區(qū)。如果有很多線程都執(zhí)行相同任務,就非常容易導致一種情形:一個線程的大部分時間被消耗在等待獲得一個使用頻繁的臨界區(qū)上。如果有多個使用頻繁的臨界區(qū),這造成的后果就像花園的澆水軟管打了結一樣。解決一個爭用問題只是將問題轉移到下一個容易造成阻塞的臨界區(qū)。


一個查看哪些臨界區(qū)最容易導致爭用的好方法是在接近程序結尾處設置一個斷點。在遇到斷點時,運行 MyCriticalSections 并查找具有最大?
Entry Count 值的臨界區(qū)。正是這些臨界區(qū)導致了大多數(shù)阻塞和線程轉換。


盡管 MyCriticalSections 運行于 Windows 2000 及更新版本,但您仍需要一個比較新的 DbgHelp.DLL 版本 - 5.1?
版或更新版本。Windows XP 中提供這一版本。也可以由其他使用 DbgHelp 的工具中獲得該版本。例如,Debugging Tools For Windows?下載中通常擁有最新的 DbgHelp.DLL。


深入研究重要的臨界區(qū)例程


此最后一節(jié)是為那些希望理解臨界區(qū)實現(xiàn)內(nèi)幕的勇敢讀者提供的。對 NTDLL 進行仔細研究后可以為這些例程及其支持子例程創(chuàng)建偽碼(見下載中的?
NTDLL(CriticalSections).cpp)。以下 KERNEL32 API 組成臨界區(qū)的公共接口:

InitializeCriticalSection InitializeCriticalSectionAndSpinCount DeleteCriticalSection TryEnterCriticalSection EnterCriticalSection LeaveCriticalSection

前兩個 API 只是分別圍繞 NTDLL API RtlInitializeCriticalSection 和?
RtlInitializeCriticalSectionAndSpinCount 的瘦包裝。所有剩余例程都被提交給 NTDLL 中的函數(shù)。另外,對?
RtlInitializeCriticalSection 的調(diào)用是另一個圍繞 RtlInitializeCriticalSectionAndSpinCount?
調(diào)用的瘦包裝,其旋轉數(shù)的值為 0。使用臨界區(qū)的時候實際上是在幕后使用以下 NTDLL API:

RtlInitializeCriticalSectionAndSpinCount RtlEnterCriticalSection RtlTryEnterCriticalSection RtlLeaveCriticalSection RtlDeleteCriticalSection

在這一討論中,我們采用 Kernel32 名稱,因為大多數(shù) Win32 程序員對它們更為熟悉。


InitializeCriticalSectionAndSpinCount 對臨界區(qū)的初始化非常簡單。RTL_CRITICAL_SECTION?
結構中的字段被賦予其起始值。與此類似,分配 RTL_CRITICAL_SECTION_DEBUG 結構并對其進行初始化,將?
RtlLogStackBackTraces 調(diào)用中的返回值賦予 CreatorBackTraceIndex,并建立到前面臨界區(qū)的鏈接。


順便說一聲,CreatorBackTraceIndex 一般接收到的值為 0。但是,如果有 Gflags 和 Umdh?
實用工具,可以輸入以下命令:

Gflags /i MyProgram.exe +ust Gflags /i MyProgram.exe /tracedb 24

這些命令使得 MyProgram 的“Image File Execution Options”下添加了注冊表項。在下一次執(zhí)行 MyProgram?
時會看到此字段接收到一個非 0 數(shù)值。有關更多信息,參閱知識庫文章 Q268343“Umdhtools.exe:How to Use Umdh.exe to Find Memory?
Leaks”。臨界區(qū)初始化中另一個需要注意的問題是:前 64 個 RTL_CRITICAL_SECTION_DEBUG?
結構不是由進程堆中分配,而是來自位于 NTDLL 內(nèi)的 .data 節(jié)的一個數(shù)組。


在完成臨界區(qū)的使用之后,對 DeleteCriticalSection(其命名不當,因為它只刪除 RTL_CRITICAL_SECTION_?
DEBUG)的調(diào)用遍歷一個同樣可理解的路徑。如果由于線程在嘗試獲得臨界區(qū)時被阻止而創(chuàng)建了一個事件,將通過調(diào)用 ZwClose 來銷毀該事件。接下來,在通過?
RtlCriticalSectionLock 獲得保護之后(NTDLL 以一個臨界區(qū)保護它自己的內(nèi)部臨界區(qū)列表 —?
您猜對了),將調(diào)試信息從鏈中清除,對該臨界區(qū)鏈表進行更新,以反映對該信息的清除操作。該內(nèi)存由空值填充,并且如果其存儲區(qū)是由進程堆中獲得,則調(diào)用?
RtlFreeHeap 將使得其內(nèi)存被釋放。最后,以零填充 RTL_CRITICAL_SECTION。


有兩個 API 要獲得受臨界區(qū)保護的資源 — TryEnterCriticalSection 和?
EnterCriticalSection。如果一個線程需要進入一個臨界區(qū),但在等待被阻止資源變?yōu)榭捎玫耐瑫r,可執(zhí)行有用的工作,那么?
TryEnterCriticalSection 正是您需要的 API。此例程測試此臨界區(qū)是否可用;如果該臨界區(qū)被占用,該代碼將返回值?
FALSE,為該線程提供繼續(xù)執(zhí)行另一任務的機會。否則,其作用只是相當于 EnterCriticalSection。


如果該線程在繼續(xù)進行之前確實需要擁有該資源,則使用 EnterCriticalSection。此時,取消用于多處理器計算機的 SpinCount?
測試。這一例程與 TryEnterCriticalSection 類似,無論該臨界區(qū)是空閑的或已經(jīng)被該線程所擁有,都調(diào)整對該臨界區(qū)的簿記。注意,最重要的?
LockCount 遞增是由 x86“l(fā)ock”前綴完成的,這一點非常重要。這確保了在某一時間內(nèi)只有一個 CPU 可以修改該 LockCount?
字段。(事實上,Win32 InterlockedIncrement API 只是一個具有相同鎖定前綴的 ADD 指令。)


如果調(diào)用線程無法立即獲得該臨界區(qū),則調(diào)用 RtlpWaitForCriticalSection?
將該線程置于等待狀態(tài)。在多處理器系統(tǒng)中,EnterCriticalSection 旋轉 SpinCount?
所指定的次數(shù),并在每次循環(huán)訪問中測試該臨界區(qū)的可用性。如果此臨界區(qū)在循環(huán)期間變?yōu)榭臻e,該線程獲得該臨界區(qū),并繼續(xù)執(zhí)行。


RtlpWaitForCriticalSection?
可能是這里所給的所有過程中最為復雜、最為重要的一個。這并不值得大驚小怪,因為如果存在一個死鎖并涉及臨界區(qū),則利用調(diào)試器進入該進程就可能顯示出?
RtlpWaitForCriticalSection 內(nèi) ZwWaitForSingleObject 調(diào)用中的至少一個線程。


如偽碼中所顯示,在 RtlpWaitForCriticalSection 中有一點簿記工作,如遞增 EntryCount 和?
ContentionCount 字段。但更重要的是:發(fā)出對 LockSemaphore 的等待,以及對等待結果的處理。默認情況是將一個空指針作為第三個參數(shù)傳遞給?
ZwWaitForSingleObject?
調(diào)用,請求該等待永遠不要超時。如果允許超時,將生成調(diào)試消息字符串,并再次開始等待。如果不能從等待中成功返回,就會產(chǎn)生中止該進程的錯誤。最后,在從?
ZwWaitForSingleObject 調(diào)用中成功返回時,則執(zhí)行從 RtlpWaitForCriticalSection?
返回,該線程現(xiàn)在擁有該臨界區(qū)。


RtlpWaitForCriticalSection 必須認識到的一個臨界條件是該進程正在被關閉,并且正在等待加載程序鎖定?
(LdrpLoaderLock) 臨界區(qū)。RtlpWaitForCriticalSection 一定不能?
允許該線程被阻止,但是必須跳過該等待,并允許繼續(xù)進行關閉操作。


LeaveCriticalSection 不像 EnterCriticalSection 那樣復雜。如果在遞減 RecursionCount?
之后,結果不為 0(意味著該線程仍然擁有該臨界區(qū)),則該例程將以 ERROR_SUCCESS 狀態(tài)返回。這就是為什么需要用適當數(shù)目的 Leave 調(diào)用來平衡?
Enter 調(diào)用。如果該計數(shù)為 0,則 OwningThread 字段被清零,LockCount 被遞減。如果還有其他線程在等待,例如 LockCount?
大于或等于 0,則調(diào)用 RtlpUnWaitCriticalSection。此幫助器例程創(chuàng)建?
LockSemaphore(如果其尚未存在),并發(fā)出該信號提醒操作系統(tǒng):該線程已經(jīng)釋放該臨界區(qū)。作為通知的一部分,等待線程之一退出等待狀態(tài),為運行做好準備。


最后要說明的一點是,MyCriticalSections 程序如何確定臨界區(qū)鏈的起始呢?如果有權訪問 NTDLL?
的正確調(diào)試符號,則對該列表的查找和遍歷非常簡單。首先,定位符號 RtlCriticalSectionList,清空其內(nèi)容(它指向第一個?
RTL_CRITICAL_SECTION_DEBUG 結構),并開始遍歷。但是,并不是所有的系統(tǒng)都有調(diào)試符號,RtlCriticalSectionList?
變量的地址會隨 Windows?
的各個版本而發(fā)生變化。為了提供一種對所有版本都能正常工作的解決方案,我們設計了以下試探性方案。觀察啟動一個進程時所采取的步驟,會看到是以以下順序對 NTDLL?
中的臨界區(qū)進行初始化的(這些名稱取自 NTDLL 的調(diào)試符號):

RtlCriticalSectionLock DeferedCriticalSection (this is the actual spelling!) LoaderLock FastPebLock RtlpCalloutEntryLock PMCritSect UMLogCritSect RtlpProcessHeapsListLock

因為檢查進程環(huán)境塊 (PEB) 中偏移量 0xA0?
處的地址就可以找到加載程序鎖,所以對該鏈起始位置的定位就變得比較簡單。我們讀取有關加載程序鎖的調(diào)試信息,然后沿著鏈向后遍歷兩個鏈接,使我們定位于?
RtlCriticalSectionLock 項,在該點得到該鏈的第一個臨界區(qū)。有關其方法的說明,請參見圖 4




圖 4 初始化順序



小結


幾乎所有的多線程程序均使用臨界區(qū)。您遲早都會遇到一個使代碼死鎖的臨界區(qū),并且會難以確定是如何進入當前狀態(tài)的。如果能夠更深入地了解臨界區(qū)的工作原理,則這一情形的出現(xiàn)就不會像首次出現(xiàn)時那樣的令人沮喪。您可以研究一個看來非常含糊的臨界區(qū),并確定是誰擁有它,以及其他有用細節(jié)。如果您愿意將我們的庫加入您的鏈接器行,則可以容易地獲得有關您程序臨界區(qū)使用的大量信息。通過利用臨界區(qū)結構中的一些未用字段,我們的代碼可以僅隔離并命名您的模塊所用的臨界區(qū),并告知其準確狀態(tài)。


有魄力的讀者可以很容易地對我們的代碼進行擴展,以完成更為異乎尋常的工作。例如,采用與 InitializeCriticalSection?
掛鉤相類似的方式截獲 EnterCriticalSection 和?
LeaveCriticalSection,可以存儲最后一次成功獲得和釋放該臨界區(qū)的位置。與此類似,CritSect DLL 擁有一個易于調(diào)用的?
API,用于枚舉您自己的代碼中的臨界區(qū)。利用 .NET Framework 中的 Windows 窗體,可以相對容易地創(chuàng)建一個 GUI 版本的?
MyCriticalSections。對我們代碼進行擴展的可能性非常大,我們非常樂意看到其他人員所發(fā)現(xiàn)和創(chuàng)造的創(chuàng)新性辦法。


有關文章,請參閱:
Global Flag Reference:Create kernel mode stack trace?
database
GFlags Examples:Enlarging the User-Mode Stack Trace?
Database
Under the Hood:Reduce EXE and DLL Size with LIBCTINY.LIB


Matt Pietrek?是一位軟件架構師和作者。他就職于 Compuware/NuMega 實驗室,身份為?
BoundsChecker 和“分布式分析器”產(chǎn)品的首席架構師。他已經(jīng)創(chuàng)作了三本有關 Windows 系統(tǒng)編程的書籍,并是?MSDN?
Magazine?的特約編輯。他的 Web 站點 (http://www.wheaty.net) 有關于以前文章和專欄的 FAQ 和信息。


Jay Hilyard?是 Compuware/NuMega 實驗室的 BoundsChecker?
小組的軟件工程師。他、他的妻子和他們的貓是新罕布什爾州的新居民。他的聯(lián)系方式為?RussOsterlund@adelphia.net?或 Web 站點?http://www.smidgeonsoft.com。


轉到原英文頁面

轉自:http://www.cnblogs.com/dirichlet/archive/2011/03/16/1986251.html

---------------------------------------------------------------------------------------------------------------------------

對于EnterCriticalSection和LeaveCriticalSection的理解和用法

線程鎖的概念函數(shù)EnterCriticalSection和LeaveCriticalSection的用法

注:使用結構CRITICAL_SECTION 需加入頭文件#include “afxmt.h”

定義一個全局的鎖 CRITICAL_SECTION的實例
和一個靜態(tài)全局變量

  • CRITICAL_SECTIONcs;// 臨界區(qū)的聲明
  • static?intn_AddValue?=?0;//定義一個靜態(tài)的全部變量n_AddValue
  • 創(chuàng)建兩個線程函數(shù),代碼實現(xiàn)如下:

  • //第一個線程
  • UINT?FirstThread(LPVOIDlParam)
  • {
  • ? ??EnterCriticalSection(&cs);//進入臨界區(qū),對需要保護的資源進行操作
  • ? ??for(int?i?=0;?i<10;i++){? ? ? ?
  • ? ? ? ??n_AddValue?++;
  • ? ? ? ??cout?<<"n_AddValue in FirstThread is"<<n_AddValue?<<endl;? ? ? ?
  • ? ?
  • ? ??}
  • ? ??LeaveCriticalSection(&cs);//離開臨界區(qū)? ?
  • ? ??return?0;
  • ?
  • }
  • ?
  • //第二個線程
  • UINT?SecondThread(LPVOIDlParam)
  • {
  • ? ??EnterCriticalSection(&cs);//進入臨界區(qū)
  • ? ??for(int?i?=0;?i<10;i++){? ? ? ?
  • ? ? ? ??n_AddValue?++;? ? ? ?
  • ? ? ? ??cout?<<"n_AddValue in SecondThread is"<<n_AddValue?<<endl;? ?
  • ? ? ? ?
  • ? ??}
  • ? ??LeaveCriticalSection(&cs);//離開臨界區(qū)
  • ?
  • ? ??return?0;
  • ?
  • }
  • 在主函數(shù)添加以下代碼

  • int_tmain(intargc,?TCHAR*argv[],TCHAR*?envp[])
  • {
  • ? ??int?nRetCode?=0;
  • ?
  • ? ??// 初始化 MFC 并在失敗時顯示錯誤
  • ? ??if?(!AfxWinInit(::GetModuleHandle(NULL),NULL, ::GetCommandLine(),0))
  • ? ??{
  • ? ? ? ??// TODO: 更改錯誤代碼以符合您的需要
  • ? ? ? ??_tprintf(_T("錯誤: MFC 初始化失敗/n"));
  • ? ? ? ??nRetCode?=1;
  • ? ??}
  • ? ??else
  • ? ??{
  • ?
  • ? ? ? ??InitializeCriticalSection(&cs);//初始化臨界區(qū)
  • ?
  • ?
  • ? ? ? ??CWinThread?*pFirstThread,*pSecondThread;//存儲函數(shù)AfxBeginThread返回的CWinThread指針
  • ? ? ? ?
  • ?
  • ? ? ? ??pFirstThread? =AfxBeginThread(FirstThread,LPVOID(NULL));//啟動第一個線程
  • ? ? ? ??pSecondThread?=AfxBeginThread(SecondThread,LPVOID(NULL));//啟動第二個線程
  • ?
  • ? ? ? ??HANDLE?hThreadHandle[2];//
  • ? ? ? ??hThreadHandle[0]?=pFirstThread->m_hThread;
  • ? ? ? ??hThreadHandle[1]?=pSecondThread->m_hThread;
  • ?
  • ? ? ? ??//等待線程返回
  • ? ? ? ??WaitForMultipleObjects(2,hThreadHandle,TRUE,INFINITE);? ? ? ?
  • ? ??}
  • ?
  • ? ??return?nRetCode;
  • }
  • 輸出:

    n_AddValue in FirstThread is 1
    n_AddValue in FirstThread is 2
    n_AddValue in FirstThread is 3
    n_AddValue in FirstThread is 4
    n_AddValue in FirstThread is 5
    n_AddValue in FirstThread is 6
    n_AddValue in FirstThread is 7
    n_AddValue in FirstThread is 8
    n_AddValue in FirstThread is 9
    n_AddValue in FirstThread is 10
    n_AddValue in SecondThread is 11
    n_AddValue in SecondThread is 12
    n_AddValue in SecondThread is 13
    n_AddValue in SecondThread is 14
    n_AddValue in SecondThread is 15
    n_AddValue in SecondThread is 16
    n_AddValue in SecondThread is 17
    n_AddValue in SecondThread is 18
    n_AddValue in SecondThread is 19
    n_AddValue in SecondThread is 20

    如果把兩個線程函數(shù)中的EnterCriticalSection和LeaveCriticalSection位置移到for循環(huán)中去,線程的執(zhí)行順序將會改變
    輸出也就跟著改變,如:

  • //第一個線程
  • UINT?FirstThread(LPVOIDlParam)
  • {
  • ? ?
  • ? ??for(int?i?=0;?i<10;i++){
  • ? ? ? ??EnterCriticalSection(&cs);///進入臨界區(qū),臨界區(qū)移到for循環(huán)內(nèi)部里
  • ? ? ? ??n_AddValue?++;
  • ? ? ? ??cout?<<"n_AddValue in FirstThread is"<<n_AddValue?<<endl;? ?
  • ? ? ? ??LeaveCriticalSection(&cs);//離開臨界區(qū)
  • ? ??}? ?
  • ? ??return?0;
  • }
  • ?
  • //第二個線程
  • UINT?SecondThread(LPVOIDlParam)
  • {
  • ? ?
  • ? ??for(int?i?=0;?i<10;i++){? ?
  • ? ? ? ??EnterCriticalSection(&cs);//進入臨界區(qū)
  • ? ? ? ??n_AddValue?++;? ? ? ?
  • ? ? ? ??cout?<<"n_AddValue in SecondThread is"<<n_AddValue?<<endl;
  • ? ? ? ??LeaveCriticalSection(&cs);?//離開臨界區(qū)
  • ? ??}
  • ? ??return?0;
  • }
  • 其他代碼不變,輸出的結果如下:

    n_AddValue in FirstThread is 1
    n_AddValue in SecondThread is 2
    n_AddValue in FirstThread is 3
    n_AddValue in SecondThread is 4
    n_AddValue in FirstThread is 5
    n_AddValue in SecondThread is 6
    n_AddValue in FirstThread is 7
    n_AddValue in SecondThread is 8
    n_AddValue in FirstThread is 9
    n_AddValue in SecondThread is 10
    n_AddValue in FirstThread is 11
    n_AddValue in SecondThread is 12
    n_AddValue in FirstThread is 13
    n_AddValue in SecondThread is 14
    n_AddValue in FirstThread is 15
    n_AddValue in SecondThread is 16
    n_AddValue in FirstThread is 17
    n_AddValue in SecondThread is 18
    n_AddValue in FirstThread is 19
    n_AddValue in SecondThread is 20


    另外,很多人對CRITICAL_SECTION的理解是錯誤的,認為CRITICAL_SECTION是鎖定了資源,其實,CRITICAL_SECTION是不能夠“鎖定”資源的,它能夠完成的功能,是同步不同線程的代碼段。簡單說,當一個線程執(zhí)行了EnterCritialSection之后,cs里面的信息便被修改了,以指明哪一個線程占用了它。而此時,并沒有任何資源被“鎖定”。不管什么資源,其它線程都還是可以訪問的(當然,執(zhí)行的結果可能是錯誤的)。只不過,在這個線程尚未執(zhí)行LeaveCriticalSection之前,其它線程碰到EnterCritialSection語句的話,就會處于等待狀態(tài),相當于線程被掛起了。 這種情況下,就起到了保護共享資源的作用。?
    ????? 也正由于CRITICAL_SECTION是這樣發(fā)揮作用的,所以,必須把每一個線程中訪問共享資源的語句都放在EnterCritialSection和LeaveCriticalSection之間。這是初學者很容易忽略的地方。
    當然,上面說的都是對于同一個CRITICAL_SECTION而言的。 如果用到兩個CRITICAL_SECTION,比如說:?
    第一個線程已經(jīng)執(zhí)行了EnterCriticalSection(&cs)并且還沒有執(zhí)行LeaveCriticalSection(&cs),這時另一個線程想要執(zhí)行EnterCriticalSection(&cs2),這種情況是可以的(除非cs2已經(jīng)被第三個線程搶先占用了)。 這也就是多個CRITICAL_SECTION實現(xiàn)同步的思想。


    總結

    以上是生活随笔為你收集整理的深入理解CRITICAL_SECTION的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    久久99精品国产麻豆婷婷 | 亚洲欧洲中文日韩久久av乱码 | 久久这里只有精品1 | 日本中文字幕在线观看 | 成人av影院在线观看 | 日本黄色特级片 | 天天激情综合网 | 天干啦夜天干天干在线线 | 免费h视频 | 亚洲天堂网在线观看视频 | 久久精品96 | 日韩视频在线播放 | 日韩精品一区二区三区在线视频 | 一级a性色生活片久久毛片波多野 | 久久视频在线观看中文字幕 | 久久久影院官网 | 国产精品人成电影在线观看 | 中文十次啦 | 国产亚洲在线 | 久保带人 | 成人小电影在线看 | 国产日产在线观看 | 久久99精品国产麻豆宅宅 | 欧美一级艳片视频免费观看 | 亚洲精品国产精品国产 | 欧美片网站yy | 国产一及片 | 超碰人人国产 | 日韩精品免费一线在线观看 | 天天操人 | 综合婷婷丁香 | 日韩精品一区二区三区水蜜桃 | 久久国产精品免费看 | 99热免费在线 | 国产精品日韩高清 | 97成人免费 | 五月婷婷在线播放 | 国产精品不卡在线播放 | 亚洲一区久久 | 日本九九视频 | 久久av影院 | 国产精品久久久久久久电影 | 国产一区二区不卡视频 | 一区二区三区视频 | 九色精品免费永久在线 | 狠狠狠色丁香婷婷综合久久88 | 午夜狠狠操 | 欧美久久久久久久久久久久久 | 中文字幕资源网 国产 | 欧美日韩亚洲第一 | 欧美性爽爽 | 久久久国产精品亚洲一区 | 人人爱爱人人 | 久久精品1区 | 久热国产视频 | 九九99 | 99热日本 | 日韩精品一区二区三区丰满 | 久久午夜免费观看 | 91av视频网站 | 久草在线在线精品观看 | 免费成人短视频 | 国产女人40精品一区毛片视频 | 在线视频日韩一区 | 在线观看黄| 日韩午夜三级 | 日韩精品一区二区三区免费观看视频 | 国产精品亚州 | 亚洲 欧洲 国产 精品 | 色婷婷亚洲 | 99视频一区二区 | 五月天狠狠操 | 国产成人精品女人久久久 | 欧美精品九九99久久 | 久草在线综合 | 一区二区三区久久 | 亚洲第一区精品 | 日韩中出在线 | 97人人模人人爽人人喊网 | 中文字幕在线观看不卡 | 97超碰国产精品 | 久久久久观看 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 日韩高清观看 | 999国产在线 | 亚洲另类xxxx | 韩日电影在线 | 婷婷国产一区二区三区 | 国产一区二区三区四区在线 | 亚洲一级性| 精品福利视频在线观看 | 亚洲精品在线视频网站 | 亚洲最大的av网站 | 国产美女免费观看 | 综合网伊人 | 欧美日韩视频网站 | 亚洲成人午夜在线 | 欧美一级激情 | 国产日韩欧美在线一区 | 99久久精品免费视频 | 欧美日韩一区二区三区免费视频 | 国产五十路毛片 | 亚洲最新在线视频 | 国产精品免费观看国产网曝瓜 | 丁香综合网 | 免费手机黄色网址 | 不卡电影免费在线播放一区 | 深爱激情av | 精品九九久久 | 欧美夫妻性生活电影 | 狠狠躁夜夜躁人人爽视频 | av看片在线 | 在线观看黄色国产 | 在线免费观看的av | 久草视频免费在线观看 | 久久不卡日韩美女 | 伊人网av| 日韩视频1| 天堂入口网站 | 成人av中文字幕在线观看 | a视频免费 | 在线成人中文字幕 | 手机看片 | 免费观看十分钟 | 欧美aa一级片 | 97夜夜澡人人爽人人免费 | 人人澡人 | 欧美国产日韩在线观看 | 欧美一二三四在线 | 日本天天色 | 中文字幕视频一区二区 | 国产精品一区二区麻豆 | 手机av网站 | 亚洲国产伊人 | 天天操天天谢 | 精品xxx| 日韩综合一区二区三区 | 欧美三级高清 | 超碰在线日本 | 国产成人精品午夜在线播放 | 午夜婷婷在线播放 | 天天av资源 | 色99之美女主播在线视频 | 久久久2o19精品 | 日本久久精品 | 亚洲精品乱码 | 国产一级电影 | 久久这里只有精品视频首页 | 午夜影院一区 | 日韩欧美一区二区在线播放 | 国产传媒中文字幕 | 一区二区中文字幕在线观看 | 国产精品久久久久久久久久三级 | 亚洲成人蜜桃 | 爱色婷婷| 国产一区在线免费 | 久久久久网址 | 久草视频免费 | 高清精品在线 | 亚洲精品国偷自产在线91正片 | 国产经典三级 | 国产成人免费高清 | 波多野结衣在线中文字幕 | 国内三级在线观看 | 九九免费观看全部免费视频 | 丁香婷婷久久 | 亚洲丁香久久久 | 国产 欧美 在线 | av成人免费在线观看 | 欧美午夜久久 | 在线视频1卡二卡三卡 | av成人免费 | 欧美久久久久久久久久久久久 | www麻豆视频 | aaawww | 国产一在线精品一区在线观看 | 黄色免费视频在线观看 | 国产精品国产毛片 | 国产在线久久久 | 国产亚洲精品福利 | 黄色亚洲免费 | 青春草视频在线播放 | 久久久久久久久亚洲精品 | 在线观看国产一区 | 日韩一级理论片 | 97视频在线观看网址 | 九九免费观看视频 | 国产免费亚洲 | 亚洲国产中文字幕在线视频综合 | 亚洲成人蜜桃 | 国产天天爽 | 黄网站免费大全入口 | 午夜精品久久久久久久久久久 | 国产美女视频免费 | 午夜国产福利视频 | 黄av在线| av免费在线播放 | 国产精品成人在线观看 | 久草在线在线 | 一区二区三区在线不卡 | 午夜少妇| 色播五月激情五月 | 可以免费看av | 亚洲精品日韩一区二区电影 | 欧美日韩一级久久久久久免费看 | 中文一区二区三区在线观看 | 国产一级久久久 | 欧美日韩免费一区 | 91女子私密保健养生少妇 | 成人免费在线网 | 国产亚洲精品无 | 亚州免费视频 | 久久综合99 | 91成人蝌蚪 | 日韩免费在线一区 | 黄色毛片观看 | av午夜电影 | 久久精品中文视频 | 天天综合网天天 | 久久精品屋 | 福利视频一区二区 | 亚洲欧美在线观看视频 | 国产青草视频在线观看 | 天天爽天天搞 | 在线看国产视频 | 一区二区三区四区五区在线视频 | 91大神dom调教在线观看 | 欧美成人亚洲成人 | 夜夜天天干 | 狠狠色丁香 | 精品久久久久久久 | 国产又粗又猛又爽又黄的视频先 | 国产在线日本 | 中文字幕在线看视频国产 | 丁香综合五月 | 亚洲国产精品成人精品 | 日本精品在线视频 | 五月天久久久久 | 精品99999 | 色综合天天色综合 | av三级在线看 | 伊人久久精品久久亚洲一区 | 国产男男gay做爰 | 亚洲亚洲精品在线观看 | 国产精品手机在线观看 | 婷婷在线播放 | 高清精品在线 | 精品自拍网 | 久久久久成人精品 | 午夜在线国产 | 激情视频91 | 日韩网站视频 | 九色91福利 | 黄在线免费看 | 婷婷在线观看视频 | 久久国产热| av 一区 二区 久久 | 亚洲午夜精品在线观看 | 韩日三级在线 | 九九一级片| 正在播放一区 | 亚洲国产97在线精品一区 | 日本资源中文字幕在线 | 天天天天爱天天躁 | 久久视频网址 | 久久久久久高潮国产精品视 | 精品成人免费 | 亚洲一级二级 | 一区二区三区在线观看中文字幕 | 综合网天天射 | 亚洲成a人片77777潘金莲 | 成人免费视频视频在线观看 免费 | 精品久久一区二区 | 日本久久中文 | av黄在线播放 | 国产精品久久久久aaaa九色 | 欧美日韩裸体免费视频 | 欧美日本中文字幕 | 综合久久久久久久 | 亚洲精品免费观看 | 97在线影院 | 日本成人黄色片 | 国产伦理久久精品久久久久_ | 黄色大片日本免费大片 | 欧美日韩观看 | 天天色棕合合合合合合 | 黄色福利网 | 色网站免费在线观看 | 涩涩伊人 | 丁香六月激情婷婷 | 亚洲一区二区高潮无套美女 | 性色av一区二区三区在线观看 | av青草 | 亚洲人成网站精品片在线观看 | 色吊丝在线永久观看最新版本 | 国产高清亚洲 | 五月婷婷激情网 | 色在线高清 | 91九色视频导航 | 很黄很黄的网站免费的 | 国产精品久久久电影 | 中文字幕视频三区 | 夜夜摸夜夜爽 | 欧美整片sss | 99精品欧美一区二区三区 | 久久亚洲福利 | 久久国产高清视频 | 国产精品久久久久久久久久直播 | 亚洲国产精品久久久 | 九九视频精品在线 | 草久在线观看视频 | 久久69精品久久久久久久电影好 | 天天插日日射 | 69精品人人人人 | 国产性天天综合网 | 久久怡红院 | 欧美激情视频一区二区三区 | 国产精品白浆视频 | 日产乱码一二三区别免费 | 国产精品永久久久久久久久久 | 久99久中文字幕在线 | 成人午夜毛片 | 国产精品黄网站在线观看 | 成人手机在线视频 | 日韩一区二区免费视频 | 日本免费久久高清视频 | 天天干天天做天天爱 | 丁香五月缴情综合网 | 一区免费在线 | 久久精品79国产精品 | 亚洲性少妇性猛交wwww乱大交 | 欧美性极品xxxx做受 | 国产乱码精品一区二区三区介绍 | 久久久久久久综合色一本 | avav片| 免费av小说 | 中文理论片 | 国产一级精品绿帽视频 | 在线免费观看亚洲视频 | 国产精品 中文在线 | 久久久亚洲国产精品麻豆综合天堂 | 天天干天天操天天 | 久久久久久久久黄色 | 狠狠狠狠狠狠狠干 | 婷婷色在线播放 | 欧美精品资源 | 黄色av一级片 | 开心丁香婷婷深爱五月 | 国产一二三四在线观看视频 | 国产黄色片免费在线观看 | 韩国精品视频在线观看 | 在线影视 一区 二区 三区 | a级国产乱理论片在线观看 特级毛片在线观看 | 精品国产精品久久 | 一本一道波多野毛片中文在线 | 在线观看视频免费播放 | 久久久精品国产一区二区电影四季 | 久久91网| 五月香婷 | 日韩成人免费在线电影 | 91av福利视频| 免费特级黄色片 | av综合网址| 91污视频在线 | 免费福利视频导航 | 欧美精品九九99久久 | 五月天伊人网 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 美女视频黄是免费的 | 欧美一区二区在线看 | 国产又粗又猛又黄又爽 | 国产精品久久一区二区三区, | 91在线日本 | 日韩欧美视频一区二区三区 | 人人狠狠综合久久亚洲 | 豆豆色资源网xfplay | 亚洲电影av在线 | 亚洲欧美日韩一二三区 | 欧美激情第一页xxx 午夜性福利 | 日韩精品欧美一区 | 九草在线观看 | 日韩视频一区二区三区在线播放免费观看 | 欧美日韩国产一区二区在线观看 | 伊人天堂久久 | 日韩精品一区二区三区免费视频观看 | av色影院 | 一区二区三区在线观看中文字幕 | 天天色天天色天天色 | 日女人电影 | 欧美日韩一区二区免费在线观看 | 99re8这里有精品热视频免费 | 色综合久久五月天 | 亚洲精品视频在线观看免费视频 | 美女福利视频 | 欧美激情第八页 | 免费看成人片 | www久草| 国产精品手机播放 | 国产欧美高清 | 亚洲国产精品一区二区久久,亚洲午夜 | 成人一区二区三区在线 | 黄色在线观看免费网站 | 久要激情网 | 免费看片网址 | 九九热精 | 天天天射 | 午夜在线日韩 | 免费在线黄 | 亚洲精品av中文字幕在线在线 | 91麻豆.com| 成人久久久久久久久久 | 亚洲精品永久免费视频 | 亚洲女同videos | 免费精品国产va自在自线 | 91尤物国产尤物福利在线播放 | 97电影手机版 | 天天操天天插 | 黄色大片日本 | 激情在线网址 | 美女免费视频一区二区 | 欧美色图亚洲图片 | 国产资源在线视频 | 亚洲va综合va国产va中文 | 在线不卡的av | 天天摸天天弄 | 欧美日韩视频 | 色噜噜在线观看 | 久久精品1区 | 欧美午夜性生活 | 久久精品a | av手机在线播放 | 午夜免费在线观看 | 国产亚洲在线视频 | 天天超碰| 经典三级一区 | 天堂在线一区二区 | 国产91aaa | 久久精品99 | 久草观看 | 欧美精品久久久久久久久久久 | 视频福利在线 | 成人免费在线观看电影 | 久久99久久99精品免观看软件 | 久久免费试看 | 久久久影视 | 99国产精品免费网站 | 日日干美女 | 日本中文字幕视频 | 黄色av一区| 国产在线观看91 | 国产日产欧美在线观看 | 日日干综合 | av高清网站在线观看 | 免费av在线播放 | 国产成人高清 | 免费在线黄色av | 久久99精品久久久久久 | 中文字幕在线网 | 久草视频在线资源站 | 91在线国产观看 | 久久综合久久久久88 | 国产精品久久久av久久久 | 91中文在线视频 | 国产精品久久久久国产精品日日 | 日韩精品一区二区三区免费观看 | 久久久免费观看完整版 | 久久久久久久久久福利 | 国际精品久久久 | 国产精品国产亚洲精品看不卡15 | 丁香六月天婷婷 | 中文字幕在线免费 | 午夜精品久久久久99热app | 园产精品久久久久久久7电影 | 国产视频一区二区在线观看 | 婷婷激情综合五月天 | 成人国产精品久久久春色 | 国产日本亚洲 | 国产亚洲精品久久久久久网站 | 成人在线观看日韩 | 在线国产99 | 天天天干夜夜夜操 | 国产视频每日更新 | 色综合天天色综合 | av电影av在线 | 国产视频亚洲视频 | 欧美日本啪啪无遮挡网站 | 婷婷色在线播放 | 欧美日韩国产页 | 久久精视频 | 日本天天操 | 国产一区在线视频播放 | 精品久久久久国产 | 日日日网| 国产精品乱码高清在线看 | 久久午夜鲁丝片 | 99久久久久免费精品国产 | 精品国产免费看 | 91桃色国产在线播放 | 91香蕉国产在线观看软件 | 欧美激情精品久久久久久免费印度 | 国产中文字幕一区二区三区 | 九九九九九九精品任你躁 | 精品久久久久久久 | 揉bbb玩bbb少妇bbb | 色在线国产| www国产亚洲精品久久麻豆 | 天天干视频在线 | 深爱婷婷网 | 中文字幕黄网 | 国产999视频在线观看 | 99超碰在线观看 | 人人射人人插 | 久久精品毛片基地 | 日日躁夜夜躁xxxxaaaa | 午夜精品剧场 | 国产成人精品一区二区三区 | 人人爽人人爽人人 | 亚洲综合狠狠干 | 中文字幕在线观看网站 | 在线观看的黄色 | 中文欧美字幕免费 | 人人艹人人 | 亚洲影院天堂 | 精品久久中文 | 五月色婷 | 黄网在线免费观看 | 在线 欧美 日韩 | 五月亚洲婷婷 | 精品在线一区二区 | 久久国产精品一区二区三区 | 深爱婷婷激情 | 男女啪啪免费网站 | 菠萝菠萝在线精品视频 | 97免费在线观看 | 亚洲成人午夜在线 | 日韩成人精品一区二区 | 国产一及片 | 久久 地址 | 亚洲开心激情 | 国产日韩欧美在线一区 | 国产亚洲午夜高清国产拍精品 | 久草在线视频免赞 | 国外调教视频网站 | 狠狠色狠狠综合久久 | 久久精品99国产精品亚洲最刺激 | 亚洲视频久久 | 欧美日韩国内在线 | 超碰免费公开 | 伊人天天综合 | 中文字幕在线国产 | 最新真实国产在线视频 | 精品亚洲免费 | 一区二区三区四区久久 | 综合久久一本 | 一区二区三区在线视频111 | 久久精品99国产 | 国产成人av电影在线观看 | 久热香蕉视频 | 亚洲精品999 | 日韩中文在线电影 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 成人免费共享视频 | 亚洲精品一区二区三区四区高清 | 精品国产免费人成在线观看 | 91成年人视频 | 亚洲国产精品免费 | 国产小视频免费观看 | 在线观看日韩精品视频 | 久久久久久久国产精品 | 99久久久国产精品美女 | 久久国产精品偷 | 91九色丨porny丨丰满6 | 日韩免费小视频 | 99久久夜色精品国产亚洲96 | 亚洲五月综合 | 99欧美精品 | 午夜在线免费观看 | 一区二区三区韩国免费中文网站 | 日韩精品视频在线观看网址 | 免费看污的网站 | 国产在线播放一区二区三区 | 一级a毛片高清视频 | 久久国产福利 | 国产精品久久久久一区二区三区共 | 欧美激情精品久久久久久免费印度 | 欧美色综合 | 国产一级特黄电影 | 成人av在线亚洲 | 日韩在线网址 | 国产123区在线观看 国产精品麻豆91 | 99日精品| 天天爱天天射天天干天天 | 天天操网站 | 91精品视频在线看 | 96香蕉视频 | 国产精彩视频一区 | 美女视频久久久 | 中文字幕免费高清在线观看 | 日韩成人免费观看 | 国内久久精品视频 | www.亚洲黄 | 五月天天在线 | 欧美性生活免费看 | 日本中文字幕系列 | 久久欧洲视频 | 日本不卡一区二区 | 18做爰免费视频网站 | 三级av在线播放 | 天天做天天看 | 免费看色网站 | 波多野结衣在线播放一区 | 日韩三级在线 | 国产一区二区在线观看视频 | 久久国产系列 | 在线免费av网站 | 丰满少妇麻豆av | av色影院 | 国产精品入口66mio女同 | 成人av地址 | 日韩成人高清在线 | 日日夜夜91 | 亚洲综合日韩在线 | 国产一级特黄电影 | 亚洲精品91天天久久人人 | 国内精品久久久久久久久久久 | 久久手机免费视频 | 久久xx视频 | 中文字幕视频一区二区 | 久久综合桃花 | 亚洲手机av | 中文字幕免 | 免费午夜视频在线观看 | 天天射网站 | 亚洲精品网站在线 | 亚洲免费不卡 | 99视频国产精品 | 亚洲免费av观看 | 久久精品视频网站 | 亚洲一区动漫 | 日韩视频一 | 黄色片视频在线观看 | 免费黄色av电影 | 欧美激情精品久久久久久 | 亚洲激情在线视频 | 欧美a视频在线观看 | 国产日韩精品一区二区三区 | av日韩在线网站 | 超碰人人99| 国内精品久久久久久久影视麻豆 | 国产精品免费看久久久8精臀av | 免费精品在线观看 | 国产精品96久久久久久吹潮 | 狠狠色综合网站久久久久久久 | a亚洲视频| 99久久精品无码一区二区毛片 | 日韩视频一区二区三区在线播放免费观看 | 国产只有精品 | 美女视频久久久 | 狠狠干综合| 国产 欧美 日本 | 亚洲免费在线视频 | 欧美-第1页-屁屁影院 | 亚洲欧洲精品在线 | 免费观看91视频 | 国产精品中文字幕在线播放 | 日韩性片 | 欧美午夜理伦三级在线观看 | 久久亚洲专区 | 人人爽人人爽人人片 | 色综合狠狠干 | 亚洲免费av一区二区 | 九九热免费在线观看 | av在线网站免费观看 | 天天激情天天干 | 伊人视频 | 日韩一区二区免费视频 | 午夜电影av | 又爽又黄又无遮挡网站动态图 | 婷婷色综合色 | 97国产情侣爱久久免费观看 | 国产理论一区二区三区 | 国产一及片 | 久久精品视频免费观看 | 国产精品第10页 | 国产精品毛片久久蜜 | 丁香花在线视频观看免费 | 九九视频免费观看视频精品 | 黄色中文字幕在线 | 天天综合网天天综合色 | 中文字幕丝袜制服 | 亚洲国产精品成人精品 | 日本精品视频免费观看 | 视频国产| av福利在线播放 | 亚洲精品黄色在线观看 | 日本精品久久久久中文字幕 | 色瓜| 国产精品一区二区三区在线播放 | 免费看日韩片 | 天天av天天 | 国产资源精品在线观看 | 91经典在线 | 国产 欧美 日产久久 | 国产成人福利在线观看 | 久热精品国产 | 手机在线永久免费观看av片 | 国产精品theporn | 六月丁香婷婷网 | 黄色网址国产 | 91亚洲精品国偷拍 | 国产亚洲精品综合一区91 | 日韩在线观看a | 久久精品精品电影网 | 国产乱对白刺激视频不卡 | 成人sm另类专区 | 黄色的片子 | 中文字幕av免费观看 | 青青河边草观看完整版高清 | 精品9999| 亚洲精品影院在线观看 | 日韩免费av在线 | 亚洲资源在线网 | 国产破处视频在线播放 | 免费成人看片 | 欧美一级黄色视屏 | 国产一级一片免费播放放 | 性色av一区二区三区在线观看 | 久久一级片 | 激情影院在线 | 毛片美女网站 | 日韩欧美网站 | 午夜视频免费 | 亚洲国产wwwccc36天堂 | 日韩av在线资源 | 免费av观看网站 | 爱爱av网站 | 亚洲综合精品在线 | 亚洲高清视频在线观看免费 | 欧美黄在线 | 日韩在线二区 | 国产精品18久久久久久不卡孕妇 | 日韩精品字幕 | 人人舔人人爱 | 五月天欧美精品 | 碰天天操天天 | 成人黄色av网站 | 欧美激情在线看 | 国产精品va | 2017狠狠干| 亚洲日本成人网 | 美女免费电影 | 国产激情小视频在线观看 | 米奇狠狠狠888 | 99视频偷窥在线精品国自产拍 | 亚洲va综合va国产va中文 | 日韩性xxx| 国产成人专区 | 五月天伊人网 | 欧美一区,二区 | 日韩精品播放 | ,久久福利影视 | 国产精品美女久久久 | 99热精品视 | 91麻豆精品国产午夜天堂 | 亚洲视频axxx| www.国产在线 | 国产在线精品一区二区 | 久久久 精品| 人人爽人人搞 | 久久精品国产v日韩v亚洲 | 99久久99视频只有精品 | 91丨九色丨蝌蚪丨对白 | 91九色丨porny丨丰满6 | 天天天天爱天天躁 | 亚洲一区二区视频在线 | 波多野结衣在线播放视频 | 久久午夜免费观看 | 国产精品国产自产拍高清av | 欧美一区二区在线刺激视频 | 亚洲理论片在线观看 | 天天做天天爱天天爽综合网 | 日韩午夜在线观看 | 亚洲黄色在线 | 欧美一级电影 | 欧美福利在线播放 | 婷婷 综合 色 | 天天色成人 | 国产综合婷婷 | 伊人亚洲综合网 | 亚洲精品理论 | av中文字幕av | 亚洲首页 | 国产精品无av码在线观看 | 精品国产欧美一区二区三区不卡 | 玖玖在线精品 | 久草在线观看视频免费 | 午夜精品久久久久久久99无限制 | 久久99热这里只有精品国产 | 久久成人人人人精品欧 | 99视频在线精品免费观看2 | 亚洲精品456在线播放第一页 | 天天操伊人| 特级毛片爽www免费版 | 欧美午夜精品久久久久 | 成人在线观看日韩 | 蜜臀av.com | 欧美 日韩 国产 中文字幕 | 一区二区在线影院 | 手机av在线网站 | 久久久免费观看 | 久久免费视频在线观看6 | 亚洲精品无 | 亚洲成人第一区 | 成人国产一区 | 久久久免费毛片 | 久久99精品久久久久久 | 色综合网 | 国产原创在线 | 日韩一级电影在线 | 精品在线视频一区二区三区 | 激情文学综合丁香 | 中文字幕在线播放第一页 | 超碰人人草人人 | av免费片 | 亚洲精品无 | 免费在线观看日韩视频 | 久草在线观 | 日韩有码在线观看视频 | 亚洲理论电影网 | 五月天六月婷 | 玖草影院 | 精品国产乱码一区二 | 热精品 | 日韩精品无码一区二区三区 | 亚洲性少妇性猛交wwww乱大交 | 99精品欧美一区二区三区 | 午夜精品久久一牛影视 | 999久久久久久久久久久 | a级国产乱理论片在线观看 特级毛片在线观看 | 国产精品久久久亚洲 | 亚洲一级二级三级 | 久久精品一二三区 | 久久久久亚洲精品男人的天堂 | 成人啪啪18免费游戏链接 | 天天插天天色 | 一区二区三区四区五区六区 | 欧美黑吊大战白妞欧美 | 色欧美视频 | 国产精品一区二区av | 婷婷在线视频 | 超碰国产在线播放 | 久久好看 | 激情五月色播五月 | 91精品国产一区二区在线观看 | 九九99| 午夜av大片 | 91香蕉视频色版 | 久久免费激情视频 | 国产精品video爽爽爽爽 | 国产美女视频免费观看的网站 | 在线黄网站 | 成人黄色电影视频 | 九色精品在线 | 欧美色插| 成人91在线| 色婷婷色| 久久精品看片 | 婷婷久久网站 | 99色免费视频 | 久久久久这里只有精品 | 啪啪凸凸 | 久久丁香 | 狠狠狠色 | 亚洲国产成人精品在线 | 欧美日韩不卡一区 | 麻豆国产在线视频 | 黄色av在 | 欧美日韩免费在线视频 | 97麻豆视频 | 97精品国自产拍在线观看 | 在线国产欧美 | 欧美日韩性 | 中文字幕一区在线观看视频 | 免费色视频| 中文不卡视频 | 激情丁香久久 | 18性欧美xxxⅹ性满足 | 日韩免费观看视频 | 97超碰人人澡 | 国产精品美女久久久久久久久久久 | 91av视频免费观看 | 国产黄在线观看 | 十八岁免进欧美 | 丁香六月婷婷综合 | 亚洲一片黄 | 97精品国产aⅴ | 久久精品一区二区三区中文字幕 | 亚洲成av人片一区二区梦乃 | 国产视频在线免费观看 | 久久久久久久久久久久99 | 成人午夜在线观看 | 9999在线| 国产精品99爱 | 亚洲精品乱码久久久久久按摩 | 人人超碰在线 | 国产成人在线观看 | 国产亚洲免费的视频看 | 国产精品欧美久久久久久 | 成av人电影| 99精品电影 | 91视频久久久| 国产精品一区二区三区电影 | 欧美日韩国产区 | 日日夜夜噜 | 国产视频久久久久 | 91免费版在线 | 日本中文一区二区 | 欧美精品国产综合久久 | 欧美日韩国产精品一区二区亚洲 | 久操视频在线免费看 | 国产精品久久亚洲 | 久久国产精品99久久人人澡 | 韩日成人av | 91亚洲国产成人久久精品网站 | 天堂av在线网站 | 日韩精品一区二区免费视频 | 麻豆视频免费入口 | 日韩免费小视频 | 91高清免费在线观看 | 国产群p| 九九免费在线观看视频 | 成人av.com| 久久久久一区 | 久久久影视 | 国产精品99久久久久久有的能看 | 日韩久久午夜一级啪啪 | 五月婷婷激情五月 | 中文字幕资源在线观看 | 亚洲国产中文字幕 | 婷婷久久一区 | 国产乱码精品一区二区蜜臀 | 麻豆视频一区二区 | 在线免费观看欧美日韩 | 国产中文字幕网 | 亚洲伦理中文字幕 | 最近中文字幕大全中文字幕免费 | 亚洲国产精久久久久久久 | 国产精品一区免费看8c0m | 最新日本中文字幕 | www成人精品 | 亚洲三级黄 | 亚洲欧美视频网站 | 97**国产露脸精品国产 | 欧美日韩91 | 成人黄性视频 | 麻豆视频国产 | 日韩深夜在线观看 | 中文字幕在线观看你懂的 | 国产一性一爱一乱一交 | 久久97视频 | 日韩av在线免费播放 | 国产精品欧美精品 | 不卡的av在线播放 | 国产黄色大片免费看 | 96精品高清视频在线观看软件特色 | 日韩欧美高清 | 亚洲精品午夜久久久久久久 | 日韩狠狠操 | 91精品国自产在线观看欧美 | 久久久久久久久艹 | 婷婷伊人综合 | 精品美女在线视频 | 成人免费视频在线观看 | 日日噜噜噜噜夜夜爽亚洲精品 | 日韩美女黄色片 | 99热精品久久 | 99re国产视频 | 91在线播放国产 | www.久久色 | 人人爽人人搞 | 日韩成人免费在线观看 | 色诱亚洲精品久久久久久 | 免费一级片在线观看 | 日韩欧美国产激情在线播放 | 五月天六月婷婷 | 黄色毛片在线看 | 国产97超碰| av免费在线观 | 91人人爽久久涩噜噜噜 | 天天性天天草 | 亚洲视频精品在线 | 欧美日韩在线视频一区 | 国产精品视频全国免费观看 | 久久国色夜色精品国产 | 国产精品欧美日韩 | 亚洲区另类春色综合小说 | 97免费视频在线 | 久久在线精品视频 |