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

linux下進程與線程

運維 系統運維
按照教科書上的定義,進程是資源管理的最小單位,線程是程序執行的最小單位。在操作系統設計上,從進程演化出線程,最主要的目的就是更好的支持SMP以及減小(進程/線程)上下文切換開銷。

一.基礎知識:線程和進程

按照教科書上的定義,進程是資源管理的最小單位,線程是程序執行的最小單位。在操作系統設計上,從進程演化出線程,最主要的目的就是更好的支持SMP以及減小(進程/線程)上下文切換開銷。

無論按照怎樣的分法,一個進程至少需要一個線程作為它的指令執行體,進程管理著資源(比如cpu、內存、文件等等),而將線程分配到某個cpu上執行。一個進程當然可以擁有多個線程,此時,如果進程運行在SMP機器上,它就可以同時使用多個cpu來執行各個線程,達到***程度的并行,以提高效率;同時,即使是在單cpu的機器上,采用多線程模型來設計程序,正如當年采用多進程模型代替單進程模型一樣,使設計更簡潔、功能更完備,程序的執行效率也更高,例如采用多個線程響應多個輸入,而此時多線程模型所實現的功能實際上也可以用多進程模型來實現,而與后者相比,線程的上下文切換開銷就比進程要小多了,從語義上來說,同時響應多個輸入這樣的功能,實際上就是共享了除cpu以外的所有資源的。

針對線程模型的兩大意義,分別開發出了核心級線程和用戶級線程兩種線程模型,分類的標準主要是線程的調度者在核內還是在核外。前者更利于并發使用多處理器的資源,而后者則更多考慮的是上下文切換開銷。在目前的商用系統中,通常都將兩者結合起來使用,既提供核心線程以滿足smp系統的需要,也支持用線程庫的方式在用戶態實現另一套線程機制,此時一個核心線程同時成為多個用戶態線程的調度者。正如很多技術一樣,"混合"通常都能帶來更高的效率,但同時也帶來更大的實現難度,出于"簡單"的設計思路,Linux從一開始就沒有實現混合模型的計劃,但它在實現上采用了另一種思路的"混合"。

在線程機制的具體實現上,可以在操作系統內核上實現線程,也可以在核外實現,后者顯然要求核內至少實現了進程,而前者則一般要求在核內同時也支持進程。核心級線程模型顯然要求前者的支持,而用戶級線程模型則不一定基于后者實現。這種差異,正如前所述,是兩種分類方式的標準不同帶來的。

當核內既支持進程也支持線程時,就可以實現線程-進程的"多對多"模型,即一個進程的某個線程由核內調度,而同時它也可以作為用戶級線程池的調度者,選擇合適的用戶級線程在其空間中運行。這就是前面提到的"混合"線程模型,既可滿足多處理機系統的需要,也可以***限度的減小調度開銷。絕大多數商業操作系統(如Digital Unix、Solaris、Irix)都采用的這種能夠完全實現POSIX1003.1c標準的線程模型。在核外實現的線程又可以分為"一對一"、"多對一"兩種模型,前者用一個核心進程(也許是輕量進程)對應一個線程,將線程調度等同于進程調度,交給核心完成,而后者則完全在核外實現多線程,調度也在用戶態完成。后者就是前面提到的單純的用戶級線程模型的實現方式,顯然,這種核外的線程調度器實際上只需要完成線程運行棧的切換,調度開銷非常小,但同時因為核心信號(無論是同步的還是異步的)都是以進程為單位的,因而無法定位到線程,所以這種實現方式不能用于多處理器系統,而這個需求正變得越來越大,因此,在現實中,純用戶級線程的實現,除算法研究目的以外,幾乎已經消失了。

Linux內核只提供了輕量進程的支持,限制了更高效的線程模型的實現,但Linux著重優化了進程的調度開銷,一定程度上也彌補了這一缺陷。目前***的線程機制LinuxThreads所采用的就是線程-進程"一對一"模型,調度交給核心,而在用戶級實現一個包括信號處理在內的線程管理機制。Linux-LinuxThreads的運行機制正是本文的描述重點。

二.Linux 2.4內核中的輕量進程實現

最初的進程定義都包含程序、資源及其執行三部分,其中程序通常指代碼,資源在操作系統層面上通常包括內存資源、IO資源、信號處理等部分,而程序的執行通常理解為執行上下文,包括對cpu的占用,后來發展為線程。在線程概念出現以前,為了減小進程切換的開銷,操作系統設計者逐漸修正進程的概念,逐漸允許將進程所占有的資源從其主體剝離出來,允許某些進程共享一部分資源,例如文件、信號,數據內存,甚至代碼,這就發展出輕量進程的概念。Linux內核在2.0.x版本就已經實現了輕量進程,應用程序可以通過一個統一的clone()系統調用接口,用不同的參數指定創建輕量進程還是普通進程。在內核中,clone()調用經過參數傳遞和解釋后會調用do_fork(),這個核內函數同時也是fork()、vfork()系統調用的最終實現:

;

int do_fork(unsigned long clone_flags, unsigned long stack_start,

struct pt_regs *regs, unsigned long stack_size)

其中的clone_flags取自以下宏的"或"值:

;

#define CSIGNAL0x000000ff/* signal mask to be sent at exit */

#define CLONE_VM0x00000100/* set if VM shared between processes */

#define CLONE_FS0x00000200/* set if fs info shared between processes */

#define CLONE_FILES 0x00000400/* set if open files shared between processes */

#define CLONE_SIGHAND0x00000800/* set if signal handlers and blocked signals shared */

#define CLONE_PID0x00001000/* set if pid shared */

#define CLONE_PTRACE0x00002000/* set if we want to let tracing continue on the child too */

#define CLONE_VFORK0x00004000/* set if the parent wants the child to wake it up on mm_release */

#define CLONE_PARENT0x00008000/* set if we want to have the same parent as the cloner */

#define CLONE_THREAD0x00010000/* Same thread group? */

#define CLONE_NEWNS0x00020000/* New namespace group? */

#define CLONE_SIGNAL (CLONE_SIGHAND | CLONE_THREAD)

在do_fork()中,不同的clone_flags將導致不同的行為,對于LinuxThreads,它使用(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND)參數來調用clone()創建"線程",表示共享內存、共享文件系統訪問計數、共享文件描述符表,以及共享信號處理方式。本節就針對這幾個參數,看看Linux內核是如何實現這些資源的共享的。

1.CLONE_VM

do_fork()需要調用copy_mm()來設置task_struct中的mm和active_mm項,這兩個mm_struct數據與進程所關聯的內存空間相對應。如果do_fork()時指定了CLONE_VM開關,copy_mm()將把新的task_struct中的mm和active_mm設置成與current的相同,同時提高該mm_struct的使用者數目(mm_struct::mm_users)。也就是說,輕量級進程與父進程共享內存地址空間,由下圖示意可以看出mm_struct在進程中的地位:

#p#

2.CLONE_FS

task_struct中利用fs(struct fs_struct *)記錄了進程所在文件系統的根目錄和當前目錄信息,do_fork()時調用copy_fs()復制了這個結構;而對于輕量級進程則僅增加fs->;count計數,與父進程共享相同的fs_struct。也就是說,輕量級進程沒有獨立的文件系統相關的信息,進程中任何一個線程改變當前目錄、根目錄等信息都將直接影響到其他線程。

3.CLONE_FILES

一個進程可能打開了一些文件,在進程結構task_struct中利用files(struct files_struct *)來保存進程打開的文件結構(struct file)信息,do_fork()中調用了copy_files()來處理這個進程屬性;輕量級進程與父進程是共享該結構的,copy_files()時僅增加files->;count計數。這一共享使得任何線程都能訪問進程所維護的打開文件,對它們的操作會直接反映到進程中的其他線程。

4.CLONE_SIGHAND

每一個Linux進程都可以自行定義對信號的處理方式,在task_struct中的sig(struct signal_struct)中使用一個struct k_sigaction結構的數組來保存這個配置信息,do_fork()中的copy_sighand()負責復制該信息;輕量級進程不進行復制,而僅僅增加signal_struct::count計數,與父進程共享該結構。也就是說,子進程與父進程的信號處理方式完全相同,而且可以相互更改。

do_fork()中所做的工作很多,在此不詳細描述。對于SMP系統,所有的進程fork出來后,都被分配到與父進程相同的cpu上,一直到該進程被調度時才會進行cpu選擇。

盡管Linux支持輕量級進程,但并不能說它就支持核心級線程,因為Linux的"線程"和"進程"實際上處于一個調度層次,共享一個進程標識符空間,這種限制使得不可能在Linux上實現完全意義上的POSIX線程機制,因此眾多的Linux線程庫實現嘗試都只能盡可能實現POSIX的絕大部分語義,并在功能上盡可能逼近。

#p#

三.LinuxThread的線程機制

LinuxThreads是目前Linux平臺上使用最為廣泛的線程庫,由Xavier Leroy (Xavier.Leroy@inria.fr)負責開發完成,并已綁定在GLIBC中發行。它所實現的就是基于核心輕量級進程的"一對一"線程模型,一個線程實體對應一個核心輕量級進程,而線程之間的管理在核外函數庫中實現。

1.線程描述數據結構及實現限制

LinuxThreads定義了一個struct _pthread_descr_struct數據結構來描述線程,并使用全局數組變量__pthread_handles來描述和引用進程所轄線程。在__pthread_handles中的前兩項,LinuxThreads定義了兩個全局的系統線程:__pthread_initial_thread和__pthread_manager_thread,并用__pthread_main_thread表征__pthread_manager_thread的父線程(初始為__pthread_initial_thread)。

struct _pthread_descr_struct是一個雙環鏈表結構,__pthread_manager_thread所在的鏈表僅包括它一個元素,實際上,__pthread_manager_thread是一個特殊線程,LinuxThreads僅使用了其中的errno、p_pid、p_priority等三個域。而__pthread_main_thread所在的鏈則將進程中所有用戶線程串在了一起。經過一系列pthread_create()之后形成的__pthread_handles數組。

新創建的線程將首先在__pthread_handles數組中占據一項,然后通過數據結構中的鏈指針連入以__pthread_main_thread為首指針的鏈表中。這個鏈表的使用在介紹線程的創建和釋放的時候將提到。

LinuxThreads遵循POSIX1003.1c標準,其中對線程庫的實現進行了一些范圍限制,比如進程***線程數,線程私有數據區大小等等。在LinuxThreads的實現中,基本遵循這些限制,但也進行了一定的改動,改動的趨勢是放松或者說擴大這些限制,使編程更加方便。這些限定宏主要集中在sysdeps/unix/sysv/linux/bits/local_lim.h(不同平臺使用的文件位置不同)中,包括如下幾個:

每進程的私有數據key數,POSIX定義_POSIX_THREAD_KEYS_MAX為128,LinuxThreads使用PTHREAD_KEYS_MAX,1024;私有數據釋放時允許執行的操作數,LinuxThreads與POSIX一致,定義PTHREAD_DESTRUCTOR_ITERATIONS為4;每進程的線程數,POSIX定義為64,LinuxThreads增大到1024(PTHREAD_THREADS_MAX);線程運行棧最小空間大小,POSIX未指定,LinuxThreads使用PTHREAD_STACK_MIN,16384(字節)。

2.管理線程

"一對一"模型的好處之一是線程的調度由核心完成了,而其他諸如線程取消、線程間的同步等工作,都是在核外線程庫中完成的。在LinuxThreads中,專門為每一個進程構造了一個管理線程,負責處理線程相關的管理工作。當進程***次調用pthread_create()創建一個線程的時候就會創建(__clone())并啟動管理線程。

在一個進程空間內,管理線程與其他線程之間通過一對"管理管道(manager_pipe[2])"來通訊,該管道在創建管理線程之前創建,在成功啟動了管理線程之后,管理管道的讀端和寫端分別賦給兩個全局變量__pthread_manager_reader和__pthread_manager_request,之后,每個用戶線程都通過__pthread_manager_request向管理線程發請求,但管理線程本身并沒有直接使用__pthread_manager_reader,管道的讀端(manager_pipe[0])是作為__clone()的參數之一傳給管理線程的,管理線程的工作主要就是監聽管道讀端,并對從中取出的請求作出反應。

初始化結束后,在__pthread_manager_thread中記錄了輕量級進程號以及核外分配和管理的線程id,2*PTHREAD_THREADS_MAX+1這個數值不會與任何常規用戶線程id沖突。管理線程作為pthread_create()的調用者線程的子線程運行,而pthread_create()所創建的那個用戶線程則是由管理線程來調用clone()創建,因此實際上是管理線程的子線程。(此處子線程的概念應該當作子進程來理解。)

__pthread_manager()就是管理線程的主循環所在,在進行一系列初始化工作后,進入while(1)循環。在循環中,線程以2秒為timeout查詢(__poll())管理管道的讀端。在處理請求前,檢查其父線程(也就是創建manager的主線程)是否已退出,如果已退出就退出整個進程。如果有退出的子線程需要清理,則調用pthread_reap_children()清理。

然后才是讀取管道中的請求,根據請求類型執行相應操作(switch-case)。具體的請求處理,源碼中比較清楚,這里就不贅述了。

3.線程棧

在LinuxThreads中,管理線程的棧和用戶線程的棧是分離的,管理線程在進程堆中通過malloc()分配一個THREAD_MANAGER_STACK_SIZE字節的區域作為自己的運行棧。

用戶線程的棧分配辦法隨著體系結構的不同而不同,主要根據兩個宏定義來區分,一個是NEED_SEPARATE_REGISTER_STACK,這個屬性僅在IA64平臺上使用;另一個是FLOATING_STACK宏,在i386等少數平臺上使用,此時用戶線程棧由系統決定具體位置并提供保護。與此同時,用戶還可以通過線程屬性結構來指定使用用戶自定義的棧。因篇幅所限,這里只能分析i386平臺所使用的兩種棧組織方式:FLOATING_STACK方式和用戶自定義方式。

在FLOATING_STACK方式下,LinuxThreads利用mmap()從內核空間中分配8MB空間(i386系統缺省的***棧空間大小,如果有運行限制(rlimit),則按照運行限制設置),使用mprotect()設置其中***頁為非訪問區。低地址被保護的頁面用來監測棧溢出。

對于用戶指定的棧,在按照指針對界后,設置線程棧頂,并計算出棧底,不做保護,正確性由用戶自己保證。

不論哪種組織方式,線程描述結構總是位于棧頂緊鄰堆棧的位置。

4.線程id和進程id
 6.LinuxThreads的不足

由于Linux內核的限制以及實現難度等等原因,LinuxThreads并不是完全POSIX兼容的,在它的發行README中有說明。

1)進程id問題

這個不足是最關鍵的不足,引起的原因牽涉到LinuxThreads的"一對一"模型。

Linux內核并不支持真正意義上的線程,LinuxThreads是用與普通進程具有同樣內核調度視圖的輕量級進程來實現線程支持的。這些輕量級進程擁有獨立的進程id,在進程調度、信號處理、IO等方面享有與普通進程一樣的能力。在源碼閱讀者看來,就是Linux內核的clone()沒有實現對CLONE_PID參數的支持。

在內核do_fork()中對CLONE_PID的處理是這樣的:

if (clone_flags & CLONE_PID) {

if (current->;pid)

goto fork_out;

}

這段代碼表明,目前的Linux內核僅在pid為0的時候認可CLONE_PID參數,實際上,僅在SMP初始化,手工創建進程的時候才會使用CLONE_PID參數。

按照POSIX定義,同一進程的所有線程應該共享一個進程id和父進程id,這在目前的"一對一"模型下是無法實現的。

2)信號處理問題

由于異步信號是內核以進程為單位分發的,而LinuxThreads的每個線程對內核來說都是一個進程,且沒有實現"線程組",因此,某些語義不符合POSIX標準,比如沒有實現向進程中所有線程發送信號,README對此作了說明。

如果核心不提供實時信號,LinuxThreads將使用SIGUSR1和SIGUSR2作為內部使用的restart和cancel信號,這樣應用程序就不能使用這兩個原本為用戶保留的信號了。在Linux kernel 2.1.60以后的版本都支持擴展的實時信號(從_SIGRTMIN到_SIGRTMAX),因此不存在這個問題。

某些信號的缺省動作難以在現行體系上實現,比如SIGSTOP和SIGCONT,LinuxThreads只能將一個線程掛起,而無法掛起整個進程。

3)線程總數問題

LinuxThreads將每個進程的線程***數目定義為1024,但實際上這個數值還受到整個系統的總進程數限制,這又是由于線程其實是核心進程。

在kernel 2.4.x中,采用一套全新的總進程數計算方法,使得總進程數基本上僅受限于物理內存的大小,計算公式在kernel/fork.c的fork_init()函數中:

max_threads = mempages / (THREAD_SIZE/PAGE_SIZE) / 8

在i386上,THREAD_SIZE=2*PAGE_SIZE,PAGE_SIZE=2^12(4KB),mempages=物理內存大小/PAGE_SIZE,對于256M的內存的機器,mempages=256*2^20/2^12=256*2^8,此時***線程數為4096。

但為了保證每個用戶(除了root)的進程總數不至于占用一半以上物理內存,fork_init()中繼續指定:

init_task.rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;

init_task.rlim[RLIMIT_NPROC].rlim_max = max_threads/2;

這些進程數目的檢查都在do_fork()中進行,因此,對于LinuxThreads來說,線程總數同時受這三個因素的限制。

4)管理線程問題

管理線程容易成為瓶頸,這是這種結構的通病;同時,管理線程又負責用戶線程的清理工作,因此,盡管管理線程已經屏蔽了大部分的信號,但一旦管理線程死亡,用戶線程就不得不手工清理了,而且用戶線程并不知道管理線程的狀態,之后的線程創建等請求將無人處理。

5)同步問題

LinuxThreads中的線程同步很大程度上是建立在信號基礎上的,這種通過內核復雜的信號處理機制的同步方式,效率一直是個問題。

6)其他POSIX兼容性問題

Linux中很多系統調用,按照語義都是與進程相關的,比如nice、setuid、setrlimit等,在目前的LinuxThreads中,這些調用都僅僅影響調用者線程。

7)實時性問題

線程的引入有一定的實時性考慮,但LinuxThreads暫時不支持,比如調度選項,目前還沒有實現。不僅LinuxThreads如此,標準的Linux在實時性上考慮都很少。


每個LinuxThreads線程都同時具有線程id和進程id,其中進程id就是內核所維護的進程號,而線程id則由LinuxThreads分配和維護。

__pthread_initial_thread的線程id為PTHREAD_THREADS_MAX,__pthread_manager_thread的是2*PTHREAD_THREADS_MAX+1,***個用戶線程的線程id為PTHREAD_THREADS_MAX+2,此后第n個用戶線程的線程id遵循以下公式:

tid=n*PTHREAD_THREADS_MAX+n+1

這種分配方式保證了進程中所有的線程(包括已經退出)都不會有相同的線程id,而線程id的類型pthread_t定義為無符號長整型(unsigned long int),也保證了有理由的運行時間內線程id不會重復。

從線程id查找線程數據結構是在pthread_handle()函數中完成的,實際上只是將線程號按PTHREAD_THREADS_MAX取模,得到的就是該線程在__pthread_handles中的索引。

5.線程的創建

在pthread_create()向管理線程發送REQ_CREATE請求之后,管理線程即調用pthread_handle_create()創建新線程。分配棧、設置thread屬性后,以pthread_start_thread()為函數入口調用__clone()創建并啟動新線程。pthread_start_thread()讀取自身的進程id號存入線程描述結構中,并根據其中記錄的調度方法配置調度。一切準備就緒后,再調用真正的線程執行函數,并在此函數返回后調用pthread_exit()清理現場。

【編輯推薦】

  1. linux大掃盲:linux之Tar命令常用參數
  2. Linux系統下批量替換文件內容
  3. 永遠不要運行的危險Linux命令!
責任編輯:趙寧寧 來源: chinaitlab
相關推薦

2022-02-07 11:55:00

linux進程線程

2023-03-05 16:12:41

Linux進程線程

2018-07-06 14:00:55

Linux進程線程

2022-10-12 09:01:52

Linux內核線程

2010-01-05 10:00:48

Linux進程間通信

2014-08-01 15:38:37

Linux進程管理

2014-12-11 16:40:31

Android|進程線程

2022-06-07 07:37:40

線程進程開發

2022-05-26 08:31:41

線程Java線程與進程

2009-10-27 08:57:50

linux殺死進程

2011-04-20 17:00:56

Linux終端進程

2009-10-28 10:01:57

2011-07-25 10:00:59

項目

2018-05-31 10:57:31

Linux系統進程線程

2013-12-02 17:33:20

Linux進程多線程

2023-03-03 00:03:07

Linux進程管理

2017-04-11 16:00:40

Linuxsyslog進程

2012-05-04 09:49:34

進程

2021-05-21 09:36:42

開發技能代碼

2019-05-08 11:10:05

Linux進程語言
點贊
收藏

51CTO技術棧公眾號

国偷自产av一区二区三区麻豆| 国产偷久久久精品专区| 日韩不卡av在线| 欧美经典影片视频网站| 午夜不卡av免费| 亚洲人成影视在线观看| 二区三区在线视频| 葵司免费一区二区三区四区五区| 国产午夜精品视频免费不卡69堂| 午夜免费视频网站| 波多视频一区| 一区二区视频在线| 五月天综合网| 五月天丁香视频| 国内精品自线一区二区三区视频| 77777亚洲午夜久久多人| 久久久久久久麻豆| 中文字幕伦av一区二区邻居| 欧美一区二区三区系列电影| 男女视频一区二区三区| 俺来俺也去www色在线观看| 国产精品午夜春色av| 加勒比在线一区二区三区观看| 伊人网免费视频| 母乳一区在线观看| 欧美激情视频免费观看| 四虎永久免费地址| 精品久久影视| 亚洲精品久久久一区二区三区 | 菠萝蜜视频在线观看一区| 性亚洲最疯狂xxxx高清| 精品国产欧美日韩不卡在线观看 | 中文字幕中文字幕在线中一区高清| 亚洲aaa在线观看| 粉嫩13p一区二区三区| 国产中文字幕91| 男人天堂视频在线| 夜夜夜久久久| 97视频在线观看免费高清完整版在线观看 | 欧美成人免费高清视频| 波多野一区二区| 亚洲一区二区三区精品在线| 男人c女人视频| 影院在线观看全集免费观看| 亚洲婷婷国产精品电影人久久| 亚洲福利av| 国产69精品久久app免费版| 国产午夜精品一区二区三区四区| 免费电影一区| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| 免费看成人哺乳视频网站| 自拍偷拍亚洲综合| 一区二区三区四区视频在线观看 | 日韩成人在线视频观看| 在线看黄色的网站| 久久久久久久久久久久久久久久久久久久| 日韩欧美一区二区三区免费看| 久久久夜色精品亚洲| 成人免费在线看片| 中文欧美日本在线资源| 一区精品在线| av资源网在线观看| 国精产品一区一区三区mba桃花 | 国产精品1luya在线播放| 制服丝袜亚洲色图| 捷克做爰xxxⅹ性视频| 国产网友自拍视频导航网站在线观看 | 女人色偷偷aa久久天堂| 蜜臀久久99精品久久久久久宅男| 国产免费久久久久| 欧美特黄视频| 8x拔播拔播x8国产精品| 在线观看一区二区视频| 99超碰麻豆| 亚洲国产精品国自产拍久久| 国产成+人+日韩+欧美+亚洲| 国产亚洲二区| 国产理论电影在线观看| 国产精品国产三级国产普通话三级| 91精品视频网| 日韩 国产 一区| 亚洲图色一区二区三区| 亚洲国产欧美久久| 亚洲a v网站| 91精品国产成人观看| 欧美夫妻性生活xx| 色综合久久久久久久久五月| 免费黄色在线视频网站| 国产精品麻豆久久久| 亚洲av综合色区| 乡村艳史在线观看| 欧美人xxxx| 免费a在线观看播放| 精品日本12videosex| 欧美日韩国产成人高清视频| 伊人中文字幕在线观看 | 亚洲天堂2018av| 成人精品动漫一区二区三区| 国产一区二区精品丝袜| 久草视频中文在线| 秋霞电影一区二区| 国产精品美女诱惑| 日本高清视频在线播放| 欧美日韩国产一区二区三区| 小早川怜子一区二区三区| 日韩极品在线| 欧美成人免费全部观看天天性色| 国产精品久久久久久久久久精爆| 福利一区二区在线| 亚洲一区二区三区乱码| 欧美gv在线| 日韩欧美成人一区| 蜜桃av免费在线观看| 夜夜嗨av一区二区三区网站四季av| 成人国产精品色哟哟| 三级视频在线播放| 亚洲午夜在线电影| www.51色.com| 99久久99久久精品国产片桃花| 欧美一级在线亚洲天堂| 亚洲av无码国产精品永久一区| 国产精品久久久久久久第一福利| 青青草原av在线播放| 国产乱人伦精品一区| 欧美成人黑人xx视频免费观看| 日本视频www色| 26uuu亚洲| 夜夜添无码一区二区三区| 日韩精品久久久久久久软件91| 最新日韩中文字幕| 国产成人a v| 久久久电影一区二区三区| 91精品91久久久中77777老牛| 福利在线一区| 国内精品美女av在线播放| 午夜精品久久久久久久99热黄桃| 自拍偷拍亚洲欧美日韩| 亚洲第一天堂久久| 香蕉视频国产精品| 91天堂在线观看| 成人福利在线观看视频| 3d动漫精品啪啪| 国产尤物在线播放| 久热成人在线视频| 影音先锋在线亚洲| 爱情电影网av一区二区| 久久亚洲国产精品成人av秋霞| 国产毛片一区二区三区va在线 | 久久久久成人网站| 国产成人av一区二区三区在线| 成人在线观看毛片| 成人搞黄视频| 亲子乱一区二区三区电影 | 精品网站aaa| 国内精品久久久久影院优| 天天操天天干天天干| 欧美性高潮在线| 五月天婷婷丁香网| 国产一区二区三区四区五区入口| 国产一二三四区在线观看| 伊人久久噜噜噜躁狠狠躁| 久久久久久亚洲精品中文字幕 | 久久色在线播放| 亚洲精品久久久久久久久久久久久久 | 夜鲁夜鲁夜鲁视频在线播放| 亚洲欧美综合v| 在线观看黄色网| 亚洲黄一区二区三区| 完美搭档在线观看| 视频在线观看国产精品| 亚洲一区三区| 波多野结衣一区二区三区免费视频| 性色av一区二区三区红粉影视| 全色精品综合影院| 4438成人网| 国产精品视频免费播放| 中文字幕+乱码+中文字幕一区| 亚洲精品成人在线播放| 亚洲激情自拍| 日韩中文一区| 88久久精品| 国产极品jizzhd欧美| 国产网友自拍视频导航网站在线观看| 亚洲成人久久一区| 中文字幕视频在线播放| 亚洲综合久久av| 免费看黄色av| 成人综合在线网站| 国产91色在线观看| 禁久久精品乱码| 亚洲欧洲国产日韩精品| 欧美激情久久久久久久久久久| 国产精品女人久久久久久| 亚洲丝袜精品| 亚洲精品视频免费在线观看| 亚洲无码久久久久久久| 狠狠躁18三区二区一区| 欧美精品一级片| 国产午夜精品一区二区三区四区 | 久久精品视频一区| 在线观看一区二区三区视频| 日韩中文欧美在线| 夜夜添无码一区二区三区| 婷婷综合视频| 欧洲一区二区日韩在线视频观看免费| 狂野欧美xxxx韩国少妇| 国产精品爱啪在线线免费观看| 日本片在线看| 久久精品成人动漫| 日中文字幕在线| 精品国产3级a| 国产视频在线免费观看| 欧美日韩一卡二卡| 日韩美一区二区| 亚洲成av人影院| 久久综合激情网| 一色桃子久久精品亚洲| 国产三级黄色片| 久久久久久综合| 日本黄色免费观看| 国产不卡高清在线观看视频| 99国产精品久久久久久| 蜜臀久久99精品久久久画质超高清 | 丰满大乳少妇在线观看网站| 久久成人人人人精品欧| 欧美尤物美女在线| 一区国产精品视频| 国产黄色免费在线观看| 亚洲美女视频网站| 五月婷婷深深爱| 日韩精品影音先锋| av网站在线观看免费| 日本福利一区二区| 日本天堂网在线| 欧美日韩午夜视频在线观看| 日韩欧美中文字幕一区二区| 一区2区3区在线看| 久久精品www| 亚洲一区视频在线| 国产亚洲自拍av| 一区二区三区四区在线免费观看 | 1卡2卡3卡精品视频| 成人乱码手机视频| 91夜夜未满十八勿入爽爽影院 | 国产在线观看一区| 欧美人妖在线观看| 欧美日韩亚洲一区二区三区四区| 亚洲香蕉视频| 日韩中文字幕一区二区| 日韩久久久久| 艳母动漫在线观看| 欧美日韩国产在线一区| 男人添女荫道口喷水视频| 亚洲福利精品| 成人一级片网站| 青青国产91久久久久久| 911福利视频| 国产精品一区二区果冻传媒| 国产白袜脚足j棉袜在线观看| 97久久精品人人做人人爽| 人妻少妇无码精品视频区| 中文一区在线播放| 久久久久久视频| 香蕉成人啪国产精品视频综合网| av大全在线观看| 欧美日韩精品免费观看视频| 国产同性人妖ts口直男| 亚洲国产日韩欧美在线动漫| 国产露出视频在线观看| 蜜月aⅴ免费一区二区三区 | 欧美性猛交xxx| 中文字幕自拍偷拍| 日韩免费一区二区三区在线播放| 色婷婷av一区二区三区之e本道| 亚洲免费成人av电影| 国产婷婷视频在线| 91极品视频在线| 久久人体av| 国产精品一区二区三区免费观看| 国产精品探花在线观看| 香蕉精品视频在线| 亚洲成人中文| 乌克兰美女av| 成人美女在线观看| 貂蝉被到爽流白浆在线观看| 亚洲一区二区影院| 波多野结衣视频观看| 日韩欧美一级二级三级| 黄色在线网站| 欧美高清第一页| 日韩精品一区二区三区av| 91丨九色丨国产| blacked蜜桃精品一区| 免费网站在线观看视频| 男女性色大片免费观看一区二区| 制服丝袜av在线| 中文字幕亚洲在| 国产91国语对白在线| 日韩欧美国产一区二区三区| 电影在线一区| 26uuu亚洲伊人春色| 免费一级欧美在线大片| 日本一区高清在线视频| 亚洲黄页一区| 久久久久久久久久毛片| 国产亚洲综合av| 国产成人在线播放视频| 日韩欧美国产一二三区| 男人影院在线观看| 国产成人拍精品视频午夜网站| 国产精品流白浆在线观看| 欧美与动交zoz0z| 男女男精品视频| 丰满少妇一区二区| 婷婷综合久久一区二区三区| 国产黄色片免费| 久久久精品999| 久久夜夜久久| 天天人人精品| 老**午夜毛片一区二区三区| 极品白嫩丰满美女无套| 午夜精品福利久久久| www.成人在线观看| 另类色图亚洲色图| 爱情电影网av一区二区| 在线精品日韩| 久久狠狠亚洲综合| 国产又粗又猛又爽又黄的视频四季| 欧美日韩中文字幕| 无码精品在线观看| 午夜精品www| 精品三级av| 水蜜桃色314在线观看| 成人永久免费视频| 欧美日韩精品亚洲精品| 欧美一区二区二区| 最近中文字幕免费mv2018在线| 成人免费观看网址| 亚洲激情久久| 中文字幕55页| 亚洲一区二区欧美激情| 亚洲欧美国产高清va在线播放| 欧美激情视频三区| 老司机在线精品视频| 好吊妞无缓冲视频观看| 97aⅴ精品视频一二三区| 国产成人精品网| 亚洲午夜精品久久久久久久久久久久| 国产 日韩 欧美一区| 成人av电影在线观看| 超碰97av在线| 欧美日韩在线综合| 黄色免费在线观看网站| 91精品中文在线| 欧美在线视屏| 国产a级全部精品| 亚洲精品aaaaa| 不要播放器的av网站| 日本一区二区三区免费乱视频| 狠狠躁夜夜躁人人爽视频| 日韩在线播放视频| 久久伊人久久| 亚洲熟妇无码一区二区三区| 久久综合久久综合久久综合| 亚洲精品国产无码| 久久久精品久久久| 加勒比久久高清| 亚洲欧美另类动漫| 亚洲免费观看在线视频| 五月婷在线视频| 国产精品手机播放| 国产在线日韩| 久久久视频6r| 欧美一级理论性理论a| 毛片电影在线| 一本色道久久综合亚洲二区三区| 国产精品18久久久久久vr| 国产九色在线播放九色| 自拍偷拍免费精品| 91精品导航| 91n.com在线观看| 亚洲国产婷婷综合在线精品| 激情小说 在线视频| 亚洲va电影大全| 性欧美videos另类喷潮| 在线观看美女av| 亚洲欧美国产另类| 麻豆一二三区精品蜜桃| 女人和拘做爰正片视频| 中文字幕中文乱码欧美一区二区| 欧美一区二不卡视频| 国产精品久久久久久久美男| 伊人成年综合电影网| 日本不卡一区视频| 亚洲开心激情网| 日韩在线亚洲| 色播五月综合网| 欧美日韩激情视频8区| 中文字幕中文字幕在线中高清免费版 | 日韩三级在线播放|