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

Linux內核中的同步與互斥

系統 Linux
Linux是一個內核。“內核”指的是一個提供硬件抽象層、磁盤及文件系統控制、多任務等功能的系統軟件。一個內核不是一套完整的操作系統。一套基于Linux內核的完整操作系統叫作Linux操作系統,或是GNU/Linux。內核中進程也存在著同步和互斥,讓我們看看是如何分析的。

    先看進程間的互斥。在linux內核中主要通過semaphore機制和spin_lock機制實現。主要的區別是在semaphore機制中,進不了臨界區時會進行進程的切換,而spin_lock剛執行忙等(在SMP中)。

    先看內核中的semaphore機制。前提是對引用計數count增減的原子性操作。內核用ato

     mic_t的數據結構和在它上面的一系列操作如atomic_add()、atomic_sub()等等實現。(定義在atomic.h中)

  semaphone機制主要通過up()和down()兩個操作實現。

  semaphone的結構為

 

  1.   struct semaphore {  
  2.  
  3.   atomic_t count;  
  4.  
  5.   int sleepers;  
  6.  
  7.   wait_queue_head_t wait;  
  8.  
  9.   };  

 

  相應的down()函數為

 

  1.   static inline void down(struct semaphore*sem)  
  2.  
  3.   {  

 

  /* 1 */sem->count--; //為原子操作

 

  1.   if(sem->count<0)  
  2.  
  3.   {  
  4.  
  5.   struct task_struct *tsk = current;  
  6.  
  7.   DECLARE_WAITQUEUE(wait, tsk);  
  8.  
  9.   tsk->state = TASK_UNINTERRUPTIBLE;  
  10.  
  11.   add_wait_queue_exclusive(&sem->wait, &wait);  
  12.  
  13.   spin_lock_irq(&semaphore_lock);  

 

  /* 2 */ sem->sleepers++;

 

  1.   for (;;) {  
  2.  
  3.   int sleepers = sem->sleepers;  
  4.  
  5.   /*  
  6.  
  7.   * Add "everybody else" into it. They aren't  
  8.  
  9.   * playing, because we own the spinlock.  
  10.  
  11.   */ 

 

  /* 3 */ if (!atomic_add_negative(sleepers - 1, &sem->count)) {

  /* 4 */ sem->sleepers = 0; //這時sem->count=0

 

  1.   break;  
  2.  
  3.   }  

 

  /* 4 */ sem->sleepers = 1; /* us - see -1 above */ // 這時sem

 

  1.   ->count  
  2.  
  3.   =-1  
  4.  
  5.   spin_unlock_irq(&semaphore_lock);  
  6.  
  7.   schedule();  
  8.  
  9.   tsk->state = TASK_UNINTERRUPTIBLE;  
  10.  
  11.   spin_lock_irq(&semaphore_lock);  
  12.  
  13.   }  
  14.  
  15.   spin_unlock_irq(&semaphore_lock);  
  16.  
  17.   remove_wait_queue(&sem->wait, &wait);  
  18.  
  19.   tsk->state = TASK_RUNNING;  
  20.  
  21.   wake_up(&sem->wait);  
  22.  
  23.   }  
  24.  
  25.   }  

 

  相應的up()函數為

 

  1.   void up(struct semaphore*sem)  
  2.  
  3.   {  

 

  sem->count++; //為原子操作

 

  1.   if(sem->count<=0)  
  2.  
  3.   {  

 

  //喚醒等待隊列中的一個符合條件的進程(因為每個進程都加了TASK_EXCLUSIVE標志)

  。

  };

  假設開始時,count=1;sleepers=0

#p#

     當進程A執行down()時,引用計數count--,如果這時它的值大于等于0,則從down()中直接返回。如果count少于0,則A的state改為TASK_INTERRUPTIBLE后進入這個信號量的等待隊列中,同時使sleepers++;然后重新計算count=sleepers - 1 + count,若這時引用計數仍小于0(一般情況下應為-1,因為count = - sleepers,不過在SMP結構中,期間別的進程可能執行了up()和down()從而使得引用計數的值可能變化),則執行進程切換。

     當進程A又獲得機會運行時,它先執行wake_up(&sem->wait)操作,喚醒等待隊列里的一個進程,接著它進入臨界區,從臨界區出來時執行up()操作,使sem>count++,(如果進程A是從down()中直接返回,因為這時等待隊列一定為空,所以它不用執行wake_up()操作,直接進入臨界區,在從臨界區出來時一樣執行up()操作,使 sem->count++)。這時如果count的值小于等于0,這表明在它在臨界區期間又有一個進程(可能就是它進入臨界區時喚醒的那個進程)進入睡眠了,則執行wake_up()操作,反之,如果count的值已經大于0,這表明在它在臨界區期間沒有別的進程(包括在它進入臨界區時被它喚醒過的那個進程)進入睡眠,那么它就可以直接返回了。

     從被喚醒的那個進程看看,如果在喚醒它的進程沒執行up()之前它就得到了運行機會,這時它又重新計算count=sleepers - 1 + count=-1;從而sleepers被賦值1;這時它又必須進行調度讓出運行的機會給別的進程,自己去睡眠。這正是發生在喚醒它的進程在臨界區時運行的時候。

     如果是在喚醒它的進程執行了up()操作后它才得到了運行機會,而且在喚醒它的進程在臨界區期間時沒別的進程執行down(),則count的值在進程執行up()之前依然為0,這時在up()里面就不必要再執行wake_up()函數了。

     可以通過一個例子來說明具體的實現。設開始sem->count=sem->sleepers=0。也就是有鎖但無等待隊列 (一個進程已經在運行中)。先后分別進行3個down()操作,和3個up()操作,如下:

     為了闡述方便,只保留了一些會改變sleepers和count值的步驟,并且遵循從左到右依次進行的原則。

  down1:

  count(0->-1),sleepers(0->1),sleepers-1+count(-1),count(-1),sleepers(1),調度

  down2:

  count(-1->-2),sleepers(1->2),sleepers-1+count(-1),count(-1),sleepers(1),調度

  down3:

  count(-1->-2),sleepers(1->2),sleepers-1+count(-1),count(-1),sleepers(1),調度

  up1:

  count(-1->0),喚醒一個睡眠進程(設為1),(進程1得到機會運行)sleepers-1+count

  (0),count(0),sleepers(0),break,

  喚醒另一個睡眠進程(設為2),

  (進程2得到機會運行)sleepers-1+count(-1),count(-1),sleepers(1),調度(沒達到

  條件,又得睡覺)

  也可能是這樣的:

  up1`:

  count(-1->0),喚醒一個睡眠進程(設為1),(進程1得到機會運行)sleepers-1+count

  (0),count(0),sleepers(0),break,

  喚醒另一個睡眠進程(設為2),

  進程2在以后才得到機會運行)

  up2:

  count(-1->0),(因為count<=0)喚醒一個睡眠進程(設為2),

  進程2得到機會運行)sleepers-+count(0) , count(0) , sleepers(0) ,break,

  喚醒另一個睡眠進程(設為3),

  進程3得到機會運行)sleepers-1+count(-1),count(-1),sleepers(1),調度(沒達到條

  件,又得睡覺)

  對應上面的1`:

  up2`:

  count(0->1),(因為count>0,所以直接返回)

  進程2得到機會運行)sleepers-1+count(0),count(0),sleepers(0),break,

  喚醒另一個睡眠進程,(設為3)

  up3:

  count(-1->0),(因為count<=0)喚醒一個睡眠進程(設為3),

  進程3得到機會運行)sleepers-1+count(0),count(0),sleepers(0),break,

  喚醒另一個睡眠進程(這時隊列里沒進程了)

  進程3運行結束,執行up(), 使count =1 ,這時變成沒鎖狀態 )

  對應上邊的2`:

  up3`:

  count(0->1),(因為count>0,所以直接返回)

  進程3得到機會運行)sleepers-1+count(0),count(0),sleepers(0),break,

  喚醒另一個睡眠進程(這時隊列里沒進程了)

  進程3運行結束,執行up(), 使count =1 ,這時變成沒鎖狀態 )

  當然,還有另一種情況,就是up()操作和down()操作是交*出現的,

  一般的規律就是,如果進程在臨界區期間又有進程(無論是哪個進程,新來的還是剛被喚醒的那個)進入睡眠,就會令count的值從0變為-1,從而進程在從臨界區出來執行up()里就必須執行一次wake_up(),以確保所有的進程都能被喚醒,因為多喚醒幾個是沒關系的。如果進程在臨界區期間沒有別的進程進入睡眠,則從臨界區出來執行up()時就用不著去執行wake_up()了(當然,執行了也沒什么影響,不過多余罷了)。

     而為什么要把wake_up()和count++分開呢,可以從上面的up1看出來,例如,進程2第一次得到機會運行時,本來這時喚醒它的進程還沒執行up()的,但有可能其它進程執行了 up()了,所以真有可能會發現count==1的情況,這時它就真的不用睡覺了,令count=sl  eepers=0,就可以接著往下執行了。

  還可看出一點,一般的,( count ,sleepers)的值的取值范圍為(n ,0)[n>0] 和(0

  ,0

  )和 (1 ,-1)。

#p#

  下邊看看spin_lock機制。

  Spin_lock采用的方式是讓一個進程運行,另外的進程忙等待,由于在只有一個cpu

  的機

  器(UP)上微觀上只有一個進程在運行。所以在UP中,spin_lock和spin_unlock就都是空

  的了。

  在SMP中,spin_lock()和spin_unlock()定義如下。

 

  1.   typedef struct {  
  2.  
  3.   volatile unsigned int lock;  
  4.  
  5.   } spinlock_t;  

 

  static inline void spin_lock(spinlock_t *lock)

 

  1.   {  
  2.  
  3.   __asm__ __volatile__(  
  4.  
  5.   "\n1:\t" 
  6.  
  7.   "lock ; decb %0\n\t" 
  8.  
  9.   "js 2f\n" //lock->lock< 0 ,jmp 2 forward  
  10.  
  11.   ".section .text.lock,\"ax\"\n" 
  12.  
  13.   "2:\t" 
  14.  
  15.   "cmpb $0,%0\n\t" //wait lock->lock==1  
  16.  
  17.   "rep;nop\n\t" 
  18.  
  19.   "jle 2b\n\t" 
  20.  
  21.   "jmp 1b\n" 
  22.  
  23.   ".previous" 
  24.  
  25.   :"=m" (lock->lock) : : "memory");  
  26.  
  27.   }  

 

  static inline void spin_unlock(spinlock_t *lock)

 

  1.   {  
  2.  
  3.   __asm__ __volatile__(  
  4.  
  5.   "movb $1,%0" 
  6.  
  7.   :"=m" (lock->lock) : : "memory"); //lock->lock=1  
  8.  
  9.   }  

 

  一般是如此使用:

 

  1.   #define SPIN_LOCK_UNLOCKED (spinlock_t) { 1 }  
  2.  
  3.   spinlock_t xxx_lock = SPIN_LOCK_UNLOCKED;  
  4.  
  5.   spin_lock_(&xxx_lock)  
  6.  
  7.   ...  
  8.  
  9.   critical section  
  10.  
  11.   ...  
  12.  
  13.   spin_unlock (&xxx_lock)  

 

     可以看出,它和semaphore機制解決的都是兩個進程的互斥問題,都是讓一個進程退出臨界區后另一個進程才進入的方法,不過sempahore機制實行的是讓進程暫時讓出CPU,進入等待隊列等待的策略,而spin_lock實行的卻是卻進程在原地空轉,等著另一個進程結束的策略。

     下邊考慮中斷對臨界區的影響。要互斥的還有進程和中斷服務程序之間。當一個進程在執行一個臨界區的代碼時,可能發生中斷,而中斷函數可能就會調用這個臨界區的代碼,不讓它進入的話就會產生死鎖。這時一個有效的方法就是關中斷了。

 

  1.   #define local_irq_save(x) __asm__ __volatile__("pushfl ; popl %0 ;  
  2.  
  3.   cli":  
  4.  
  5.   "=g" (x): /* no input */ :"memory")  
  6.  
  7.   #define local_irq_restore(x) __asm__ __volatile__("pushl %0 ; popfl"/*  
  8.  
  9.   no  
  10.  
  11.   output */ :"g" (x):"memory")  
  12.  
  13.   #define local_irq_disable() __asm__ __volatile__("cli": : :"memory")  
  14.  
  15.   #define local_irq_enable() __asm__ __volatile__("sti": : :"memory")  
  16.  
  17.   #define cpu_bh_disable(cpu) do { local_bh_count(cpu)++; barrier(); } while (  
  18.  
  19.   0)  
  20.  
  21.   #define cpu_bh_enable(cpu) do { barrier(); local_bh_count(cpu)--; } while 
  22.  
  23.   (0  
  24.  
  25.   )  
  26.  
  27.   #define local_bh_disable() cpu_bh_disable(smp_processor_id())  
  28.  
  29.   #define local_bh_enable() cpu_bh_enable(smp_processor_id())  

 

  對于UP來說,上面已經是足夠了,不過對于SMP來說,還要防止來自其它cpu的影響,這

  時解決的方法就可以把上面的spin_lock機制也綜合進來了。

 

  1.   #define spin_lock_irqsave(lock, flags) do {  
  2.  
  3.   local_irq_save(flags); sp  
  4.  
  5.   in_lock(lock); } while (0)  
  6.  
  7.   #define spin_lock_irq(lockdo { local_irq_disable();  
  8.  
  9.   spin_lock(lo  
  10.  
  11.   ck); } while (0)  
  12.  
  13.   #define spin_lock_bh(lockdo { local_bh_disable();  
  14.  
  15.   spin_lock(loc  
  16.  
  17.   k); } while (0)  
  18.  
  19.   #define spin_unlock_irqrestore(lock, flags) do { spin_unlock(lock); local_i  
  20.  
  21.   rq_restore(flags); } while (0)  
  22.  
  23.   #define spin_unlock_irq(lockdo { spin_unlock(lock);  
  24.  
  25.   local_irq_enable();  
  26.  
  27.   } while (0)  
  28.  
  29.   #define spin_unlock_bh(lockdo { spin_unlock(lock);  
  30.  
  31.   local_bh_enable();  
  32.  
  33.   } while (0)  

 

  前面說過,對于UP來說,spin_lock()是空的,所以以上的定義就一起適用于UP 和SM

  P的情形了。

  而read_lock_irqsave(lock, flags) , read_lock_irq(lock),

  read_lock_bh(lock) 和

  write_lock_irqsave(lock, flags) , write_lock_irq(lock),

  write_lock_bh(lock

  ) 就是spin_lock的一個小小的變型而己了。

一口能看完的都是大蝦,希望本文能對你們有很大的幫助。

【編輯推薦】

  1. Linux就這樣被黑客入侵
  2. Linux Kernel 2.6.37發布 Ext4性能提升
  3. 如何學好Linux 十一大建議
  4. 從頭學習Linux基礎的8大建議
  5. 眼見為實 近看Sandy Bridge內核真身
  6. 2010年度報告:是誰在編寫Linux內核?
  7. Linux內核編譯之高手教程

 

 

 

 

 

責任編輯:趙鵬 來源: 網絡轉載
相關推薦

2024-07-25 11:53:53

2009-11-28 20:24:13

Linux互斥鎖同步移植

2024-06-28 08:45:58

2010-06-28 10:57:23

nohzhres

2021-06-03 08:03:13

網絡

2020-09-04 10:14:02

Linux驅動7內核

2009-10-29 09:41:01

Linux內核DeviceMappe

2025-03-31 00:01:12

2020-08-26 08:59:58

Linux線程互斥鎖

2018-11-13 12:52:50

Linux內核棧回溯

2010-04-21 12:54:46

Unix內核

2017-03-27 18:05:49

Linux內核編譯與開發

2012-03-09 10:44:11

Java

2018-05-18 09:07:43

Linux內核內存

2009-09-28 10:09:09

Linux內核Linux循環鏈表

2023-05-15 08:58:41

塊設備驅動Linux

2011-07-28 18:24:15

Linux 3.0內核

2012-02-07 16:01:35

Linux內核Android

2010-01-06 16:47:53

Linux內核

2024-08-08 08:19:03

點贊
收藏

51CTO技術棧公眾號

精品人妻一区二区三区换脸明星 | 国产一区二区高清不卡| 久久久久久久久99| 亚洲人成网亚洲欧洲无码| 欧美性一级生活| av日韩在线看| 国产女人在线视频| 国产精品自在在线| 国产成+人+综合+亚洲欧洲| 亚洲欧美卡通动漫| 欧美三级自拍| 91精品国产综合久久久久久久 | 日韩av电影免费播放| 国产三级三级在线观看| 亚欧成人精品| 欧美成人合集magnet| 伊人网伊人影院| 成人午夜网址| 69p69国产精品| 人妻丰满熟妇av无码区app| 免费在线国产视频| 国产精品国产精品国产专区不片| 精品久久久久久综合日本 | 麻豆91在线播放| 69视频在线播放| 三级影片在线看| av一区二区高清| 亚洲精品久久视频| 亚洲成人福利视频| 成人精品高清在线视频| 欧美丝袜一区二区三区| 隔壁人妻偷人bd中字| 欧美成人精品一区二区男人看| 91欧美一区二区| 国产66精品久久久久999小说| 亚洲一级av毛片| 老司机精品导航| 国内精品久久久久久久久| 午夜爽爽爽男女免费观看| 欧美中文一区二区| 亚洲视频精品在线| 人人妻人人澡人人爽人人精品| 91麻豆精品国产91久久久久推荐资源| 欧美人狂配大交3d怪物一区 | 国产一区 二区 三区一级| 国产精品久久久久久久久久尿 | 久久精品国产一区二区三| 日本韩国欧美精品大片卡二| wwwxxx亚洲| 国产日韩高清一区二区三区在线| 欧美高清自拍一区| 久久久久久蜜桃| 国产精品sm| 欧美国产精品va在线观看| 老妇女50岁三级| 欧美 日韩 国产一区二区在线视频 | 国产天堂在线| 国产欧美日韩卡一| 欧美中日韩一区二区三区| 青青草在线免费视频| 99re66热这里只有精品3直播| 国产精品区免费视频| 人妻一区二区三区四区| 不卡欧美aaaaa| 久久综合一区二区三区| 久热av在线| 国产精品视频yy9299一区| 亚洲激情电影在线| 米奇777四色精品人人爽| 亚洲卡通欧美制服中文| 日韩欧美猛交xxxxx无码| 91高清视频在线观看| 五月婷婷久久丁香| 亚洲视频在线a| 一区二区三区| 日韩欧美中文字幕精品| 中文字幕a在线观看| 午夜欧洲一区| 日韩在线激情视频| 日本少妇全体裸体洗澡| 久久婷婷久久| 亚洲一区二区三区四区在线播放| 丰满少妇高潮在线观看| 久久亚洲捆绑美女| 一区二区精品国产| 国产区美女在线| 欧美午夜丰满在线18影院| 国产一区二区在线免费播放| 欧美国产中文高清| 日韩av在线免费看| 美国黄色特级片| 黄色av日韩| 国产精品99久久久久久人| 国产精品无码免费播放| 暴力调教一区二区三区| 日韩欧美第二区在线观看| 精品国产白色丝袜高跟鞋| 午夜在线电影亚洲一区| 欧美激情第3页| 国产精品色在线网站| 亚洲人a成www在线影院| 久久久久久久久久网站| 欧美亚洲专区| 99re视频在线| 在线看免费av| 精品久久久视频| 中文字幕资源在线观看| 天堂资源在线亚洲| 欧美成在线视频| 国产主播第一页| 成人黄色在线看| 一道精品一区二区三区| 碰碰在线视频| 欧美成人伊人久久综合网| 日韩一区二区a片免费观看| 欧美国产另类| 国产噜噜噜噜噜久久久久久久久| 日韩电影在线观看完整版| 亚洲三级在线看| 91香蕉视频污版| 天天躁日日躁成人字幕aⅴ| 久久99热精品这里久久精品| 在线视频 中文字幕| 91蝌蚪porny九色| 欧妇女乱妇女乱视频| 亚洲综合伊人| 这里只有精品在线观看| 人人干人人干人人干| 国产成人综合网| 在线成人性视频| 日本一区二区三区视频在线| 亚洲欧洲国产精品| 亚洲精品77777| k8久久久一区二区三区 | 91在线在线观看| 蜜桃视频在线观看www社区| 欧美视频在线不卡| 日韩一级av毛片| 午夜亚洲一区| 快播亚洲色图| 欧美色网一区| 亚洲人a成www在线影院| 欧美日韩一级黄色片| 91丨porny丨国产| 黄色免费视频大全| 青青久久av| 91地址最新发布| 日韩一级在线播放| 岛国精品视频在线播放| 香港三级日本三级| 亚洲永久网站| 秋霞在线观看一区二区三区| 欧美极品免费| 一区二区三欧美| 欧美激情一区二区三区免费观看| 国产亲近乱来精品视频| 国产免费又粗又猛又爽| 欧美jizz| 91免费欧美精品| 青青草原国产在线| 亚洲第一av网| 国产又大又黄视频| 国产三级精品三级| 天堂av在线8| 欧美日韩少妇| 国偷自产av一区二区三区小尤奈| 美女高潮视频在线看| 亚洲色图18p| ,一级淫片a看免费| 亚洲另类色综合网站| a级一a一级在线观看| 国产精品日韩精品欧美精品| 五月天久久狠狠| 国产高清精品二区| 91精品国产免费久久久久久| 邻居大乳一区二区三区| 欧美色区777第一页| 国产盗摄一区二区三区在线| gogogo免费视频观看亚洲一| 国产v亚洲v天堂无码久久久| 天天久久综合| 国产福利一区二区三区在线观看| 偷拍自拍在线看| 日韩中文字幕第一页| 亚洲av无码专区在线| 一本到三区不卡视频| 欧美爱爱免费视频| 99国产精品一区| 三区视频在线观看| 国产亚洲毛片| 在线免费观看成人| 欧美激情15p| 国产在线高清精品| 日韩电影免费看| 久久午夜a级毛片| 亚洲欧美色视频| 欧美剧在线免费观看网站| 日韩成年人视频| 亚洲欧美日韩一区二区 | 欧美专区第一页| 国产黄色在线网站| 亚洲欧美在线x视频| 国产白浆在线观看| 在线视频国内自拍亚洲视频| 久久免费播放视频| 中文一区二区完整视频在线观看| 美女伦理水蜜桃4| 理论片日本一区| 黄色一级在线视频| 亚洲精品一二三区区别| 日本精品一区二区三区高清 久久| 亚洲精品高潮| 91精品免费看| 亚洲成人一区在线观看| 97色在线观看| 免费影视亚洲| 久久精品视频在线观看| 国产三级视频在线| 日韩成人在线观看| 好男人在线视频www| 欧美一区二区三区在线电影| 国产又粗又猛又爽又| 天天免费综合色| 免费麻豆国产一区二区三区四区| 中文字幕在线不卡视频| 一区二区伦理片| 91亚洲精华国产精华精华液| 欧美性受xxxx黒人xyx性爽| 美女一区二区三区在线观看| 亚洲国产精品久久久久爰色欲| 亚洲国产一区二区精品专区| 日本一二三区视频在线| 国产精品99在线观看| 亚洲二区三区四区| 成人6969www免费视频| 日韩av不卡播放| 不卡视频在线| 日韩激情视频| 欧美精品一二| 日本日本精品二区免费| 亚州综合一区| 蜜桃成人在线| 免费av一区二区三区四区| 久久综合九色99| 蜜臀av免费一区二区三区| 欧美黄色直播| 精品一区av| 亚洲人一区二区| 小说区亚洲自拍另类图片专区| 亚洲三区在线| 91精品国产乱码久久久久久久 | 超碰超碰在线| 欧美大片欧美激情性色a∨久久| 欧美日韩经典丝袜| 国语自产在线不卡| 国产中文在线播放| 日本aⅴ大伊香蕉精品视频| av在线播放一区| 成人a在线视频| 91麻豆精品激情在线观看最新| 国产精品毛片va一区二区三区| 任我爽精品视频在线播放| 免费国产一区二区| 精品国产乱码久久久久久蜜坠欲下| 日韩精品无码一区二区三区| 欧美好骚综合网| 日本在线视频www色| 精品99视频| 久章草在线视频| 久久99蜜桃精品| 91精品又粗又猛又爽| 91在线看国产| 一二三四在线观看视频| 亚洲免费av在线| 免费在线不卡视频| 欧美视频一区在线观看| 亚洲美女福利视频| 亚洲丝袜一区在线| h片在线播放| 91成人在线播放| 亚洲日本免费电影| 国产专区一区二区三区| 欧美偷拍自拍| 国产美女作爱全过程免费视频| 亚洲影院免费| 中文字幕 日韩 欧美| 成人福利视频在线| 日韩精品久久久久久久的张开腿让| 亚洲黄色免费网站| 亚洲国产精品无码久久久| 91精品午夜视频| 欧美日韩伦理片| 欧美伦理91i| 亚洲伦理影院| 国产精品v欧美精品v日韩精品 | av不卡在线观看| 日韩欧美视频免费观看| 亚洲www啪成人一区二区麻豆| 免费无码国产精品| 精品少妇一区二区三区日产乱码| 免费一级在线观看播放网址| 欧美日韩不卡合集视频| 成人在线爆射| 国产一区二区三区黄| 97久久视频| 97av视频在线观看| 国产成人精品1024| 呻吟揉丰满对白91乃国产区| 午夜成人免费视频| jizz中国女人| 最近2019免费中文字幕视频三 | 欧美日韩视频在线第一区 | 最近2019免费中文字幕视频三 | 伊人久久综合| 手机版av在线| 久久久另类综合| 亚洲国产精品午夜在线观看| 欧美一区二区三区视频免费| 国产精品久久一区二区三区不卡| 午夜免费在线观看精品视频| 国产一区二区视频在线看 | 激情欧美日韩| 欧美熟妇另类久久久久久多毛| 国产精品嫩草99a| 亚洲欧美综合自拍| 亚洲精品二三区| 国产精品蜜臀| 成人欧美视频在线| 综合精品久久| 性欧美在线视频| 亚洲私人影院在线观看| 姑娘第5集在线观看免费好剧| 精品亚洲国产视频| 午夜伦理福利在线| 欧美精品一区二区三区四区五区| 国产一区二区三区成人欧美日韩在线观看| 亚洲天堂小视频| 亚洲美女精品一区| 国产黄色免费大片| 欧美巨乳美女视频| 亚洲性视频在线| 欧洲精品在线播放| 成人深夜在线观看| 九九九国产视频| 亚洲激情视频网站| 精品人人视频| 免费在线成人av| 久久久久免费| 日本理论中文字幕| 精品视频一区二区三区免费| 午夜老司机在线观看| 国产在线精品播放| 欧美.www| 人妻无码中文久久久久专区| 欧美性生交xxxxx久久久| 你懂的视频在线| 国产精品美女久久久久久免费| 日本不卡电影| 色综合五月婷婷| 亚洲1区2区3区4区| 亚洲欧美日韩动漫| 国产精品国产福利国产秒拍| 久久国产中文字幕| 中文字幕第六页| 性久久久久久久久| 波多野结衣在线影院| 国产精品自产拍在线观看| 在线国产一区| 这里只有精品在线观看视频 | 日韩理论片在线| 亚洲av综合色区无码一二三区| 亚洲18私人小影院| 精品视频日韩| 亚洲成人手机在线观看| 天天免费综合色| 91在线不卡| 高清不卡日本v二区在线| 男人的天堂成人在线| 欧日韩不卡视频| 欧美精品一区二区三区高清aⅴ | 日韩欧美国产骚| 免费黄网在线观看| 国产日韩三区| 人人爽香蕉精品| 久久亚洲精品大全| 一区二区三区黄色| 99re8这里有精品热视频8在线| 黄色a级片免费| 亚洲欧美激情小说另类| 污污网站在线免费观看| 成人亚洲欧美一区二区三区| 亚洲视频播放| 国产天堂av在线| 亚洲欧美日韩一区在线| 一区二区三区亚洲变态调教大结局 | 91精品麻豆日日躁夜夜躁| 女人高潮被爽到呻吟在线观看 | 免费黄网站在线| 免费在线观看91| 国产91综合一区在线观看|