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

Linux高性能網絡編程十談 | 協程

系統 Linux
在講協程之前,先解決上一篇文章《Linux高性能網絡編程十談|多進程和多線程》留下的思考題。

在講協程之前,先解決上一篇文章《Linux高性能網絡編程十談|多進程和多線程》留下的思考題:

(1)如果在多線程程序中fork()子進程,會發生什么,我們要考慮那些問題?

  • 首先我們會想到如果一個有多個線程的程序fork出來的子進程是否也是多個線程呢?不是,fork出來的子進程只有一個執行線程,并不會把線程也復制過來;
  • 其次fork出來的子進程都會繼承父進程的部分數據,包括鎖,句柄等,也就是說在父進程被鎖的臨界區,在子進程也會被鎖,這樣可能導致在子進程邏輯中繼續加鎖,導致出現死鎖情況;
  • 最后使用pthread_atfork解決多線程下的fork問題,如下代碼注釋掉pthread_atfork這一行代碼,線程在父進程和子進程執行process函數中重復加鎖,導致死鎖,如果使用pthread_atfork,則正常:
#include <pthread.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void *process(void *arg) {
  printf("pid = %d begin ...\n", static_cast<int>(getpid()));
  pthread_mutex_lock(&mutex);
  struct timespec ts = {2, 0};
  nanosleep(&ts, NULL);
  pthread_mutex_unlock(&mutex);
  printf("pid = %d end ...\n", static_cast<int>(getpid()));
  return NULL;
}

void prepare(void) { pthread_mutex_unlock(&mutex); }

void parent(void) { pthread_mutex_lock(&mutex); }

int main(void) {
  // pthread_atfork(prepare, parent, NULL);
  printf("pid = %d Entering main ...\n", static_cast<int>(getpid()));
  pthread_t tid;
  pthread_create(&tid, NULL, process, NULL);
  struct timespec ts = {1, 0};
  nanosleep(&ts, NULL);
  pid_t pid = fork();
  if (fork() == 0) {
    process(NULL);
  } else {
    waitpid(pid, NULL, 0);
  }
  pthread_join(tid, NULL);
  printf("pid = %d Exiting main ...\n", static_cast<int>(getpid()));
  return 0;
}

int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void))在fork()之前調用,當調用fork時,內部創建子進程前在父進程中會調用prepare,內部創建子進程成功后,父進程會調用parent,子進程會調用child;

(2)在多線程程序中,某個線程掛了,整個進程會掛么?

  • 如果線程是非法訪問內存引起的崩潰,那么進程一定會崩潰,因為在進程中,各個線程的地址空間是共享的,某個線程破壞了某個地址段,其他線程也會受到到影響,這個時候操作系統與其保留其他線程,不如直接kill掉整個進程;
  • 如果某個線程內的行為導致默認動作是停止或終止,則不管是否對其他線程是否有影響,整個進程都會停止或終止;
  • 如果線程是因為自身退出(pthread_exit())或者各個線程捕獲信號可能不會掛掉整個進程,具體可以下面一個問題;

(3)如果需要將進程信號發送給某個線程,該如何處理?

  • 首先線程可獨立地屏蔽某些信號,使用系統函數pthread_sigmask(),所以線程通??梢怨蚕磉M程的信號,如果不需要則可以通過系統函數屏蔽;
  • 其次可調用pthread_kill(pthread_t thread, int signo),將信號發送給同一進程內指定的線程(包括自己);

第一部分:協程原理

如果您了解golang,協程應該不陌生,隨意用golang寫一個http server,性能都可能超過nginx,主要原因是內部使用輕量的協程,那下面我們就一起了解協程是什么?

協程就是 用戶態線程,協程的調度完全由開發者進行控制,因此實現協程的關鍵也就是 實現一個用戶態線程的調度器,由于協程是在用戶態中實現調度,避免了內核態的上下文切換造成的性能損失,從而突破了線程在IO上的性能瓶頸。

我們以ucontext庫為例子來說明協程是怎么運行的?(其他的協程實現方式類似)

#if defined(__APPLE__)
#define _XOPEN_SOURCE 600
#endif

#include <stdio.h>
#include <ucontext.h>

static ucontext_t ctx_main, ctx_coro;

void coroutine() {
  printf("Inside coroutine\n");
  swapcontext(&ctx_coro, &ctx_main); // 切換回主協程
  printf("Coroutine finished\n");
}

int main() {
  char coro_stack[8192];

  getcontext(&ctx_coro); // 獲取協程上下文
  ctx_coro.uc_stack.ss_sp = coro_stack;
  ctx_coro.uc_stack.ss_size = sizeof(coro_stack);
  ctx_coro.uc_link = &ctx_main; // 當協程結束時,切換回主協程
  makecontext(&ctx_coro, coroutine, 0); // 設置協程的入口點

  printf("Before coroutine\n");
  swapcontext(&ctx_main, &ctx_coro); // 切換到協程
  printf("Back in main\n");

  return 0;
}

以上代碼的輸出(mac上運行):

Before coroutine
Inside coroutine
Back in main

以上代碼的流程是:

(1)通過getcontext保留當前棧的運行上下文到ucontext_t中;

(2)通過makecontext修改ucontext_t指向coroutine入口函數;

(3)通過swapcontext切換協程;

看了如上代碼,如果之前對協程沒有了解的,還是比較懵,為什么getcontext能保留運行的上下文呢?我們先看一下內存中數據塊分布:

堆棧圖堆棧圖

一個函數執行會經過如下步驟:

(1)把參數加入棧中,如果有其他參數沒有入棧,那么使用某些寄存器傳遞;

(2)把當前指令的下一條指令地址壓入棧中;

(3)跳轉到函數體執行:

(4)把EBP壓入棧中,指向上一個函數堆棧幀中的幀指針的位置;

(5)保存調用前后需要保存不變的寄存器的值;

(6)將局部變量壓入棧中;

從上面代碼看出,當函數執行完需要恢復到上一次執行入口的寄存器地址,那getcontext只需要把當前恢復入口的地址存起來和加上必要棧信息是否就能實現保留協程棧,getcontext的確是這么做的:

movq        (%rsp), %rcx
movq        %rcx, oRIP(%rdi)
leaq        8(%rsp), %rcx         /* Exclude the return address.  */
movq        %rcx, oRSP(%rdi)

(%rsp)中保存的即是函數返回地址,也就是執行完getcontext這個函數之后需要執行的下一個指令的地址,通過context保存相關寄存器的值主要是rip值,同時把當前棧的rsp值也保存,這樣便可以通過這些數據恢復context以再次繼續執行。

同樣我們調用swapcontext取出context信息,通過恢復下一個需要執行的函數入口實現協程切換:

movq        (%rsp), %rcx
movq        %rcx, oRIP(%rdi)
leaq        8(%rsp), %rcx       /* Exclude the return address.  */
movq        %rcx, oRSP(%rdi)

當前rsp指向的地址中存儲的是返回地址,即調用swapcontext后當前協程需要執行的下一個指令地址,同時將swapcontext第二個參數的?;謴?,就進入下一個協程的入口函數。

第二部分:協程類型

目前開源有很多協程,根據運行時協程棧的分配方式分為有棧協程和無棧協程,根據調度過程中調度權的目標分為對稱協程和非對稱協程,下面我們來簡單了解一下:

1、有棧協程和無棧協程

(1)如果每個協程都有自己的調用棧,類似于線程的調用棧就是有棧協程,微信的libco、Golang中的 goroutine、Lua中的協程都是有棧協程。

實現方式上面應該已經了解了,在內存中給每個協程開辟一個棧內存,當協程掛起時會將它的運行時上下文(即棧空間)從系統棧中保存至其所分配的棧內存中,當協程恢復時會將其運行時上下文從棧內存中恢復至系統棧中;

采用有棧協程有優點也有缺點,優點是可以任意嵌套,只要保留了當前棧的信息,可以任意的切換到其他協程中,而缺點則是性能有一定的損失,在保留??臻g信息的拷入拷出都會影響性能,同時棧的擴大和縮小需要實現動態,這里會導致內存浪費;

(2)與有棧協程相反,無棧協程不會為各個協程開辟相應的調用棧。無棧協程通常是基于狀態機或閉包來實現,類似ES6、Dart中的await/async、Python的Generator、Kotlin中的協程、C++20中的cooroutine都是無棧協程;

使用無棧協程不需要修改調用棧,也無需額外的內存來保存調用棧,因此它的開銷會更小,同時無需要考慮棧需要動態擴大縮小的問題,但是相比于保存運行時上下文這種實現方式,無棧協程最大的問題它無法實現在任意函數調用層級的位置進行掛起,比如最簡單的無棧協程設計如下:

#include <stdio.h>

int function(void) {
  static int i, state = 0;
  switch (state) {
  case 0: /* start of function */
    for (i = 0; i < 10; i++) {
      state = 1; /* so we will come back to "case 1" */
      return i;
    case 1:; /* resume control straight after the return */
    }
  }
}

int main() {
  for (int i = 0; i < 10; i++) {
    fprintf(stdout, "%d\n", function());
  }
  return 0;
}

以上代碼通過label和goto實現了yield語義,從而實現調用function()獲得打印0~9,如果大家想詳細了解這里面的實現可以搜索Protothreads庫;

(3)有棧協程和無棧協程總結如下:

內存資源使用:無棧協程借助函數的棧幀來存儲一些寄存器狀態,可以調用遞歸函數,而有棧協程會要申請一個內存棧用來存儲寄存器信息,調用遞歸函數可能會爆棧;

速度:無棧協程的上下文比較少,所以能夠進行更快的用戶態上下文切換;

功能性:有棧協程能夠在嵌套的協程中進行掛起/恢復,而無棧協程只能對頂層的協程進行掛起,被調用方是不能掛起的;

2、對稱協程和非對稱協程

(1)對稱協程:任何一個協程都是相互獨立且平等的,調度權可以在任意協程之間轉移,例如go語言的協程就是對稱線程,其實現如下圖所示:

調度圖調度圖

CoroutineA,CoroutineB,CoroutineC之間是可以通過協程調度器可以切換到任意協程。

(2)非對稱協程:協程出讓調度權的目標只能是它的調用者,即協程之間存在調用和被調用關系,例如libco提供的協議就是非對稱協程,其實現如下圖所示:

調度圖調度圖

CoroutineA,CoroutineB,CoroutineC之間比如與調用者成對出現,比如resume的調用者返回的位置,必須是被調用者yield。

第三部分:如何使用協程實現高性能

以下是網絡IO與協程調度流程:

調度圖調度圖

(1)epoll,kqueue等IO事件觸發;

(2)調度協程循環等待,如果遇到IO事件,就創建協程開始處理;

(3)創建IO協程或者定時器協程;

(4)如果是定時器協程,就加入到定時協程隊列;

(5)如果是IO協程,就加入到IO協程隊列(每一個網絡連接綁定一個套接字句柄,該套接字綁定一個協程);

(6)觸發的IO喚醒調度器,調度器準備協程切換;

(7)從IO協程隊列中取出對應的協程進行處理;

(8)如果當前協程遇到IO阻塞,比如處理完recv數據,需要send數據或者往下游send數據,都是IO阻塞場景;

(9)當前協程阻塞后將自己掛起;

(10)切換到調度協程或者其他協程繼續調度(如果是對稱協程直接切到調度協程,如果是非對程協程調用yield);

(11)遇到IO關閉將當前協程切換到退出狀態(可以設置退出狀態);

(12)IO協程直接退出;

(13)9~12步驟中的IO觸發或者IO關閉以后,切換到下一個協程;

(14)如果調度協程執行完,然后查詢定時協程隊列,如果有超時的處理TODO;(15)執行完上述流程,繼續切換回調度協程,等待IO事件的觸發;

以上流程的偽代碼如下(詳細的代碼后續會在https://github.com/linkxzhou/sthread這里開源,目前在完善中):

void process(void *args) {
  ...
  /* co_read封裝監聽io事件協程切換`yield` */
  ... = co_read(...)
  ...
  /* co_send封裝監聽io事件協程切換`yield` */
  ... = co_send(...)
  ...
}

void co_eventloop() {
  ...
  for (;;) {
    /* 調度協程通過 epoll_wait撈出就緒事件 */
    int ret = co_epoll_wait(...);
    while (...) {
      /* 如果不存在對應句柄的協程則創建協程,具體process函數處理 */
      ...* co = get_co_by_fd(...);
      if (co == NULL) {
        co = co_create(...)
      }
      ...
      /* 主協程掛起當前協程,切換到對應子協程,處理到期事件和就緒事件結果 */
      co_resume(co)
    }
    ...
    /* 調度協程處理過期事件,主協程切換到定時處理協程 */
    process_alltimeout_list(...);
    ...
  }
}

如何實現高性能呢?

(1)首先通過IO復用結合協程,每個連接綁定一個協程,由于協程比較輕量,假設對于有棧協程占用空間8K左右,100w個連接也就是8G左右,所以對于內存開銷不大;

(2)其次協程調度是微秒或者納秒級,如果對于IO密集型應用,基本上上就是一個協程處理完以后,微秒或者納秒級內就能切換到下一個處理連接;

(3)最后對比多線程,協程減少了臨界區的處理,不需要互斥鎖,信號量等開銷較大的同步原語,所以可以更能輕松寫出高性能的server;

思考

繼續提幾個思考題(下一章會解答當前問題):

(1)多線程情況下如何處理協程?

(2)golang的協程調度方式是怎樣的?

責任編輯:華軒 來源: 周末程序猿
相關推薦

2024-03-18 13:43:20

Linux架構

2023-11-01 11:59:13

2023-11-01 10:38:46

Linux高性能網絡編程

2023-11-01 11:40:46

Linux高性能網絡編程工具

2023-11-01 10:58:31

系統調用高性能網絡編程Linux

2023-11-01 11:51:08

Linux性能優化

2023-11-01 11:07:05

Linux高性能網絡編程線程

2023-11-01 11:13:58

Linux信號處理定時器

2023-11-01 11:20:57

2023-11-01 10:43:31

Linux高性能網絡編程

2025-06-26 01:27:00

2025-01-26 00:00:15

PHP協程控制權

2024-10-18 10:27:50

PHP框架webma

2024-10-06 14:37:52

2024-08-06 08:22:18

2024-09-03 09:15:37

2024-10-16 11:03:30

Linux高性能編程

2020-11-06 18:51:17

LinuxTCP服務器

2023-11-24 11:15:21

協程編程

2022-03-21 14:13:22

Go語言編程
點贊
收藏

51CTO技術棧公眾號

国产一区二区三区四区五区传媒| 五月婷婷在线观看| 亚洲黄色一区| 亚洲女人被黑人巨大进入al| 精品久久久久久无码国产| 日韩一二三四| 久久99精品久久久久| 欧美美女操人视频| 成人影视免费观看| 国产精品久久久久久久久久齐齐| 国产精品久久久久久久久免费相片| 91超碰rencao97精品| 狠狠躁夜夜躁人人爽天天高潮| 精品久久久久久久| 精品国产网站在线观看| 亚洲性生活网站| 国产三级在线播放| 久久久精品人体av艺术| 国产日韩欧美黄色| 国产成人免费看| 区一区二视频| 日韩精品中文字幕有码专区| 91亚洲一区二区| 欧美精选视频一区二区| 一区二区免费视频| 午夜精品区一区二区三| 国产香蕉在线观看| 精品一区二区三区在线播放| 日本精品va在线观看| 永久免费看黄网站| 999久久久91| 亚洲片国产一区一级在线观看| 中文字幕一区二区三区四| 裤袜国产欧美精品一区| 香蕉乱码成人久久天堂爱免费| 一本久道久久综合| 国产尤物视频在线| 91麻豆国产自产在线观看| 91免费看蜜桃| 国产精品女人久久久| 日韩电影免费在线| 77777少妇光屁股久久一区| 欧美日韩成人免费观看| 图片小说视频色综合| 在线亚洲男人天堂| 午夜在线观看一区| 综合伊思人在钱三区| 亚洲经典中文字幕| 精品人妻伦一二三区久| 超碰在线一区| 精品乱码亚洲一区二区不卡| 91性高潮久久久久久久| 国产精品一区二区三区四区在线观看| 欧美午夜一区二区三区免费大片| 国产亚洲精品网站| 欧美日韩国产观看视频| 好吊成人免视频| 欧美日韩在线一| 中文在线аv在线| 欧美日韩加勒比精品一区| 无码 制服 丝袜 国产 另类| a级片免费在线观看| 亚洲综合一区二区| 青春草国产视频| 国产精品yjizz视频网| 亚洲国产精品欧美一二99| 青青青青在线视频| 97人人在线视频| 午夜亚洲福利老司机| 国产精品国产亚洲精品看不卡| av影院在线免费观看| 精品国产鲁一鲁一区二区张丽| 国产午夜大地久久| 樱花草涩涩www在线播放| 欧美性xxxx| 91热这里只有精品| 成人自拍视频| 精品国产凹凸成av人网站| 熟妇高潮精品一区二区三区| 亚洲va久久| 一区二区三区视频免费在线观看| 久久久免费看片| 亚洲中无吗在线| 久久久久久久久综合| 天堂在线免费观看视频| 日本欧美韩国一区三区| 92裸体在线视频网站| 欧美在线 | 亚洲| 91麻豆国产自产在线观看| 亚洲精品久久久久久一区二区| 免费黄色网址在线观看| 亚洲一二三四久久| 国产一区视频免费观看| 在线免费观看亚洲| 亚洲福利视频专区| 九一在线免费观看| 欧美日韩 国产精品| 欧美一级bbbbb性bbbb喷潮片| 中文在线免费观看| 成人性生交大片免费看中文| 日韩国产欧美一区| 日本网站在线免费观看视频| 亚洲成a人片在线观看中文| 91香蕉视频导航| 91欧美极品| 综合久久五月天| 好吊操这里只有精品| 久久精品72免费观看| 久久精品国产精品国产精品污| 日本在线免费看| 欧美性色xo影院| 99热一区二区| 日本一道高清一区二区三区| 久色乳综合思思在线视频| 国产高清中文字幕| 国产精品一区二区无线| 亚洲高清精品中出| 天堂中文在线播放| 欧美一级二级在线观看| 成年人在线免费看片| 亚洲激情成人| 成人精品福利视频| 国产一区二区三区不卡在线| 亚洲国产精品自拍| 99热这里只有精品2| 日韩夫妻性生活xx| 日本亚洲精品在线观看| 午夜精品小视频| 中文字幕一区二区在线播放| 免费在线观看毛片网站| 国产精品qvod| 欧美多人爱爱视频网站| 亚洲天堂自拍偷拍| 国产亚洲视频系列| 国产最新免费视频| 国内精品国产成人国产三级粉色| 久久天天躁狠狠躁老女人| 中文字幕日韩国产| 久久精品一区二区三区av| 成熟了的熟妇毛茸茸| 4438全国亚洲精品观看视频| 欧美成人精品影院| 国产精品一区二区人人爽| 国产精品免费网站在线观看| 亚洲欧美另类动漫| 教室别恋欧美无删减版| 日韩免费视频在线观看| 日韩资源在线| 色婷婷综合久色| 国产高清自拍视频| 亚洲男人影院| 蜜桃成人在线| 日韩精选视频| 中文字幕亚洲国产| 在线免费观看一级片| 国产精品午夜免费| 国产亚洲视频一区| 在线中文一区| 粉嫩av四季av绯色av第一区| 蜜桃传媒在线观看免费进入| 亚洲成年人在线播放| 九九九国产视频| av电影在线观看一区| 国产二区视频在线播放| 视频小说一区二区| 日本欧美在线视频| av女优在线| 欧美一区二区视频网站| 免费在线一级片| 成人黄色a**站在线观看| 国产96在线 | 亚洲| 亚洲精品无吗| 国产精品自拍网| 国产在线高清理伦片a| 精品少妇一区二区三区免费观看| 久久精品久久精品久久| 久久先锋影音av| 日本在线观看免费视频| 99re6这里只有精品| av成人在线电影| 成人免费看黄| 日韩亚洲精品视频| 粉嫩av一区二区夜夜嗨| 狠狠躁夜夜躁人人躁婷婷91| 欧美人与性囗牲恔配| 久久99精品一区二区三区 | 色婷婷综合视频| 在线观看日产精品| www.99re7| 2021中文字幕一区亚洲| 毛片毛片毛片毛| 在线国产精品一区| 视频一区免费观看| 999久久久久久久久6666| 2019中文字幕免费视频| 久久99精品久久久久久野外| 亚洲经典中文字幕| 国产免费黄色录像| 色婷婷亚洲精品| 青青草手机在线观看| 久久久久久久久伊人| 亚洲欧美一区二区三区不卡| 国产手机视频一区二区| 91免费网站视频| 偷拍自拍亚洲色图| 亚洲综合国产精品| 91精品店在线| 97在线视频免费观看| 中文日本在线观看| 亚洲国产日韩欧美在线99| 欧美成人一区二区视频| 五月婷婷激情综合| www欧美com| 国产日韩综合av| 无码国产69精品久久久久网站| 久久99久久久久| www.超碰com| 亚洲一区激情| 99久久免费观看| 欧美国产一级| 色播五月综合| 久久爱www成人| 动漫3d精品一区二区三区| 日韩久久99| 国产精品户外野外| 成人免费影院| 91国内在线视频| 黄页网站在线| 色综合男人天堂| 免费av不卡| 日韩视频免费大全中文字幕| 成人性爱视频在线观看| 亚洲美女在线看| 天天射,天天干| 精品国产99国产精品| 国产av无码专区亚洲a∨毛片| 欧美日韩另类国产亚洲欧美一级| 一级黄色在线视频| 色婷婷国产精品久久包臀| 国产在线欧美在线| 亚洲午夜私人影院| 麻豆changesxxx国产| 亚洲卡通欧美制服中文| 任你操精品视频| 综合在线观看色| 在线观看黄网址| 伊人性伊人情综合网| 国产精品丝袜一区二区| 亚洲男人的天堂在线观看| 手机在线免费看片| 一区二区视频在线| 免费一级片视频| 亚洲国产精品一区二区久久恐怖片 | 黄色片久久久久| 免费久久99精品国产自在现线| 成熟了的熟妇毛茸茸| 久久婷婷av| 国内自拍视频网| 久久99精品国产.久久久久| 99日在线视频| 国产精品1区2区3区| 欧美成人精品一区二区综合免费| 国产不卡高清在线观看视频| 91九色蝌蚪porny| 99久久99久久综合| 97伦伦午夜电影理伦片| 日本一二三不卡| 欧美丰满熟妇bbbbbb| 亚洲一区二区三区美女| 五月天婷婷久久| 欧美日韩一区二区三区高清| 国产精品亚洲欧美在线播放| 欧美成人video| 欧美孕妇性xxxⅹ精品hd| 一色桃子一区二区| 91国内在线| 777精品视频| 免费高清视频在线一区| 亚洲999一在线观看www| 韩国精品福利一区二区三区| 日本10禁啪啪无遮挡免费一区二区| 日韩精品久久| 国产一级大片免费看| 亚洲制服av| www午夜视频| gogo大胆日本视频一区| 91麻豆精品国产91久久综合| 亚洲免费av网站| 黄色免费av网站| 91精品欧美综合在线观看最新| 色综合视频在线| 爽爽爽爽爽爽爽成人免费观看| 成人区精品一区二区不卡| 69av成年福利视频| 成人自拍视频| 欧美日韩免费高清| 一精品久久久| 成年人免费大片| 成人一区二区视频| 美国黑人一级大黄| 激情成人中文字幕| 国产人妖一区二区| 亚洲欧美中文字幕| 精品精品导航| 国产中文日韩欧美| 岳的好大精品一区二区三区| 日韩国产小视频| 蜜臀久久99精品久久久画质超高清| 又黄又爽的网站| 亚洲欧美偷拍另类a∨色屁股| 蜜臀尤物一区二区三区直播| 欧美α欧美αv大片| 色哟哟免费在线观看| 7m第一福利500精品视频| 国产精品久久久久久久久久辛辛 | 一本加勒比波多野结衣| 自拍偷拍欧美精品| 啪啪小视频网站| 日韩成人在线视频网站| 18网站在线观看| 国产日产欧美精品| 国模精品一区| 黄色免费观看视频网站| 成人少妇影院yyyy| 欧美成人免费观看视频| 欧美日韩一区国产| 国产小视频在线观看| 8x海外华人永久免费日韩内陆视频| 一区二区三区高清在线观看| 超碰在线免费观看97| 老鸭窝一区二区久久精品| 9.1成人看片免费版| 五月综合激情日本mⅴ| 人妻妺妺窝人体色www聚色窝| 久久国产精品电影| 成人网av.com/| 一级二级三级欧美| 久久激情五月激情| av永久免费观看| 欧美综合亚洲图片综合区| 欧美午夜黄色| 日韩**中文字幕毛片| 香蕉国产成人午夜av影院| 黄色一级片播放| 91在线一区二区| 九九精品免费视频| 亚洲欧美激情精品一区二区| 欧美日韩123区| 欧日韩一区二区三区| 久久久久久自在自线| 波多野结衣av在线观看| 91福利区一区二区三区| 99精品老司机免费视频| 国产一区香蕉久久| 一级毛片免费高清中文字幕久久网| av在线免费观看不卡| 亚洲一区中文在线| 国模人体一区二区| 7777免费精品视频| 精品九九在线| 999久久久精品视频| 亚洲综合一区在线| 午夜视频在线免费播放| 2019亚洲日韩新视频| 精品国产一区二区三区| 国产美女18xxxx免费视频| 亚洲欧美日韩人成在线播放| 性生活免费网站| 91精品国产成人www| 国模精品一区| 91香蕉视频在线观看视频| 亚洲国产精品自拍| 欧美高清电影在线| 国产精品一区av| 欧美ab在线视频| 97人妻天天摸天天爽天天| 欧美系列一区二区| 色yeye免费人成网站在线观看| 国产精品伊人日日| 日韩精品一级二级| 久久高清内射无套| 日韩经典中文字幕| 男人天堂久久| 日韩精品在线观看av| 久久久精品免费网站| 99久久精品无免国产免费| 91av在线免费观看| 91综合在线| 中文字幕 日本| 欧美日韩久久不卡| cao在线视频| 综合视频在线观看| 99久久精品国产导航| 一级日韩一级欧美| 7777精品视频| 亚洲天堂免费| 久久精品视频18| 精品欧美一区二区三区精品久久| 色尼玛亚洲综合影院| 四虎4hu永久免费入口|