久久一区二区中文字幕_日韩人体视频_国产影视一区_久久爱www.

南京軟件定制開發(fā)

南京傾心軟件歡迎您訪問本站

13605185909

新聞資訊

NEWS CENTER
欄目導航

南京軟件開發(fā)之同步線程和異步線程

發(fā)布時間:Mar 15, 2021         已有 人瀏覽

進程

  我們都知道計算機的核心是CPU,它承擔了所有的計算任務(wù);而操作系統(tǒng)是計算機的管理者,它負責任務(wù)的調(diào)度、資源的分配和管理,統(tǒng)領(lǐng)整個計算機硬件;應(yīng)用程序則是具有某種功能的程序,程序是運行于操作系統(tǒng)之上的。

  進程是一個具有一定獨立功能的程序在一個數(shù)據(jù)集上的一次動態(tài)執(zhí)行的過程,是操作系統(tǒng)進行資源分配和調(diào)度的一個獨立單位,是應(yīng)用程序運行的載體。進程是一種抽象的概念,從來沒有統(tǒng)一的標準定義。

進程一般由程序、數(shù)據(jù)集合和進程控制塊三部分組成。

  • 程序用于描述進程要完成的功能,是控制進程執(zhí)行的指令集;
  • 數(shù)據(jù)集合是程序在執(zhí)行時所需要的數(shù)據(jù)和工作區(qū);
  • 程序控制塊(Program Control Block,簡稱PCB),包含進程的描述信息和控制信息,是進程存在的唯一標志。

進程具有的特征:

  • 動態(tài)性:進程是程序的一次執(zhí)行過程,是臨時的,有生命期的,是動態(tài)產(chǎn)生,動態(tài)消亡的;
  • 并發(fā)性:任何進程都可以同其他進程一起并發(fā)執(zhí)行;
  • 獨立性:進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位;
  • 結(jié)構(gòu)性:進程由程序、數(shù)據(jù)和進程控制塊三部分組成。

線程

  在早期的操作系統(tǒng)中并沒有線程的概念,進程是能擁有資源和獨立運行的最小單位,也是程序執(zhí)行的最小單位。任務(wù)調(diào)度采用的是時間片輪轉(zhuǎn)的搶占式調(diào)度方式,而進程是任務(wù)調(diào)度的最小單位,每個進程有各自獨立的一塊內(nèi)存,使得各個進程之間內(nèi)存地址相互隔離。

  后來,隨著計算機的發(fā)展,對CPU的要求越來越高,進程之間的切換開銷較大,已經(jīng)無法滿足越來越復(fù)雜的程序的要求了。于是就發(fā)明了線程。

  線程是程序執(zhí)行中一個單一的順序控制流程,是程序執(zhí)行流的最小單元,是處理器調(diào)度和分派的基本單位。一個進程可以有一個或多個線程,各個線程之間共享程序的內(nèi)存空間(也就是所在進程的內(nèi)存空間)。一個標準的線程由線程ID、當前指令指針(PC)、寄存器和堆棧組成。而進程由內(nèi)存空間(代碼、數(shù)據(jù)、進程空間、打開的文件)和一個或多個線程組成。
(讀到這里可能有的讀者迷糊,感覺這和Java的內(nèi)存空間模型不太一樣,但如果你深入的讀過深入理解Java虛擬機這本書的話你就會恍然大悟)

image

如上圖,在任務(wù)管理器的進程一欄里,有道詞典和有道云筆記就是進程,而在進程下又有著多個執(zhí)行不同任務(wù)的線程。

任務(wù)調(diào)度

  線程是什么?要理解這個概念,需要先了解一下操作系統(tǒng)的一些相關(guān)概念。大部分操作系統(tǒng)(如Windows、Linux)的任務(wù)調(diào)度是采用時間片輪轉(zhuǎn)的搶占式調(diào)度方式。

  在一個進程中,當一個線程任務(wù)執(zhí)行幾毫秒后,會由操作系統(tǒng)的內(nèi)核(負責管理各個任務(wù))進行調(diào)度,通過硬件的計數(shù)器中斷處理器,讓該線程強制暫停并將該線程的寄存器放入內(nèi)存中,通過查看線程列表決定接下來執(zhí)行哪一個線程,并從內(nèi)存中恢復(fù)該線程的寄存器,最后恢復(fù)該線程的執(zhí)行,從而去執(zhí)行下一個任務(wù)。
上述過程中,任務(wù)執(zhí)行的那一小段時間叫做時間片,任務(wù)正在執(zhí)行時的狀態(tài)叫運行狀態(tài),被暫停的線程任務(wù)狀態(tài)叫做就緒狀態(tài),意為等待下一個屬于它的時間片的到來。

  這種方式保證了每個線程輪流執(zhí)行,由于CPU的執(zhí)行效率非常高,時間片非常短,在各個任務(wù)之間快速地切換,給人的感覺就是多個任務(wù)在“同時進行”,這也就是我們所說的并發(fā)(別覺得并發(fā)有多高深,它的實現(xiàn)很復(fù)雜,但它的概念很簡單,就是一句話:多個任務(wù)同時執(zhí)行)。多任務(wù)運行過程的示意圖如下:

image

圖1:操作系統(tǒng)中的任務(wù)調(diào)度

進程與線程的區(qū)別

  前面講了進程與線程,但可能你還覺得迷糊,感覺他們很類似。的確,進程與線程有著千絲萬縷的關(guān)系,下面就讓我們一起來理一理:

  1. 線程是程序執(zhí)行的最小單位,而進程是操作系統(tǒng)分配資源的最小單位;
  2. 一個進程由一個或多個線程組成,線程是一個進程中代碼的不同執(zhí)行路線;
  3. 進程之間相互獨立,但同一進程下的各個線程之間共享程序的內(nèi)存空間(包括代碼段、數(shù)據(jù)集、堆等)及一些進程級的資源(如打開文件和信號),某進程內(nèi)的線程在其它進程不可見;
  4. 調(diào)度和切換:線程上下文切換比進程上下文切換要快得多。
      線程與進程關(guān)系的示意圖:

image

圖2:進程與線程的資源共享關(guān)系


image

圖3:單線程與多線程的關(guān)系



  總之,線程和進程都是一種抽象的概念,線程是一種比進程更小的抽象,線程和進程都可用于實現(xiàn)并發(fā)。
在早期的操作系統(tǒng)中并沒有線程的概念,進程是能擁有資源和獨立運行的最小單位,也是程序執(zhí)行的最小單位。它相當于一個進程里只有一個線程,進程本身就是線程。所以線程有時被稱為輕量級進程(Lightweight Process,LWP)。

image

圖4:早期的操作系統(tǒng)只有進程,沒有線程


后來,隨著計算機的發(fā)展,對多個任務(wù)之間上下文切換的效率要求越來越高,就抽象出一個更小的概念——線程,一般一個進程會有多個(也可是一個)線程。
  
image

圖5:線程的出現(xiàn),使得一個進程可以有多個線程

多線程與多核

  上面提到的時間片輪轉(zhuǎn)的調(diào)度方式說一個任務(wù)執(zhí)行一小段時間后強制暫停去執(zhí)行下一個任務(wù),每個任務(wù)輪流執(zhí)行。很多操作系統(tǒng)的書都說“同一時間點只有一個任務(wù)在執(zhí)行”。那有人可能就要問雙核處理器呢?難道兩個核不是同時運行嗎?

  其實“同一時間點只有一個任務(wù)在執(zhí)行”這句話是不準確的,至少它是不全面的。那多核處理器的情況下,線程是怎樣執(zhí)行呢?這就需要了解內(nèi)核線程。

  多核(心)處理器是指在一個處理器上集成多個運算核心從而提高計算能力,也就是有多個真正并行計算的處理核心,每一個處理核心對應(yīng)一個內(nèi)核線程。
內(nèi)核線程(Kernel Thread,KLT)就是直接由操作系統(tǒng)內(nèi)核支持的線程,這種線程由內(nèi)核來完成線程切換,內(nèi)核通過操作調(diào)度器對線程進行調(diào)度,并負責將線程的任務(wù)映射到各個處理器上。一般一個處理核心對應(yīng)一個內(nèi)核線程,比如單核處理器對應(yīng)一個內(nèi)核線程,雙核處理器對應(yīng)兩個內(nèi)核線程,四核處理器對應(yīng)四個內(nèi)核線程。

  現(xiàn)在的電腦一般是雙核四線程、四核八線程,是采用超線程技術(shù)將一個物理處理核心模擬成兩個邏輯處理核心,對應(yīng)兩個內(nèi)核線程,所以在操作系統(tǒng)中看到的CPU數(shù)量是實際物理CPU數(shù)量的兩倍,如你的電腦是雙核四線程,打開“任務(wù)管理器\性能”可以看到4個CPU的監(jiān)視器,四核八線程可以看到8個CPU的監(jiān)視器。

image

圖6:雙核四線程在Windows8下查看的結(jié)果

  超線程技術(shù)就是利用特殊的硬件指令,把一個物理芯片模擬成兩個邏輯處理核心,讓單個處理器都能使用線程級并行計算,進而兼容多線程操作系統(tǒng)和軟件,減少了CPU的閑置時間,提高的CPU的運行效率。這種超線程技術(shù)(如雙核四線程)由處理器硬件的決定,同時也需要操作系統(tǒng)的支持才能在計算機中表現(xiàn)出來。

  程序一般不會直接去使用內(nèi)核線程,而是去使用內(nèi)核線程的一種高級接口——輕量級進程(Lightweight Process,LWP),輕量級進程就是我們通常意義上所講的線程,也被叫做用戶線程。由于每個輕量級進程都由一個內(nèi)核線程支持,因此只有先支持內(nèi)核線程,才能有輕量級進程。用戶線程與內(nèi)核線程的對應(yīng)關(guān)系有三種模型:一對一模型、多對一模型、多對多模型,在這以4個內(nèi)核線程、3個用戶線程為例對三種模型進行說明。

一對一模型

  對于一對一模型來說,一個用戶線程就唯一地對應(yīng)一個內(nèi)核線程(反過來不一定成立,一個內(nèi)核線程不一定有對應(yīng)的用戶線程)。這樣,如果CPU沒有采用超線程技術(shù)(如四核四線程的計算機),一個用戶線程就唯一地映射到一個物理CPU的內(nèi)核線程,線程之間的并發(fā)是真正的并發(fā)。一對一模型使用戶線程具有與內(nèi)核線程一樣的優(yōu)點,一個線程因某種原因阻塞時其他線程的執(zhí)行不受影響;此處,一對一模型也可以讓多線程程序在多處理器的系統(tǒng)上有更好的表現(xiàn)。

但一對一模型也有兩個缺點:

  1. 許多操作系統(tǒng)限制了內(nèi)核線程的數(shù)量,因此一對一模型會使用戶線程的數(shù)量受到限制;
  2. 許多操作系統(tǒng)內(nèi)核線程調(diào)度時,上下文切換的開銷較大,導致用戶線程的執(zhí)行效率下降。

image

圖7:一對一模型

多對一模型

  多對一模型將多個用戶線程映射到一個內(nèi)核線程上,線程之間的切換由用戶態(tài)的代碼來進行,系統(tǒng)內(nèi)核感受不到線程的實現(xiàn)方式。用戶線程的建立、同步、銷毀等都在用戶態(tài)中完成,不需要內(nèi)核的介入。因此相對一對一模型,多對一模型的線程上下文切換速度要快許多;此外,多對一模型對用戶線程的數(shù)量幾乎無限制。

但多對一模型也有兩個缺點:

  1. 如果其中一個用戶線程阻塞,那么其它所有線程都將無法執(zhí)行,因為此時內(nèi)核線程也隨之阻塞了;
  2. 在多處理器系統(tǒng)上,處理器數(shù)量的增加對多對一模型的線程性能不會有明顯的增加,因為所有的用戶線程都映射到一個處理器上了。

 

image

圖8:多對一模型

多對多模型

  多對多模型結(jié)合了一對一模型和多對一模型的優(yōu)點,將多個用戶線程映射到多個內(nèi)核線程上。由線程庫負責在可用的可調(diào)度實體上調(diào)度用戶線程,這使得線程的上下文切換非常快,因為它避免了系統(tǒng)調(diào)用。但是增加了復(fù)雜性和優(yōu)先級倒置的可能性,以及在用戶態(tài)調(diào)度程序和內(nèi)核調(diào)度程序之間沒有廣泛(且高昂)協(xié)調(diào)的次優(yōu)調(diào)度。

多對多模型的優(yōu)點有:

  1. 一個用戶線程的阻塞不會導致所有線程的阻塞,因為此時還有別的內(nèi)核線程被調(diào)度來執(zhí)行;
  2. 多對多模型對用戶線程的數(shù)量沒有限制;
  3. 在多處理器的操作系統(tǒng)中,多對多模型的線程也能得到一定的性能提升,但提升的幅度不如一對一模型的高。

image

圖9:多對多模型

 

在現(xiàn)在流行的操作系統(tǒng)中,大都采用多對多的模型。

查看進程與線程

  一個應(yīng)用程序可能是多線程的,也可能是多進程的,如何查看呢?在Windows下我們只須打開任務(wù)管理器就能查看一個應(yīng)用程序的進程和線程數(shù)。按“Ctrl+Alt+Del”或右鍵快捷工具欄打開任務(wù)管理器。

  查看進程數(shù)和線程數(shù):

image

圖10:查看線程數(shù)和進程數(shù)

 

  在“進程”選項卡下,我們可以看到一個應(yīng)用程序包含的線程數(shù)。如果一個應(yīng)用程序有多個進程,我們能看到每一個進程,如在上圖中,Google的Chrome瀏覽器就有多個進程。同時,如果打開了一個應(yīng)用程序的多個實例也會有多個進程,如上圖中我打開了兩個cmd窗口,就有兩個cmd進程。如果看不到線程數(shù)這一列,可以再點擊“查看\選擇列”菜單,增加監(jiān)聽的列。
  查看CPU和內(nèi)存的使用率:
  在性能選項卡中,我們可以查看CPU和內(nèi)存的使用率,根據(jù)CPU使用記錄的監(jiān)視器的個數(shù)還能看出邏輯處理核心的個數(shù),如我的雙核四線程的計算機就有四個監(jiān)視器。

image

圖11:查看CPU和內(nèi)存的使用率

 

線程的生命周期

  當線程的數(shù)量小于處理器的數(shù)量時,線程的并發(fā)是真正的并發(fā),不同的線程運行在不同的處理器上。但當線程的數(shù)量大于處理器的數(shù)量時,線程的并發(fā)會受到一些阻礙,此時并不是真正的并發(fā),因為此時至少有一個處理器會運行多個線程。

  在單個處理器運行多個線程時,并發(fā)是一種模擬出來的狀態(tài)。操作系統(tǒng)采用時間片輪轉(zhuǎn)的方式輪流執(zhí)行每一個線程。現(xiàn)在,幾乎所有的現(xiàn)代操作系統(tǒng)采用的都是時間片輪轉(zhuǎn)的搶占式調(diào)度方式,如我們熟悉的Unix、Linux、Windows及macOS等流行的操作系統(tǒng)。

  我們知道線程是程序執(zhí)行的最小單位,也是任務(wù)執(zhí)行的最小單位。在早期只有進程的操作系統(tǒng)中,進程有五種狀態(tài),創(chuàng)建、就緒、運行、阻塞(等待)、退出。早期的進程相當于現(xiàn)在的只有單個線程的進程,那么現(xiàn)在的多線程也有五種狀態(tài),現(xiàn)在的多線程的生命周期與早期進程的生命周期類似。

image

圖12:早期進程的生命周期

 

  進程在運行過程有三種狀態(tài):就緒、運行、阻塞,創(chuàng)建和退出狀態(tài)描述的是進程的創(chuàng)建過程和退出過程。

  • 創(chuàng)建:進程正在創(chuàng)建,還不能運行。操作系統(tǒng)在創(chuàng)建進程時要進行的工作包括分配和建立進程控制塊表項、建立資源表格并分配資源、加載程序并建立地址空間;
  • 就緒:時間片已用完,此線程被強制暫停,等待下一個屬于它的時間片到來;
  • 運行:此線程正在執(zhí)行,正在占用時間片;
  • 阻塞:也叫等待狀態(tài),等待某一事件(如IO或另一個線程)執(zhí)行完;
  • 退出:進程已結(jié)束,所以也稱結(jié)束狀態(tài),釋放操作系統(tǒng)分配的資源。

image

圖13:線程的生命周期

 

  • 創(chuàng)建:一個新的線程被創(chuàng)建,等待該線程被調(diào)用執(zhí)行;
  • 就緒:時間片已用完,此線程被強制暫停,等待下一個屬于它的時間片到來;
  • 運行:此線程正在執(zhí)行,正在占用時間片;
  • 阻塞:也叫等待狀態(tài),等待某一事件(如IO或另一個線程)執(zhí)行完;
  • 退出:一個線程完成任務(wù)或者其他終止條件發(fā)生,該線程終止進入退出狀態(tài),退出狀態(tài)釋放該線程所分配的資源。

協(xié)程

協(xié)程,英文Coroutines,是一種基于線程之上,但又比線程更加輕量級的存在,這種由程序員自己寫程序來管理的輕量級線程叫做『用戶空間線程』,具有對內(nèi)核來說不可見的特性。

因為是自主開辟的異步任務(wù),所以很多人也更喜歡叫它們纖程(Fiber),或者綠色線程(GreenThread)。正如一個進程可以擁有多個線程一樣,一個線程也可以擁有多個協(xié)程。

image

協(xié)程的目的

在傳統(tǒng)的J2EE系統(tǒng)中都是基于每個請求占用一個線程去完成完整的業(yè)務(wù)邏輯(包括事務(wù))。所以系統(tǒng)的吞吐能力取決于每個線程的操作耗時。如果遇到很耗時的I/O行為,則整個系統(tǒng)的吞吐立刻下降,因為這個時候線程一直處于阻塞狀態(tài),如果線程很多的時候,會存在很多線程處于空閑狀態(tài)(等待該線程執(zhí)行完才能執(zhí)行),造成了資源應(yīng)用不徹底。

最常見的例子就是JDBC(它是同步阻塞的),這也是為什么很多人都說數(shù)據(jù)庫是瓶頸的原因。這里的耗時其實是讓CPU一直在等待I/O返回,說白了線程根本沒有利用CPU去做運算,而是處于空轉(zhuǎn)狀態(tài)。而另外過多的線程,也會帶來更多的ContextSwitch開銷。

對于上述問題,現(xiàn)階段行業(yè)里的比較流行的解決方案之一就是單線程加上異步回調(diào)。其代表派是node.js以及Java里的新秀Vert.x。

而協(xié)程的目的就是當出現(xiàn)長時間的I/O操作時,通過讓出目前的協(xié)程調(diào)度,執(zhí)行下一個任務(wù)的方式,來消除ContextSwitch上的開銷。

協(xié)程的特點

  1. 線程的切換由操作系統(tǒng)負責調(diào)度,協(xié)程由用戶自己進行調(diào)度,因此減少了上下文切換,提高了效率。
  2. 線程的默認Stack大小是1M,而協(xié)程更輕量,接近1K。因此可以在相同的內(nèi)存中開啟更多的協(xié)程。
  3. 由于在同一個線程上,因此可以避免競爭關(guān)系而使用鎖。
  4. 適用于被阻塞的,且需要大量并發(fā)的場景。但不適用于大量計算的多線程,遇到此種情況,更好實用線程去解決。

協(xié)程的原理

當出現(xiàn)IO阻塞的時候,由協(xié)程的調(diào)度器進行調(diào)度,通過將數(shù)據(jù)流立刻yield掉(主動讓出),并且記錄當前棧上的數(shù)據(jù),阻塞完后立刻再通過線程恢復(fù)棧,并把阻塞的結(jié)果放到這個線程上去跑,這樣看上去好像跟寫同步代碼沒有任何差別,這整個流程可以稱為coroutine,而跑在由coroutine負責調(diào)度的線程稱為Fiber。比如Golang里的 go關(guān)鍵字其實就是負責開啟一個Fiber,讓func邏輯跑在上面。

由于協(xié)程的暫停完全由程序控制,發(fā)生在用戶態(tài)上;而線程的阻塞狀態(tài)是由操作系統(tǒng)內(nèi)核來進行切換,發(fā)生在內(nèi)核態(tài)上。
因此,協(xié)程的開銷遠遠小于線程的開銷,也就沒有了ContextSwitch上的開銷。

協(xié)程和線程的比較

比較項 線程 協(xié)程
占用資源 初始單位為1MB,固定不可變 初始一般為 2KB,可隨需要而增大
調(diào)度所屬 由 OS 的內(nèi)核完成 由用戶完成
切換開銷 涉及模式切換(從用戶態(tài)切換到內(nèi)核態(tài))、16個寄存器、PC、SP...等寄存器的刷新等 只有三個寄存器的值修改 - PC / SP / DX.
性能問題 資源占用太高,頻繁創(chuàng)建銷毀會帶來嚴重的性能問題 資源占用小,不會帶來嚴重的性能問題
數(shù)據(jù)同步 需要用鎖等機制確保數(shù)據(jù)的一直性和可見性 不需要多線程的鎖機制,因為只有一個線程,也不存在同時寫變量沖突,在協(xié)程中控制共享資源不加鎖,只需要判斷狀態(tài)就好了,所以執(zhí)行效率比多線程高很多。
Copyright © 2020-2022 南京傾心軟件技術(shù)有限公司 版權(quán)所有     蘇ICP備2020070309號-1
QQ在線咨詢
13605185909
返回頂部
久久一区二区中文字幕_日韩人体视频_国产影视一区_久久爱www.
国产性做久久久久久| 日本最新不卡在线| 国产精品久线在线观看| 五月天久久比比资源色| 国产精品一区二区久久不卡| 欧美一级片在线| 亚洲一区在线视频观看| 92国产精品观看| 国产精品成人免费精品自在线观看 | 色婷婷久久一区二区三区麻豆| 26uuu国产日韩综合| 久久国产精品区| 日韩欧美一级二级三级| 久久99久国产精品黄毛片色诱| 日韩欧美资源站| 狠狠色丁香婷婷综合久久片| 欧美一级国产精品| 免费看日韩精品| 久久久久久久综合| 成人午夜激情影院| 亚洲欧洲精品天堂一级| 色综合久久综合| 五月天一区二区三区| 日韩一区二区电影| 国产成人在线视频播放| 国产免费久久精品| 在线精品视频免费观看| 日日夜夜免费精品| 久久综合999| 91麻豆6部合集magnet| 亚洲综合免费观看高清完整版在线| 欧洲国内综合视频| 麻豆精品视频在线观看视频| 国产欧美一区二区精品性色| 色婷婷精品久久二区二区蜜臀av| 亚洲大型综合色站| 2022国产精品视频| 在线视频一区二区免费| 日本亚洲三级在线| 国产精品视频一二三区| 欧美日韩视频在线第一区| 麻豆91在线播放免费| 亚洲欧洲国产专区| 欧美一区二区成人| 在线免费一区三区| 国内精品在线播放| 午夜影院久久久| 国产女同性恋一区二区| 91.成人天堂一区| 成人丝袜18视频在线观看| 国产精品国产三级国产普通话三级| 亚洲国产成人在线| 久久精品999| 美女视频黄频大全不卡视频在线播放| 久久99久久精品欧美| 日韩精品在线网站| 欧美日韩国产一区二区三区地区| 2021久久国产精品不只是精品| 色综合久久天天| 免费成人美女在线观看| 亚洲激情五月婷婷| 中文字幕精品三区| 日韩视频123| 欧美性色aⅴ视频一区日韩精品| 国产一区二区三区高清播放| 婷婷一区二区三区| 国产精品天干天干在观线| 日韩亚洲欧美中文三级| 91黄视频在线| 日本国产一区二区| 成人av电影观看| 国产裸体歌舞团一区二区| 亚洲韩国一区二区三区| 国产精品成人免费| 中文字幕巨乱亚洲| 国产亚洲一区二区三区四区 | 欧美日韩国产免费一区二区| av中文字幕在线不卡| 国产精品一区专区| 国产精品一级片| 久久99精品国产麻豆不卡| 视频在线观看一区| 日韩专区在线视频| 日韩va欧美va亚洲va久久| 婷婷成人综合网| 丝袜诱惑亚洲看片 | 欧美在线三级电影| 99r精品视频| 色综合天天性综合| 欧美在线观看一二区| 91蜜桃在线观看| 91免费视频观看| 欧美区视频在线观看| 777欧美精品| 久久婷婷综合激情| 国产精品国产三级国产| 亚洲色图视频免费播放| 亚洲激情男女视频| 午夜亚洲福利老司机| 精品一区二区综合| 成人在线视频首页| 91丝袜国产在线播放| 欧美日韩不卡一区| 精品国产三级a在线观看| 久久久国产综合精品女国产盗摄| 国产精品拍天天在线| 一区二区三区蜜桃网| 蜜桃一区二区三区四区| 国产91精品在线观看| 91麻豆精品视频| 日韩一区二区精品在线观看| 国产网站一区二区| 亚洲国产日韩一级| 国产做a爰片久久毛片| 丁香五精品蜜臀久久久久99网站 | 夜夜夜精品看看| 久久精品国产澳门| 99久久久精品免费观看国产蜜| 欧美综合天天夜夜久久| 精品少妇一区二区三区| 日韩毛片一二三区| 精品影院一区二区久久久| 成人app网站| 欧美成人国产一区二区| 国产精品久久久久影院亚瑟| 日韩av网站在线观看| 99精品视频在线观看免费| 日韩一区二区在线播放| 日韩毛片视频在线看| 韩国av一区二区| 在线播放欧美女士性生活| 亚洲国产高清aⅴ视频| 日韩精品欧美精品| 色婷婷久久久久swag精品| 2欧美一区二区三区在线观看视频| 亚洲天堂精品视频| 国产一区二区精品在线观看| 欧美亚洲综合另类| 中文在线一区二区| 精品一区二区三区不卡| 欧美日韩一区二区三区四区| 中文字幕一区在线观看视频| 精品一区二区三区欧美| 欧美另类z0zxhd电影| 一区二区三区日本| 99在线精品免费| 国产精品麻豆网站| 成人午夜电影久久影院| 欧美www视频| 日本亚洲免费观看| 欧美二区三区91| 亚洲高清免费一级二级三级| 91麻豆国产在线观看| 中文字幕一区二区不卡| 国产不卡视频在线播放| 久久久亚洲欧洲日产国码αv| 日本成人在线看| 91精品国产色综合久久不卡电影| 一区二区三区在线观看动漫| 99久久久国产精品| 亚洲色欲色欲www| 92精品国产成人观看免费| 最新不卡av在线| 91丨国产丨九色丨pron| 亚洲乱码国产乱码精品精的特点| 色综合久久中文字幕| 亚洲一区二区三区中文字幕| 色悠悠久久综合| 一区2区3区在线看| 欧美亚洲另类激情小说| 偷拍日韩校园综合在线| 51精品视频一区二区三区| 日韩国产精品久久久| 日韩免费视频线观看| 国产一区二区三区不卡在线观看 | 久久久亚洲精品一区二区三区 | 精品女同一区二区| 国产成人aaaa| 亚洲激情校园春色| 日韩精品在线一区| 国产一区二区毛片| 亚洲男同性视频| 欧美视频一区二| 精品亚洲porn| 国产精品九色蝌蚪自拍| 欧美视频完全免费看| 青青草国产成人av片免费| 精品国产免费一区二区三区香蕉| 成人一区二区三区在线观看 | 在线看日本不卡| 精一区二区三区| 亚洲美女免费在线| 日韩一区二区免费在线电影| 国产精品123| 亚洲成人免费在线| 久久精品亚洲乱码伦伦中文 | 成人毛片老司机大片| 天堂精品中文字幕在线| 国产精品高潮久久久久无| 欧美日韩一区不卡|