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

深入理解Linux內(nèi)核之主調(diào)度器(上)

系統(tǒng) Linux
本文步進(jìn)到Linux內(nèi)核進(jìn)程管理的核心部分,打開(kāi)調(diào)度器的黑匣子,來(lái)看看Linux內(nèi)核如何調(diào)度進(jìn)程的。實(shí)際上,進(jìn)程調(diào)度器主要做兩件事:選擇下一個(gè)進(jìn)程,然后進(jìn)行上下文切換。

[[408791]]

本文轉(zhuǎn)載自微信公眾號(hào)「Linux內(nèi)核遠(yuǎn)航者」,作者Linux內(nèi)核遠(yuǎn)航者。轉(zhuǎn)載本文請(qǐng)聯(lián)系Linux內(nèi)核遠(yuǎn)航者公眾號(hào)。

1.開(kāi)場(chǎng)白

環(huán)境:

  • 處理器架構(gòu):arm64
  • 內(nèi)核源碼:linux-5.11
  • ubuntu版本:20.04.1
  • 代碼閱讀工具:vim+ctags+cscope

本文步進(jìn)到Linux內(nèi)核進(jìn)程管理的核心部分,打開(kāi)調(diào)度器的黑匣子,來(lái)看看Linux內(nèi)核如何調(diào)度進(jìn)程的。實(shí)際上,進(jìn)程調(diào)度器主要做兩件事:選擇下一個(gè)進(jìn)程,然后進(jìn)行上下文切換。而何時(shí)調(diào)用主調(diào)度器調(diào)度進(jìn)程那是調(diào)度時(shí)機(jī)所關(guān)注的問(wèn)題,而調(diào)度時(shí)機(jī)在之前的內(nèi)核搶占文章已經(jīng)做了詳細(xì)講解,在此不在贅述,而本文關(guān)注的調(diào)度時(shí)機(jī)是真正調(diào)用主調(diào)度器的時(shí)機(jī)。

本文分析的內(nèi)核源代碼主要集中在:

  • kernel/sched/core.c
  • kernel/sched/fair.c

2.調(diào)用時(shí)機(jī)

關(guān)于調(diào)度時(shí)機(jī),網(wǎng)上的文章也五花八門(mén),之前在內(nèi)核搶占文章已經(jīng)做了詳細(xì)講解,而在本文我們從源碼注釋中給出依據(jù)(再次強(qiáng)調(diào)一下:本文的調(diào)度時(shí)機(jī)關(guān)注的是何時(shí)調(diào)用主調(diào)度器,不是設(shè)置重新調(diào)度標(biāo)志的時(shí)機(jī),之前講解中我們知道他們都可以稱為調(diào)度時(shí)機(jī))。

先來(lái)說(shuō)一下什么是主調(diào)度器,其實(shí)和主調(diào)度器并列的還有一個(gè)叫做周期性調(diào)度器的東西(后面有機(jī)會(huì)會(huì)講解,主要用于時(shí)鐘中斷tick調(diào)來(lái)使奪取處理器的控制權(quán)),他們都是內(nèi)核中的一個(gè)函數(shù),在合適的時(shí)機(jī)被調(diào)用。

主調(diào)度器函數(shù)如下:

  1. kernel/sched/core.c 
  2.  
  3. __schedule() 

內(nèi)核的很多路徑會(huì)包裝這個(gè)函數(shù),主要分為主動(dòng)調(diào)度和搶占式調(diào)度場(chǎng)景。

內(nèi)核源碼中主調(diào)度器函數(shù)也給出了調(diào)度時(shí)機(jī)的注釋,下面我們就以此為依據(jù)來(lái)看下:

  1. kernel/sched/core.c 
  2. /* 
  3.  * __schedule() is the main scheduler function.                                 
  4.  *                                                                              
  5.  * The main means of driving the scheduler and thus entering this function are: 
  6.  *                                                                              
  7.  *   1. Explicit blocking: mutex, semaphore, waitqueue, etc.                    
  8.  *                                                                              
  9.  *   2. TIF_NEED_RESCHED flag is checked on interrupt and userspace return      
  10.  *      paths. For example, see arch/x86/entry_64.S.                            
  11.  *                                                                              
  12.  *      To drive preemption between tasks, the scheduler sets the flag in timer 
  13.  *      interrupt handler scheduler_tick().                                     
  14.  *                                                                              
  15.  *   3. Wakeups don't really cause entry into schedule(). They add a            
  16.  *      task to the run-queue and that's it.                                    
  17.  *                                                                              
  18.  *      Now, if the new task added to the run-queue preempts the current        
  19.  *      task, then the wakeup sets TIF_NEED_RESCHED and schedule() gets         
  20.  *      called on the nearest possible occasion:                                
  21.  *                                                                              
  22.  *       - If the kernel is preemptible (CONFIG_PREEMPTION=y):                  
  23.  *                                                                              
  24.  *         - in syscall or exception context, at the next outmost               
  25.  *           preempt_enable(). (this might be as soon as the wake_up()'s        
  26.  *           spin_unlock()!)                                                    
  27.  *                                                                              
  28.  *         - in IRQ context, return from interrupt-handler to                   
  29.  *           preemptible context                                                
  30.  *                                                                              
  31.  *       - If the kernel is not preemptible (CONFIG_PREEMPTION is not set)      
  32.  *         then at the next:                                                    
  33. *          - cond_resched() call                                
  34. *          - explicit schedule() call                           
  35. *          - return from syscall or exception to user-space     
  36. *          - return from interrupt-handler to user-space        
  37. *                                                               
  38. * WARNING: must be called with preemption disabled!             
  39. */                                                              
  40. static void __sched notrace __schedule(bool preempt)             

我們對(duì)注釋做出解釋,讓大家深刻理解調(diào)度時(shí)機(jī)(基本上是原樣翻譯,用顏色標(biāo)注)。

1.顯式阻塞場(chǎng)景:包括互斥體、信號(hào)量、等待隊(duì)列等。

這個(gè)場(chǎng)景主要是為了等待某些資源而主動(dòng)放棄處理器,來(lái)調(diào)用主調(diào)度器,如發(fā)現(xiàn)互斥體被其他內(nèi)核路徑所持有,則睡眠等待互斥體被釋放的時(shí)候來(lái)喚醒我。

2.在中斷和用戶空間返回路徑上檢查T(mén)IF_NEED_RESCHED標(biāo)志。例如,arch/x86/entry_64.S。為了在任務(wù)之間驅(qū)動(dòng)搶占,調(diào)度程序在計(jì)時(shí)器中斷處理程序scheduler_tick()中設(shè)置標(biāo)志。

解釋如下:這實(shí)際上是說(shuō)重新調(diào)度標(biāo)志(TIF_NEED_RESCHED)的設(shè)置和檢查的情形。

1)重新調(diào)度標(biāo)志設(shè)置情形:如scheduler_tick周期性調(diào)度器按照特定條件設(shè)置、喚醒的路徑上按照特定條件設(shè)置等。當(dāng)前這樣的場(chǎng)景并不會(huì)直接調(diào)用主調(diào)度器,而會(huì)在最近的調(diào)度點(diǎn)到來(lái)時(shí)調(diào)用主調(diào)度器。

2)重新調(diào)度標(biāo)志檢查情形:是真正的調(diào)用主調(diào)度器,下面的場(chǎng)景都會(huì)涉及到,在此不在贅述。

3.喚醒并不會(huì)真正導(dǎo)致schedule()的進(jìn)入。他們添加一個(gè)任務(wù)到運(yùn)行隊(duì)列,僅此而已。

現(xiàn)在,如果添加到運(yùn)行隊(duì)列中的新任務(wù)搶占了當(dāng)前任務(wù),那么喚醒設(shè)置TIF_NEED_RESCHED, schedule()在最近的可能情況下被調(diào)用:

1)如果內(nèi)核是可搶占的(CONFIG_PREEMPTION=y)

-在系統(tǒng)調(diào)用或異常上下文中,最外層的preempt_enable()。(這可能和wake_up()的spin_unlock()一樣快!)

-在IRQ上下文中,從中斷處理程序返回到搶占上下文

注釋中很簡(jiǎn)潔的幾句話,但其中的含義需要深刻去體會(huì)。

首先需要知道一點(diǎn)是:內(nèi)核搶占說(shuō)的是處于內(nèi)核態(tài)的任務(wù)被其他任務(wù)所搶占的情況(無(wú)論是不是可搶占式內(nèi)核,處于用戶態(tài)的任務(wù)都可以被搶占,處于內(nèi)核態(tài)的任務(wù)是否能被搶占由是否開(kāi)啟內(nèi)核搶占來(lái)決定),當(dāng)然內(nèi)核態(tài)的任務(wù)可以是內(nèi)核線程也可以是通過(guò)系統(tǒng)調(diào)用請(qǐng)求內(nèi)核服務(wù)的用戶任務(wù)。

情況1:這是重新開(kāi)啟內(nèi)核搶占的情況,即是搶占計(jì)數(shù)器為0時(shí),檢查重新調(diào)度標(biāo)志(TIF_NEED_RESCHED),如果設(shè)置則調(diào)用主調(diào)度器,放棄處理器(這是搶占式調(diào)度)。

情況2:中斷返回內(nèi)核態(tài)的時(shí)候,檢查重新調(diào)度標(biāo)志(TIF_NEED_RESCHED),如果設(shè)置且搶占計(jì)數(shù)器為0時(shí)則調(diào)用主調(diào)度器,放棄處理器(這是搶占式調(diào)度)。

注:關(guān)于內(nèi)核搶占可以參考之前發(fā)布的文章。

2)如果內(nèi)核是不可搶占的(CONFIG_PREEMPTION=y)

  • cond_resched()調(diào)用
  • 顯式的schedule()調(diào)用
  • 從系統(tǒng)調(diào)用或異常返回到用戶空間
  • 從中斷處理器返回到用戶空間

解釋如下:

cond_resched()是為了在不可搶占內(nèi)核的一些耗時(shí)的內(nèi)核處理路徑中增加主動(dòng)搶占點(diǎn)(搶占計(jì)數(shù)器是否為0且當(dāng)前任務(wù)被設(shè)置了重新調(diào)度標(biāo)志),則調(diào)用主調(diào)度器進(jìn)行搶占式調(diào)度,所進(jìn)行低延時(shí)處理。

顯式的schedule()調(diào)用,這是主動(dòng)放棄處理器的場(chǎng)景,如一些睡眠場(chǎng)景,像用戶任務(wù)調(diào)用sleep。

系統(tǒng)調(diào)用或異常返回到用戶空間使會(huì)判斷當(dāng)前進(jìn)程是否設(shè)置重新調(diào)度標(biāo)志(TIF_NEED_RESCHED),如果設(shè)置則調(diào)用主調(diào)度器,放棄處理器。

中斷處理器返回到用戶空間會(huì)判斷當(dāng)前進(jìn)程是否設(shè)置重新調(diào)度標(biāo)志(TIF_NEED_RESCHED),如果設(shè)置則調(diào)用主調(diào)度器,放棄處理器。

其實(shí)還有一種場(chǎng)景也會(huì)調(diào)用到主調(diào)度器讓出處理器,那就是進(jìn)程退出時(shí),這里不在贅述。

下面給出總結(jié):

1.主動(dòng)調(diào)度:

  • 睡眠場(chǎng)景,如sleep。
  • 顯式阻塞場(chǎng)景,如互斥體,信號(hào)量,等待隊(duì)列,完成量等。
  • 任務(wù)退出時(shí),調(diào)用do_exit去釋放進(jìn)程資源,最后會(huì)調(diào)用一次主調(diào)度器

2.搶占調(diào)度:

不可搶占式內(nèi)核

  • cond_resched()調(diào)用
  • 顯式的schedule()調(diào)用
  • 從系統(tǒng)調(diào)用或異常返回到用戶空間
  • 從中斷處理器返回到用戶空間

可搶占式內(nèi)核(增加一些搶占點(diǎn))

  • 重新開(kāi)啟內(nèi)核搶占
  • 中斷返回內(nèi)核態(tài)的時(shí)候

3.主調(diào)度器調(diào)用時(shí)機(jī)源碼窺探

下面給出主要的一些主調(diào)度器調(diào)用時(shí)機(jī)源碼分析,作為學(xué)習(xí)參考。

3.1 常規(guī)場(chǎng)景

中斷返回用戶態(tài)場(chǎng)景:

  1. arch/arm64/kernel/entry.S 
  2.  
  3. el0_irq 
  4. -> ret_to_user 
  5. -> work_pending 
  6. -> do_notify_resume 
  7. -> if (thread_flags & _TIF_NEED_RESCHED) {         // arch/arm64/kernel/signal.c 
  8.          schedule(); 
  9.             -> __schedule(false);       //  kernel/sched/core.c   false表示主動(dòng)調(diào)度 
  10.                    

異常返回用戶態(tài)場(chǎng)景:

  1. arch/arm64/kernel/entry.S 
  2.  
  3. el0_sync 
  4. -> ret_to_user 
  5.     ... 

任務(wù)退出場(chǎng)景:

  1. kernel/exit.c 
  2.  
  3. do_exit 
  4.  ->do_task_dead 
  5.      ->__schedule(false);    //  kernel/sched/core.c   false表示主動(dòng)調(diào)度 

顯式阻塞場(chǎng)景(舉例互斥體):

  1. kernel/locking/mutex.c 
  2.  
  3. mutex_lock 
  4.  ->__mutex_lock_slowpath 
  5.      ->__mutex_lock 
  6.          ->__mutex_lock_common 
  7.              ->schedule_preempt_disabled 
  8.                  ->schedule(); 
  9.                  -> __schedule(false);       //  kernel/sched/core.c   false表示主動(dòng)調(diào)度 

3.2 支持內(nèi)核搶占場(chǎng)景

中斷返回內(nèi)核態(tài)場(chǎng)景

  1. arch/arm64/kernel/entry.S 
  2.  
  3. el1_irq 
  4. #ifdef CONFIG_PREEMPTION 
  5. ->arm64_preempt_schedule_irq 
  6.     ->preempt_schedule_irq(); 
  7.         ->__schedule(true);   //kernel/sched/core.c  true表示搶占式調(diào)度 
  8. #endif 

內(nèi)核搶占開(kāi)啟場(chǎng)景

  1. preempt_enable 
  2. ->if (unlikely(preempt_count_dec_and_test())) \   //搶占計(jì)數(shù)器減一  為0         
  3.     __preempt_schedule(); \                   
  4.         ->preempt_schedule  //kernel/sched/core.c    
  5.             -> __schedule(true)  //調(diào)用主調(diào)度器進(jìn)行搶占式調(diào)度 

注:一般說(shuō)異常/中斷返回,返回是處理器異常狀態(tài),可能是用戶態(tài)也可能是內(nèi)核態(tài),但是會(huì)看到很多資料寫(xiě)的都是用戶空間/內(nèi)核空間并不準(zhǔn)確,但是我們認(rèn)為表達(dá)一個(gè)意思,做的心中有數(shù)即可。

3.3.選擇下一個(gè)進(jìn)程

本節(jié)主要講解主調(diào)度器是如何選擇下一個(gè)進(jìn)程的,這和調(diào)度策略強(qiáng)相關(guān)。

下面我們來(lái)看具體實(shí)現(xiàn):

  1. kernel/sched/core.c 
  2.  
  3. __schedule 
  4. -> next = pick_next_task(rq, prev, &rf); 
  5.     ->if (likely(prev->sched_class <= &fair_sched_class &&               
  6.         ¦  rq->nr_running == rq->cfs.h_nr_running)) {              
  7.                                                                    
  8.         p = pick_next_task_fair(rq, prev, rf);                     
  9.         if (unlikely(p == RETRY_TASK))                             
  10.                 goto restart;                                      
  11.                                                                    
  12.         /* Assumes fair_sched_class->next == idle_sched_class */   
  13.         if (!p) {                                                  
  14.                 put_prev_task(rq, prev);                           
  15.                 p = pick_next_task_idle(rq);                       
  16.         }                                                          
  17.                                                                    
  18.         return p;                                                  
  19. }       
  20.  
  21.  
  22.  for_each_class(class) {                      
  23.          p = class->pick_next_task(rq);       
  24.          if (p)                               
  25.                  return p;                    
  26.  }                                            

這里做了優(yōu)化,當(dāng)當(dāng)前進(jìn)程的調(diào)度類為公平調(diào)度類或者空閑調(diào)度類時(shí),且cpu運(yùn)行隊(duì)列的進(jìn)程個(gè)數(shù)等于cfs運(yùn)行隊(duì)列進(jìn)程個(gè)數(shù),說(shuō)明運(yùn)行隊(duì)列進(jìn)程都是普通進(jìn)程,則直接調(diào)用公平調(diào)度類的pick_next_task_fair選擇下一個(gè)進(jìn)程(選擇紅黑樹(shù)最左邊的那個(gè)進(jìn)程),如果沒(méi)有找到說(shuō)明當(dāng)前進(jìn)程調(diào)度類為空閑調(diào)度類,直接調(diào)用pick_next_task_idle選擇idle進(jìn)程。

否則,遍歷調(diào)度類,從高優(yōu)先級(jí)調(diào)度類開(kāi)始調(diào)用其pick_next_task方法選擇下一個(gè)進(jìn)程。

下面以公平調(diào)度類為例來(lái)看如何選擇下一個(gè)進(jìn)程的:調(diào)用過(guò)程如下(這里暫不考慮組調(diào)度情況):

  1. pick_next_task 
  2. ->pick_next_task_fair   //kernel/sched/fair.c 
  3.     -> if (prev)                         
  4.          put_prev_task(rq, prev);  
  5.     
  6.     
  7.    se = pick_next_entity(cfs_rq, NULL);   
  8.    set_next_entity(cfs_rq, se);           

先看put_prev_task:

  1. put_prev_task 
  2. ->prev->sched_class->put_prev_task(rq, prev); 
  3.     ->put_prev_task_fair 
  4.         ->put_prev_entity(cfs_rq, se); 
  5.             ->/* Put 'current' back into the tree. */  
  6.                 __enqueue_entity(cfs_rq, prev);          
  7.               cfs_rq->curr = NULL

這里會(huì)調(diào)用__enqueue_entity將前一個(gè)進(jìn)程重新加入到cfs隊(duì)列的紅黑樹(shù)。然后將cfs_rq->curr 設(shè)置為空。

再看pick_next_entity:

  1. pick_next_entity 
  2. ->left = __pick_first_entity(cfs_rq); 
  3.     ->left = rb_first_cached(&cfs_rq->tasks_timeline);   

將選擇cfs隊(duì)列紅黑樹(shù)最左邊進(jìn)程。

最后看set_next_entity:

  1. set_next_entity 
  2.  ->__dequeue_entity(cfs_rq, se); 
  3.     ->cfs_rq->curr = se; 

這里調(diào)用__dequeue_entity將下一個(gè)選擇的進(jìn)程從cfs隊(duì)列的紅黑樹(shù)中刪除,然后將cfs隊(duì)列的curr指向進(jìn)程的調(diào)度實(shí)體。

選擇下一個(gè)進(jìn)程總結(jié)如下:

  • 運(yùn)行隊(duì)列中只有公平進(jìn)程則選擇公平調(diào)度類的pick_next_task_fair選擇進(jìn)程。
  • 當(dāng)前進(jìn)程為idle進(jìn)程,且沒(méi)有公平進(jìn)程存在情況下,調(diào)用pick_next_task_idle選擇idle進(jìn)程。
  • 運(yùn)行隊(duì)列存在除了公平進(jìn)程的其他進(jìn)程,則從高優(yōu)先級(jí)到低優(yōu)先級(jí)調(diào)用具體調(diào)度類的pick_next_task選擇進(jìn)程。
  • 對(duì)于公平調(diào)度類,選擇下一個(gè)進(jìn)程主要過(guò)程如下:1)調(diào)用put_prev_task方法將前一個(gè)進(jìn)程重新加入cfs隊(duì)列的紅黑樹(shù)。2)調(diào)用pick_next_entity 選擇紅黑樹(shù)最左邊的進(jìn)程作為下一個(gè)進(jìn)程。3)將下一個(gè)進(jìn)程從紅黑樹(shù)中刪除,cfs隊(duì)列的curr指向進(jìn)程的調(diào)度實(shí)體。

通用的調(diào)度類選擇順序?yàn)椋?/p>

stop_sched_class -> dl_sched_class ->rt_sched_class -> fair_sched_class ->idle_sched_class

比如:當(dāng)前運(yùn)行隊(duì)列都是cfs的普通進(jìn)程,某一時(shí)刻發(fā)生中斷喚醒了一個(gè)rt進(jìn)程,那么在最近的調(diào)度點(diǎn)到來(lái)時(shí)就會(huì)調(diào)用主調(diào)度器選擇rt進(jìn)程作為next進(jìn)程。

做了以上的工作之后,紅黑樹(shù)中選擇下一個(gè)進(jìn)程的時(shí)候就不會(huì)再選擇到當(dāng)前cpu上運(yùn)行的進(jìn)程了,而當(dāng)前進(jìn)程調(diào)度實(shí)體又被cfs隊(duì)列的curr來(lái)記錄著(運(yùn)行隊(duì)列的curr也會(huì)記錄當(dāng)前進(jìn)程)。

下面給出公平調(diào)度類選擇下一個(gè)進(jìn)程圖解(其中A為前一個(gè)進(jìn)程,即是當(dāng)前進(jìn)程,即為前一個(gè)進(jìn)程,B為下一個(gè)進(jìn)程):

 

責(zé)任編輯:武曉燕 來(lái)源: Linux內(nèi)核遠(yuǎn)航者
相關(guān)推薦

2021-07-05 06:51:45

Linux內(nèi)核調(diào)度器

2021-05-19 07:56:26

Linux內(nèi)核搶占

2025-06-16 05:10:00

2021-12-09 08:09:31

Linux內(nèi)核臟頁(yè)

2021-07-26 07:47:36

數(shù)據(jù)庫(kù)

2021-07-20 08:02:41

Linux進(jìn)程睡眠

2022-08-21 16:52:27

Linux虛擬內(nèi)存

2020-09-28 08:44:17

Linux內(nèi)核

2023-02-10 08:11:43

Linux系統(tǒng)調(diào)用

2022-11-09 08:12:07

2025-10-28 04:25:00

2021-08-31 10:32:11

LinuxPage Cache命令

2013-06-20 10:25:56

2016-12-08 15:36:59

HashMap數(shù)據(jù)結(jié)構(gòu)hash函數(shù)

2010-06-01 15:25:27

JavaCLASSPATH

2020-07-21 08:26:08

SpringSecurity過(guò)濾器

2016-08-31 15:41:19

PythonThreadLoca變量

2025-04-22 08:21:10

2025-04-28 02:00:00

2017-01-12 19:34:58

點(diǎn)贊
收藏

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

久久er99精品| 欧美xxxxx视频| 欧美日韩中文字幕在线视频| 日韩欧美精品一区二区三区经典| 亚洲天堂中文字幕在线| 欧美日韩国产探花| 亚洲视频视频在线| 亚洲一区二区图片| 97成人资源| 国产精品成人在线观看| 国产亚洲二区| 国产精品久久欧美久久一区| 在线亚洲伦理| 久久这里只有精品99| 亚洲天堂视频一区| 中文字幕一区二区三区日韩精品| 色婷婷激情一区二区三区| 最新av在线免费观看| 四虎国产精品永远| 国产成人日日夜夜| 国产精品偷伦一区二区| 圆产精品久久久久久久久久久| 欧美电影《轻佻寡妇》| 亚洲精品自在久久| 四虎精品一区二区| 国产一区二区三区精品在线观看| 欧美午夜精品久久久久久久| 日韩精品一区二区三区电影| 国产视频福利在线| 91丨porny丨国产| 亚洲一区二区少妇| 中文字幕视频在线播放| 美女黄网久久| 69av视频在线播放| 国产精品1234区| 一二三区不卡| 久久久精品国产亚洲| 免费看黄色av| 精品影片在线观看的网站| 精品久久人人做人人爽| 午夜免费一级片| 国产精品诱惑| 在线观看日韩av先锋影音电影院| 国产69精品久久久久久久| 91黄色在线| 亚洲色大成网站www久久九九| 水蜜桃一区二区三区| 日韩电影免费| 91免费在线视频观看| 国产麻豆日韩| 欧洲成人一区二区三区| 成人午夜伦理影院| 国产精品视频免费一区| 国模私拍视频在线| 波多野结衣亚洲一区| 国内精品视频免费| 日韩一级免费毛片| 99久久99久久精品免费看蜜桃| 国产精品国产三级欧美二区| 成人黄色在线观看视频| 成人免费毛片app| 国产精品免费一区二区三区观看| 亚洲av无码乱码国产麻豆| 国产福利一区在线| 国产精品中出一区二区三区| 天堂在线视频免费| 成人av资源站| 久久久com| 成人h小游戏| 国产精品美女久久久久久2018| 性高潮久久久久久久久| 亚洲搞黄视频| 亚洲精品国产高清久久伦理二区| 日韩精品免费一区| av福利导福航大全在线| 欧美日韩国产在线看| 免费看a级黄色片| 久久久久伊人| 精品少妇一区二区三区在线播放| 久久久久久婷婷| 免费av一区二区三区四区| 神马久久久久久| 国产小视频在线看| 久久久久久亚洲精品杨幂换脸| 国产精品一区久久久| 国产三级第一页| 99久久久无码国产精品| 欧美久久综合性欧美| 黄视频网站在线| 性久久久久久久久| 精品久久久噜噜噜噜久久图片| 国产日本亚洲| 精品调教chinesegay| 来吧亚洲综合网| 99精品热6080yy久久| 国产精品久久久久久久久久ktv | 免费在线观看污视频| 中文字幕久久午夜不卡| 黄色片免费在线观看视频| 在线中文字幕播放| 欧美一级欧美三级| 久久精品成人av| 欧美精品国产| 国产成人精品久久久| 国产人妻精品一区二区三| 91女人视频在线观看| 三级在线免费观看| 黄色综合网址| 日韩欧美亚洲国产精品字幕久久久| 三级男人添奶爽爽爽视频| 色无极亚洲影院| 97视频人免费观看| 国产又大又粗又长| 久久看人人爽人人| 日韩精品在线中文字幕| 亚洲视频资源| 亚洲视频欧洲视频| 国产福利拍拍拍| 国产精品夜夜嗨| 性欧美.com| 国产高清不卡| 亚洲第一精品夜夜躁人人爽 | 国产精品大片wwwwww| 亚洲xxx在线| 亚洲特黄一级片| 色综合手机在线| 在线日韩网站| 97国产在线视频| 亚洲精品国产suv一区| 国产精品国产三级国产| 亚洲视频在线a| 伊人久久大香线蕉综合网站| 久久久久久一区二区三区| 国产青青草视频| 亚洲色图制服诱惑| 免费一级特黄录像| 全球成人免费直播| 国产精品久久久久久婷婷天堂| 天堂资源中文在线| 狠狠躁夜夜躁人人躁婷婷91| 亚洲午夜久久久久久久久| 欧美/亚洲一区| 亚洲最大av网| 日本在线观看高清完整版| 678五月天丁香亚洲综合网| 午夜激情福利电影| 久久99国产精品尤物| 一本色道久久99精品综合| 国产精品亚洲成在人线| 日韩中文字幕在线看| 92久久精品一区二区| 亚洲色图欧洲色图| 91视频福利网| 国一区二区在线观看| 成人片在线免费看| missav|免费高清av在线看| 欧美精品一区二区精品网| 国产乡下妇女做爰视频| 99久久综合精品| 97在线播放视频| 国内黄色精品| 国产欧美婷婷中文| 国内外激情在线| 精品国产免费久久| 依依成人综合网| 国产无人区一区二区三区| 在线免费观看av的网站| 91精品国产91久久久久久黑人| 成人欧美一区二区三区黑人孕妇| av网址在线| 亚洲国内精品在线| 国产一区二区视频免费| 国产精品色婷婷久久58| 国产精品久久久久久久99| 欧美日韩视频| 久久国产精品免费一区| 欧洲成人一区| 欧美成年人在线观看| 人人妻人人澡人人爽久久av| 色悠久久久久综合欧美99| 任你操精品视频| 国产不卡在线视频| 国产日韩一区二区在线观看| 欧美高清视频在线观看mv| 国产精品麻豆免费版| 91精品影视| 欧美黑人极品猛少妇色xxxxx | 日韩有码视频在线| 国精品人妻无码一区二区三区喝尿| 色婷婷一区二区| 神马久久精品综合| 不卡的av在线播放| 99热这里只有精品在线播放| 亚洲五月婷婷| 亚洲三区在线| 精品按摩偷拍| 国产在线a不卡| 男人久久天堂| 久久综合免费视频| 国产二区视频在线观看| 日韩免费观看高清完整版在线观看| 五月天婷婷导航| 亚洲狠狠丁香婷婷综合久久久| 美女100%无挡| 成人美女在线视频| 中文字幕 日韩 欧美| 亚洲在线电影| 黄色激情在线视频| 午夜精品一区二区三区国产 | 国产精品一区av| 欧美aa在线| 欧美国产日韩视频| 看黄网站在线观看| 亚洲欧美日韩视频一区| 亚洲精品久久久久久动漫器材一区| 欧美四级电影网| 国产情侣在线视频| 亚洲国产精品欧美一二99| 国产精品丝袜一区二区| 久久精品亚洲精品国产欧美| 国产精品扒开腿做爽爽爽a片唱戏 亚洲av成人精品一区二区三区 | 久久综合久久网| 1024精品久久久久久久久| 日本免费一区二区三区| 日本天堂一区| 国产精品视频福利| 51精品国产| 97人人干人人| 日韩在线精品强乱中文字幕| 国产精品永久免费在线| 午夜无码国产理论在线| 日本在线精品视频| 狠狠躁少妇一区二区三区| 欧美高清性猛交| 色图在线观看| 欧美寡妇偷汉性猛交| 新版中文在线官网| 欧美老肥婆性猛交视频| av免费在线网站| 欧美精品制服第一页| 成码无人av片在线观看网站| 日韩中文字幕第一页| 91欧美在线视频| 神马久久久久久| 欧美激情午夜| 久久久精品美女| 在线观看午夜av| 欧美激情在线狂野欧美精品| 色呦呦网站在线观看| 欧美华人在线视频| zzzwww在线看片免费| 韩国精品久久久999| 草草在线视频| 欧美亚洲伦理www| 朝桐光一区二区| 国产日韩欧美在线观看| 日韩欧美久久| 亚洲a∨日韩av高清在线观看| 亚洲青青一区| 高清不卡日本v二区在线| 成人高潮视频| 久久久久久草| 欧州一区二区| 免费国产成人看片在线| 欧美日韩亚洲一区三区| 黄色成人在线看| 久久久xxx| av中文字幕网址| 成人午夜在线视频| 草草影院第一页| 国产精品久久久久桃色tv| 麻豆疯狂做受xxxx高潮视频| 香蕉成人啪国产精品视频综合网| 日韩一区二区视频在线| 欧美中文字幕一二三区视频| 99草在线视频| 亚洲精品一区在线观看香蕉| 97在线观看免费观看高清| 久久伊人精品视频| 特黄毛片在线观看| 国产精品三级在线| 91精品啪在线观看国产爱臀| 免费99视频| 女人色偷偷aa久久天堂| 国产91在线视频观看| 久久国产婷婷国产香蕉| 欧美xxxxx精品| 国产精品久久久一区麻豆最新章节| 久久亚洲成人av| 欧美在线免费播放| 亚洲国产精品一| 国产一区二区三区中文| 成人爽a毛片免费啪啪动漫| 国产精品91久久久| 北条麻妃在线一区二区免费播放| 欧美一区观看| 国语自产精品视频在线看8查询8| 少妇高清精品毛片在线视频| 国产精品一区二区男女羞羞无遮挡| 亚洲熟妇无码av| 一区二区三区欧美在线观看| 亚洲精品国产欧美在线观看| 精品国产91乱码一区二区三区| 91在线直播| 青青草原一区二区| 久久wwww| 亚洲图片都市激情| 亚洲欧美激情诱惑| 亚洲少妇一区二区| 国产精品免费aⅴ片在线观看| 久久久久久91亚洲精品中文字幕| 91精品国产综合久久久蜜臀图片| 久草在线青青草| 久久人人爽人人爽人人片av高请| 青娱乐极品盛宴一区二区| 美脚丝袜一区二区三区在线观看| 午夜精品剧场| 色91精品久久久久久久久| 久久久www成人免费毛片麻豆 | 麻豆网站在线看| 国产97人人超碰caoprom| 成人看片黄a免费看视频| 懂色av粉嫩av蜜臀av| 麻豆国产精品一区二区三区| 亚洲最大成人网站| 黑人巨大精品欧美一区二区一视频 | 国产精品一区hongkong| 亚洲伊人一本大道中文字幕| 色综合天天爱| 成人免费在线观看视频网站| 久久精品人人爽人人爽| www.毛片.com| 精品亚洲国产视频| 爱啪啪综合导航| 国产精品综合久久久久久| 国内揄拍国内精品久久| 亚洲午夜精品在线观看| 一区二区三区.www| 性欧美18一19性猛交| 欧美成人亚洲成人| 视频精品一区| 国产91在线亚洲| 成人午夜视频网站| 香蕉视频一区二区| 亚洲国内精品视频| 在线免费日韩片| 日韩高清在线播放| 免费久久精品视频| 99久久99久久精品免费看小说. | av在线网址导航| 国产精品久久久久久福利一牛影视| 在线观看免费黄色小视频| 日韩视频在线免费| 国产一区二区在线观| 男人草女人视频| 成人在线视频首页| 91午夜视频在线观看| 国产亚洲激情视频在线| 人人视频精品| 亚洲欧美日韩国产成人综合一二三区| 免费成人性网站| 波多野结衣不卡视频| 精品成a人在线观看| 国产乱码精品一区二三赶尸艳谈| 免费看成人av| 麻豆精品视频在线观看| 农村妇女精品一区二区| 337p日本欧洲亚洲大胆色噜噜| 成人ssswww在线播放| 欧美在线播放一区| 精品一区二区三区免费视频| 五月婷婷一区二区| 日韩精品欧美国产精品忘忧草| 88xx成人免费观看视频库| 亚洲午夜精品久久| 成人午夜在线播放| www.久久网| 欧美成人精品xxx| 亚洲都市激情| 日日干夜夜操s8| 亚洲国产欧美日韩另类综合| 国产综合在线观看| 亚洲va国产va天堂va久久| 亚洲少妇自拍| 亚洲色偷偷综合亚洲av伊人| 亚洲福利视频网| 日韩伦理一区二区| 5月婷婷6月丁香| 亚洲欧美综合另类在线卡通| 狠狠躁夜夜躁av无码中文幕| 国产成人拍精品视频午夜网站| 久久久久久久久久久妇女| 亚洲成人日韩在线| 91精品国产综合久久香蕉麻豆| 少妇视频一区| 欧洲美女和动交zoz0z| 26uuu色噜噜精品一区| 91精品国产乱码久久| 欧美一级电影久久| 你懂的国产精品|