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

Linux內核中的RCU鎖:解鎖高效并發的奧秘

系統 Linux
我們使用 RCU 來保護鏈表的訪問。添加節點時,我們不需要獲取鎖來保護共享資源。刪除節點時,我們使用了 list_del_rcu 來刪除節點,并使用 call_rcu 函數來安排釋放內存的回調函數。

在 Linux 內核這片充滿挑戰與機遇的技術海洋中,高效的并發控制始終是開發者們不懈追求的目標。多處理器環境下,數據的一致性與并發訪問的安全性,猶如兩座巍峨的高山,橫亙在每一位內核開發者的前行道路上。傳統的鎖機制,如自旋鎖、互斥鎖和讀寫鎖等,雖各有其用武之地,但在面對復雜多變的應用場景時,往往會暴露出性能瓶頸或使用局限性。

它以獨特的設計理念和巧妙的工作機制,在眾多鎖機制中脫穎而出,尤其在處理讀多寫少的場景時,展現出了無與倫比的性能優勢。從文件系統到網絡協議棧,從進程管理到內核數據結構維護,RCU 鎖的身影無處不在,默默支撐著 Linux 內核高效穩定地運行。今天,讓我們深入探討一種別具一格且高效強大的鎖機制 ——RCU 鎖。

一、RCU鎖的概述

RCU,即 Read - Copy - Update,從字面上看,它的操作似乎僅包含讀取、復制和更新三個簡單步驟,但實際機制遠比這復雜。它專為讀多寫少的場景而設計,核心思想是允許讀操作無鎖并發執行,極大地提升讀操作的效率。對于寫操作,它則采用了一種獨特的策略:先復制數據,在副本上進行修改,待所有讀操作完成后,再將新副本替換舊數據。

在 RCU 機制中,讀取共享數據結構的操作是無鎖的,因此讀取操作可以并發進行,不會相互干擾。寫入共享數據結構的操作則使用了延遲刪除的策略,即寫入操作并不直接修改共享數據結構,而是將要刪除的數據結構標記為“已刪除”,并在之后的某個時間點(通常是在不會干擾讀取操作的時候)真正刪除這些數據結構。

RCU 機制的實現依賴于一些底層機制,比如內存屏障、原子操作等。在 Linux 內核中,RCU 機制被廣泛應用于多個子系統,比如進程管理、網絡協議棧等,以提高內核的并發性能。

在RCU的實現過程中,我們主要解決以下問題:

  • 在讀取過程中,另外一個線程刪除了一個節點。刪除線程可以把這個節點從鏈表中移除,但它不能直接銷毀這個節點,必須等到所有的讀取線程讀取完成以后,才進行銷毀操作。RCU中把這個過程稱為寬限期(Grace period)。
  • 在讀取過程中,另外一個線程插入了一個新節點,而讀線程讀到了這個節點,那么需要保證讀到的這個節點是完整的。這里涉及到了發布-訂閱機制(Publish-Subscribe Mechanism)。
  • 保證讀取鏈表的完整性。新增或者刪除一個節點,不至于導致遍歷一個鏈表從中間斷開。但是RCU并不保證一定能讀到新增的節點或者不讀到要被刪除的節點。

二、RCU鎖的工作原理

RCU(Read-Copy Update),顧名思義就是讀-拷貝修改,它是基于其原理命名的。對于被RCU保護的共享數據結構,讀者不需要獲得任何鎖就可以訪問它,但寫者在訪問它時首先拷貝一個副本,然后對副本進行修改,最后使用一個回調(callback)機制在適當的時機把指向原來數據的指針重新指向新的被修改的數據。這個時機就是所有引用該數據的CPU都退出對共享數據的操作。

因此RCU實際上是一種改進的rwlock,讀者幾乎沒有什么同步開銷,它不需要鎖,不使用原子指令,而且在除alpha的所有架構上也不需要內存柵(Memory Barrier),因此不會導致鎖競爭,內存延遲以及流水線停滯。不需要鎖也使得使用更容易,因為死鎖問題就不需要考慮了。寫者的同步開銷比較大,它需要延遲數據結構的釋放,復制被修改的數據結構,它也必須使用某種鎖機制同步并行的其它寫者的修改操作。讀者必須提供一個信號給寫者以便寫者能夠確定數據可以被安全地釋放或修改的時機。

有一個專門的垃圾收集器來探測讀者的信號,一旦所有的讀者都已經發送信號告知它們都不在使用被RCU保護的數據結構,垃圾收集器就調用回調函數完成最后的數據釋放或修改操作。 RCU與rwlock的不同之處是:它既允許多個讀者同時訪問被保護的數據,又允許多個讀者和多個寫者同時訪問被保護的數據(注意:是否可以有多個寫者并行訪問取決于寫者之間使用的同步機制),讀者沒有任何同步開銷,而寫者的同步開銷則取決于使用的寫者間同步機制。但RCU不能替代rwlock,因為如果寫比較多時,對讀者的性能提高不能彌補寫者導致的損失。

讀者在訪問被RCU保護的共享數據期間不能被阻塞,這是RCU機制得以實現的一個基本前提,也就說當讀者在引用被RCU保護的共享數據期間,讀者所在的CPU不能發生上下文切換,spinlock和rwlock都需要這樣的前提。寫者在訪問被RCU保護的共享數據時不需要和讀者競爭任何鎖,只有在有多于一個寫者的情況下需要獲得某種鎖以與其他寫者同步。

寫者修改數據前首先拷貝一個被修改元素的副本,然后在副本上進行修改,修改完畢后它向垃圾回收器注冊一個回調函數以便在適當的時機執行真正的修改操作。等待適當時機的這一時期稱為grace period,而CPU發生了上下文切換稱為經歷一個quiescent state,grace period就是所有CPU都經歷一次quiescent state所需要的等待的時間。垃圾收集器就是在grace period之后調用寫者注冊的回調函數來完成真正的數據修改或數據釋放操作的。

要想使用好RCU,就要知道RCU的實現原理。我們拿linux 2.6.21 kernel的實現開始分析,為什么選擇這個版本的實現呢?因為這個版本的實現相對較為單純,也比較簡單。當然之后內核做了不少改進,如搶占RCU、可睡眠RCU、分層RCU。但是基本思想都是類似的。所以先從簡單入手。

首先,我們提到的寫者在訪問它時首先拷貝一個副本,然后對副本進行修改,最后使用一個回調(callback)機制在適當的時機把指向原來數據的指針重新指向新的被修改的數據。而這個“適當的時機”就是所有CPU經歷了一次進程切換(也就是一個grace period)。

為什么這么設計?

因為RCU讀者的實現就是關搶占執行讀取,讀完了當然就可以進程切換了,也就等于是寫者可以操作臨界區了。

那么就自然可以想到,內核會設計兩個元素,來分別表示寫者被掛起的起始點,以及每cpu變量,來表示該cpu是否經過了一次進程切換(quies state)。

就是說,當寫者被掛起后要以下步驟:

  1. 重置每cpu變量,值為0。
  2. 當某個cpu經歷一次進程切換后,就將自己的變量設為1。
  3. 當所有的cpu變量都為1后,就可以喚醒寫者了。

下面我們來分別看linux里是如何完成這三步的:

我們從一個例子入手,這個例子來源于linux kernel文檔中的whatisRCU.txt。這個例子使用RCU的核心API來保護一個指向動態分配內存的全局指針。

struct foo {  
    int a;  
    char b;  
    long c;  
};  

DEFINE_SPINLOCK(foo_mutex);  

struct foo *gbl_foo;  

void foo_read (void)  
{  
    foo *fp = gbl_foo;  
    if ( fp != NULL )  
        dosomething(fp->a, fp->b , fp->c );  
}  

void foo_update( foo* new_fp )  
{  
    spin_lock(&foo_mutex);  
    foo *old_fp = gbl_foo;  
    gbl_foo = new_fp;  
    spin_unlock(&foo_mutex);  
    kfee(old_fp);  
}

如上代碼所示,RCU被用來保護全局指針struct foo *gbl_foo,foo_get_a()用來從RCU保護的結構中取得gbl_foo的值。而foo_update_a()用來更新被RCU保護的gbl_foo的值(更新其a成員)。首先,我們思考一下,為什么要在foo_update_a()中使用自旋鎖foo_mutex呢?假設中間沒有使用自旋鎖.那foo_update_a()的代碼如下:

void foo_read(void)
{
 rcu_read_lock();
 foo *fp = gbl_foo;
 if ( fp != NULL )
 dosomething(fp->a,fp->b,fp->c);
 rcu_read_unlock();
}

void foo_update( foo* new_fp )
{
 spin_lock(&foo_mutex);
 foo *old_fp = gbl_foo;
 gbl_foo = new_fp;
 spin_unlock(&foo_mutex);
 synchronize_rcu();
 kfee(old_fp);
}

假設A進程在上圖—-標識處被B進程搶點.B進程也執行了goo_ipdate_a().等B執行完后,再切換回A進程.此時,A進程所持的old_fd實際上已經被B進程給釋放掉了.此后A進程對old_fd的操作都是非法的。所以在此我們得到一個重要結論:RCU允許多個讀者同時訪問被保護的數據,也允許多個讀者在有寫者時訪問被保護的數據(但是注意:是否可以有多個寫者并行訪問取決于寫者之間使用的同步機制)。

說明:本文中說的進程不是用戶態的進程,而是內核的調用路徑,也可能是內核線程或軟中斷等。

三、RCU的核心機制

寬限期的確定是 RCU 鎖實現的難點與核心。為了準確判斷寬限期,RCU 機制有以下限制:

  • 禁止內核搶占:在使用 RCU 鎖前,必須禁止內核搶占。這意味著 CPU 不能隨意調度到其他線程,只能等待當前線程離開臨界區(不再引用舊數據)才能進行調度。
  • 臨界區內限制:在 RCU 鎖保護的臨界區中,不能使用可能觸發調度的函數。因為一旦發生調度,就意味著當前線程已經退出了臨界區,不再引用舊數據。

當所有 CPU 都至少發生過一次調度時,就可以確定沒有任何線程再引用舊數據,此時寬限期結束,寫者便可以安全地釋放舊數據。

四、RCU鎖的使用場景

(1)文件系統

在 Linux 文件系統中,RCU 鎖有著廣泛的應用。例如,當多個進程同時讀取文件系統的目錄結構時,讀操作可以并行進行,而當需要對目錄結構進行修改(如創建新文件、刪除文件等)時,寫操作會在確保所有讀操作完成后進行,保證了文件系統的一致性,同時提升了整體性能。

(2)網絡協議棧

在網絡協議棧中,對于一些只讀的網絡配置信息(如路由表),讀操作頻繁,而寫操作相對較少。使用 RCU 鎖可以讓多個網絡數據包處理線程快速讀取路由信息,而當網絡管理員需要修改路由配置時,寫操作會在合適的時機進行,避免了讀操作的阻塞。

(3)內核數據結構管理

Linux 內核在管理進程表、inode 表等數據結構時,也常常借助 RCU 鎖。以進程表為例,眾多線程可能頻繁讀取進程信息,而對進程表的修改(如進程創建、銷毀)相對較少。通過 RCU 鎖,讀操作可以高效進行,寫操作也能在不影響讀性能的前提下有序完成。

五、RCU鎖的優勢

(1)高性能讀操作

由于讀操作無需加鎖,在高并發讀的場景下,RCU 鎖能夠顯著提高系統的性能。相比傳統的鎖機制,讀操作的延遲大大降低,吞吐量顯著提升。

(2)減少鎖爭用

在多處理器環境下,鎖爭用是影響性能的重要因素。RCU 鎖減少了讀操作和寫操作之間的鎖爭用,使得系統能夠更好地利用多核處理器的性能。

(3)簡化代碼設計

對于讀多寫少的場景,使用 RCU 鎖可以簡化代碼的同步邏輯。讀端代碼無需復雜的鎖獲取和釋放操作,使代碼更加簡潔明了,易于維護。

六、在Linux內核中使用RCU鎖

在 Linux 內核中,使用 RCU 鎖需要遵循特定的 API:

讀端 API:

  • rcu_read_lock():用于進入RCU讀臨界區,本質上是禁止CPU搶占。
  • rcu_read_unlock():用于離開RCU讀臨界區,開啟CPU搶占。

寫端 API:

  • synchronize_rcu():等待寬限期結束,確保所有已開始的 RCU 讀操作完成。
  • call_rcu():用于延遲執行函數,通常用于釋放數據結構或對象,在寬限期結束后執行。
  • kfree_rcu():call_rcu()的特殊情況,專門用于釋放動態分配的內存。

RCU 示例:

#include <linux/module.h>
#include <linux/rcupdate.h>

struct my_node {
    int val;
    struct rcu_head rcu;
    struct list_head list;
};

LIST_HEAD(my_list);

/* 添加一個節點到鏈表中 */
void add_node(int val)
{
    struct my_node *new_node = kmalloc(sizeof(*new_node), GFP_KERNEL);
    if (!new_node) {
        printk(KERN_ERR "Failed to allocate memory for new node\n");
        return;
    }

    new_node->val = val;
    INIT_LIST_HEAD(&new_node->list);

    /* 加入鏈表 */
    list_add(&new_node->list, &my_list);
}

/* 刪除值為 val 的節點 */
void del_node(int val)
{
    struct my_node *node, *tmp;

    /* 遍歷鏈表并刪除匹配節點 */
    list_for_each_entry_safe(node, tmp, &my_list, list) {
        if (node->val == val) {
            list_del_rcu(&node->list);
            call_rcu(&node->rcu, kfree);
        }
    }
}

/* 遍歷整個鏈表,打印節點的值 */
void traverse_list(void)
{
    struct my_node *node;

    /* 進入 RCU 讀取臨界區 */
    rcu_read_lock();

    /* 遍歷鏈表并打印節點的值 */
    list_for_each_entry_rcu(node, &my_list, list) {
        printk(KERN_INFO "Node value: %d\n", node->val);
    }

    /* 離開 RCU 讀取臨界區 */
    rcu_read_unlock();
}

示例中,我們使用 RCU 來保護鏈表的訪問。添加節點時,我們不需要獲取鎖來保護共享資源。刪除節點時,我們使用了 list_del_rcu 來刪除節點,并使用 call_rcu 函數來安排釋放內存的回調函數。在遍歷鏈表時,我們使用了 rcu_read_lock 和 rcu_read_unlock 來進入和離開 RCU 讀取臨界區。

責任編輯:武曉燕 來源: 深度Linux
相關推薦

2025-03-31 00:01:12

2023-11-22 13:18:02

Linux調度

2024-02-02 18:29:54

C++線程編程

2025-09-15 01:45:00

2024-03-05 09:55:00

C++右值引用開發

2023-11-09 15:28:32

Spring開發

2024-07-12 15:27:58

2009-10-29 09:41:01

Linux內核DeviceMappe

2024-02-29 09:44:36

Java工具

2024-07-25 11:53:53

2023-09-26 11:34:56

Python

2024-01-22 09:00:00

編程C++代碼

2024-08-13 09:39:13

2023-11-03 08:32:53

Flask高并發

2009-09-28 10:09:09

Linux內核Linux循環鏈表

2023-05-15 08:58:41

塊設備驅動Linux

2011-01-14 13:50:37

2023-11-24 11:15:21

協程編程

2025-04-28 02:22:00

2017-09-04 15:15:48

Linux內核內存屏障
點贊
收藏

51CTO技術棧公眾號

亚洲二区自拍| 4438全国成人免费| 中文字幕人妻无码系列第三区| 日本精品在线| 国产xxx精品视频大全| 91av在线看| 91av手机在线| 免费萌白酱国产一区二区三区| 日本电影亚洲天堂一区| 日本三级中文字幕在线观看| 三级理论午夜在线观看| 久久se这里有精品| 91成人在线视频| 无码人妻精品中文字幕| 日韩成人av在线资源| 欧美精品免费视频| 又色又爽又高潮免费视频国产| а√天堂在线官网| 久久精品一区二区三区四区| 亚洲aaa激情| 亚洲 欧美 日韩 在线| 欧美性色综合| 播播国产欧美激情| 亚洲激情视频小说| 精品少妇一区| 日韩一区二区精品在线观看| 亚洲精品高清无码视频| 岛国av在线网站| 亚洲精品少妇30p| 亚洲精品国产系列| 韩国中文字幕2020精品| 成人在线一区二区三区| 亚洲一区精品电影| 夜夜狠狠擅视频| 日韩精品一级二级 | 成人免费图片免费观看| 依依成人综合视频| 黄色www在线观看| 香蕉视频在线免费看| 久久蜜桃av一区二区天堂| 国产精品免费看一区二区三区| 亚洲熟妇av乱码在线观看| 久久性色av| 日本免费久久高清视频| 亚洲另类欧美日韩| 中国女人久久久| 性欧美xxxx视频在线观看| 久久久精品国产sm调教网站| 欧美福利专区| 九九九久久久久久| 久久一二三四区| 亚洲天堂久久| 国产+人+亚洲| 久久精品国产亚洲AV无码男同| 亚洲一本二本| 欧美丰满少妇xxxxx| 亚洲国产精品久| 欧美黄色一级视频| 欧美精品日韩三级| 久久综合激情网| 影音先锋在线一区| 97超级碰碰人国产在线观看| 精品国产乱码一区二区| 免费日韩av片| 国产精品av在线播放| 波多野结衣高清在线| 奇米888四色在线精品| 国产在线观看精品一区二区三区| 国产又黄又爽视频| 国产宾馆实践打屁股91| 97操在线视频| 四虎影视2018在线播放alocalhost| 91婷婷韩国欧美一区二区| 麻豆亚洲一区| 午夜免费福利在线观看| 亚洲欧美在线aaa| 菠萝蜜视频在线观看入口| а√天堂8资源中文在线| 欧美日韩亚洲系列| 日韩av片网站| 亚洲**毛片| 日韩国产精品亚洲а∨天堂免| 91视频免费观看网站| 久久国产亚洲| 久久久亚洲网站| 无码人妻丰满熟妇精品区| 久久精品久久综合| 国产另类第一区| 成人在线免费公开观看视频| 亚洲欧美激情插| 成人综合视频在线| av一级久久| 亚洲精品美女在线| 成年人二级毛片| 国产日韩欧美三级| 国产在线观看一区二区三区| 黄色片一区二区| 亚洲国产精品ⅴa在线观看| 国产小视频免费| 国产精品成人国产| 亚洲高清一二三区| 又嫩又硬又黄又爽的视频| 国内精品久久久久久久影视蜜臀| 欧美一级免费视频| 国产黄色大片网站| 国产欧美日韩久久| 久久手机在线视频| 欧美日韩va| 国产丝袜一区二区三区免费视频| 成人做爰视频网站| 麻豆九一精品爱看视频在线观看免费| 亚洲va久久久噜噜噜久久天堂| 男人天堂资源在线| 亚洲成人午夜电影| 黄色aaaaaa| 日韩精品久久久久久久电影99爱| 性色av一区二区三区| 国产又粗又猛又黄又爽| 国产日韩精品一区二区三区| www精品久久| 精品国产一区二区三区性色av| 亚洲欧洲在线免费| 国产91av视频| 国产精品一级片在线观看| 日本三级中国三级99人妇网站| 丁香花高清在线观看完整版| 91精品一区二区三区久久久久久| 精品无码人妻一区二区免费蜜桃| 99热免费精品| 国产经典一区二区三区 | 久久久久久久999精品视频| 中文字幕视频在线播放| 国产婷婷一区二区| 丁香啪啪综合成人亚洲| 日韩高清影视在线观看| 97精品在线视频| 亚洲高清视频网站| 一区二区三区四区av| 一级网站在线观看| 天天做天天爱天天综合网| 国产精品美女av| 成人精品福利| 在线观看国产精品网站| 日韩精品电影一区二区| 久久综合激情| 青娱乐一区二区| 男人最爱成人网| 国产亚洲精品激情久久| 精人妻无码一区二区三区| 国产亚洲自拍一区| 超碰在线97免费| 久久一区二区三区电影| 91精品国产综合久久香蕉的用户体验 | 国产伦精品一区二区三区免费| 最新国产精品久久| 老司机亚洲精品一区二区| 欧美理论片在线观看| 亚洲精品无amm毛片| 亚洲午夜一二三区视频| 日本一卡二卡在线| 欧美亚洲网站| 亚洲激情啪啪| 免费看日产一区二区三区 | 亚洲三级一区| 色999韩欧美国产综合俺来也| www.欧美精品一二三区| 精品国产乱码久久久久久蜜臀网站| 亚洲精品久久久蜜桃| 星空大象在线观看免费播放| 国产精品婷婷| 婷婷五月色综合| 动漫一区二区三区| 992tv成人免费影院| 毛片网站在线| 欧美一区二区三区在线电影| 在线看成人av| 亚洲国产精品99久久久久久久久| 99国产精品久久久久久| 欧美午夜电影在线观看| 免费av一区二区三区| 精品乱码一区二区三区四区| 欧美裸体男粗大视频在线观看| 欧美 日韩 国产 成人 在线 91 | 国内精品久久久久影院优| 国产在线黄色| 日韩欧美综合一区| 国产精品21p| 1区2区3区欧美| 亚洲一区二区三区四区五区六区 | 欧美日韩一区二区免费在线观看| 久久成人激情视频| 国产精品一二三四区| 国产美女无遮挡网站| 午夜久久免费观看| 激情久久av| 成人污污视频| 国产成人精品免费视频| 日韩三级电影视频| 色先锋资源久久综合5566| 国精产品乱码一区一区三区四区| 欧美亚洲免费在线一区| 国产成人在线免费观看视频| 亚洲柠檬福利资源导航| 三上悠亚ssⅰn939无码播放| 国产精品夜夜嗨| 少妇一级淫免费放| 麻豆9191精品国产| 4444亚洲人成无码网在线观看| 成人羞羞网站入口| 精品日本一区二区三区| 成人免费91| 国产精品入口尤物| 大胆人体一区| 国内精品在线一区| av毛片在线免费| 在线视频精品一| 日韩精品视频在线观看一区二区三区| 91精品国产免费| 亚洲天堂视频在线| 色悠悠久久综合| 丰满少妇乱子伦精品看片| 亚洲精品视频观看| 一区二区三区影视| 国产精品久久久久久久午夜片| 大又大又粗又硬又爽少妇毛片 | 欧美日韩国产一区| 免费观看日批视频| 狠狠做深爱婷婷久久综合一区| 欧美另类视频在线观看| 亚洲视频小说图片| 一本在线免费视频| 欧美激情综合在线| 新91视频在线观看| 久久久精品黄色| 少妇光屁股影院| 久久综合久久综合九色| 国产精品无码在线| 9i在线看片成人免费| 特级特黄刘亦菲aaa级| 国产91丝袜在线18| 中文字幕 欧美 日韩| 国产成人午夜片在线观看高清观看| 日本在线播放一区二区| 久久丁香综合五月国产三级网站| 黄色国产小视频| 日本午夜一本久久久综合| 九九视频精品在线观看| 秋霞电影一区二区| 欧美精品一区二区三区免费播放| 久久五月激情| 韩国视频一区二区三区| 麻豆成人在线观看| 中文字幕亚洲影院| 国产高清视频一区| 美女伦理水蜜桃4| 99re这里只有精品6| 丰满大乳奶做爰ⅹxx视频| 久久久不卡影院| 少妇太紧太爽又黄又硬又爽小说| 中文字幕在线不卡一区二区三区| 91精品国产闺蜜国产在线闺蜜| 一区二区三区av电影| 日韩三级小视频| 色久综合一二码| 一级片免费网站| 精品久久久久久久人人人人传媒 | 国产日韩一区二区三免费高清| 成人字幕网zmw| 99ri日韩精品视频| 美女黄毛**国产精品啪啪| 精品免费av| 日韩精品第1页| 亚洲精品欧洲| 亚洲精品自拍网| 国产高清在线精品| 中文字幕在线免费看线人| 国产欧美视频一区二区| 国产大学生自拍| 欧美日韩另类在线| 一区二区自拍偷拍| 精品欧美一区二区在线观看| 欧美成人免费| 久久亚洲国产成人| 午夜不卡影院| 91天堂在线视频| 日韩av中文字幕一区| 亚洲成人午夜在线| 亚洲国产99| 九九热精品在线播放| 成人污视频在线观看| 成人精品999| 亚洲综合丝袜美腿| 中文 欧美 日韩| 亚洲黄色在线观看| 日本中文在线观看| 91国产视频在线| 成人av在线播放| 欧美午夜精品久久久久免费视| 亚洲国产一成人久久精品| 日韩免费毛片视频| 国产91精品一区二区| www.99热| 黄网动漫久久久| 国产福利资源在线| 在线精品视频视频中文字幕| 国产美女高潮在线| 91亚洲精品丁香在线观看| 精品一二三区| 青青青国产在线观看| 国产最新精品免费| 日韩女同一区二区三区| 午夜精品久久久久久不卡8050| 国产精品一区二区av白丝下载| 亚洲欧美www| 美女高潮视频在线看| 91久久精品国产| 成久久久网站| 超碰网在线观看| 99精品久久免费看蜜臀剧情介绍| 亚洲综合网在线| 欧美色综合网站| 久久久久久青草| 77777亚洲午夜久久多人| 亚洲三级av| 99亚洲国产精品| 国产真实乱对白精彩久久| 亚洲色图第四色| 欧美性20hd另类| 天天摸天天碰天天爽天天弄| 欧美激情精品久久久久久| 奇米一区二区| 欧美性受黑人性爽| 精品一区二区三区蜜桃| av黄色免费在线观看| 欧美日韩国产另类不卡| av基地在线| 国产欧美欧洲在线观看| 成人免费在线播放| 亚洲国产成人va在线观看麻豆| 国产欧美一区二区精品仙草咪| 国产又大又粗又爽| 亚洲天堂精品在线| 亚洲wwww| 日韩欧美99| 久久成人免费网站| 国产精品丝袜一区二区| 日韩午夜在线播放| 色呦呦在线播放| 国产二区一区| 中日韩视频在线观看| 右手影院亚洲欧美| 色乱码一区二区三区88| www.久久热.com| 成人福利网站在线观看| 欧美在线高清| 欧美熟妇精品一区二区蜜桃视频| 天天av天天翘天天综合网| 青春有你2免费观看完整版在线播放高清| 68精品国产免费久久久久久婷婷| 欧美日韩一本| 国产一级特黄a大片免费| 国产精品久久久久影院| 国产手机视频在线| 久久久视频在线| 国产在视频线精品视频www666| 亚洲色图久久久| 亚洲激情欧美激情| 亚洲人妻一区二区三区| 国产精品久久77777| 久久久久久久久久久久久久久久久久| 无码国产精品久久一区免费| 亚洲成人自拍网| jizzjizz在线观看| 亚洲一区二区三区在线视频| 99日韩精品| 亚洲ⅴ国产v天堂a无码二区| 欧美一区二区视频在线观看2020| 美女尤物在线视频| 日韩女优中文字幕| 国产精品99久久久| 伦av综合一区| 欧美成人精品在线| 婷婷亚洲成人| 四虎成人在线播放| 欧美性猛交xxxx乱大交| 日本中文字幕在线看| 国产乱人伦精品一区二区| 奇米色777欧美一区二区| 九九视频在线观看| 一区二区三区亚洲| 亚洲性视频在线| 北条麻妃视频在线| 亚洲一区在线观看视频| melody高清在线观看| 国产精选一区二区| 国产一区二区三区观看| 色一情一乱一伦| 欧美激情视频在线观看| 精品国产精品国产偷麻豆| 日本天堂在线播放|