精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

www.555国产精品免费| 国产在线视频在线| 奇米视频7777| 怡红院在线播放| 不卡视频在线观看| 国产精品高清免费在线观看| 9.1片黄在线观看| 亚洲精品观看| 91久久国产最好的精华液| 中文字幕免费在线不卡| 天天综合天天综合| 狠狠色丁香婷婷综合| 欧美亚洲视频在线观看| 亚洲一区电影在线观看| 最新国产一区| 亚洲高清一二三区| 亚洲va在线va天堂va偷拍| 国产高清自产拍av在线| 中文字幕精品三区| 国内一区二区在线视频观看| 91福利在线观看视频| 午夜影院日韩| 欧美高清自拍一区| 国产精品久久久免费看| 久久99精品久久久久久园产越南| 日韩午夜精品电影| 亚洲美女性囗交| 暖暖成人免费视频| 亚洲高清免费观看| 中文字幕一区二区三区四区五区六区| 国产在线一在线二| 久久影音资源网| 国产精品日本一区二区| 99热精品在线播放| 九色|91porny| 国产精品影片在线观看| 日本视频网站在线观看| 99精品热6080yy久久| 欧美成人午夜激情| 欧美国产日韩在线观看成人| 九九热这里有精品| 一本到不卡精品视频在线观看| 欧美又粗又长又爽做受| 18在线观看的| 亚洲欧美日韩国产综合在线| 亚洲永久激情精品| 免费av不卡| 国产精品久久久久毛片软件| 日日夜夜精品网站| 国产中文字幕在线播放| 国产亚洲精品免费| 色一情一乱一伦一区二区三区丨| 九色在线观看视频| 久久亚洲私人国产精品va媚药| 国产尤物99| 青青草原国产在线视频| 亚洲女人18毛片水真多| 国产一区二区调教| 91精品国产99久久久久久红楼| 国产精选久久久| 国产做a爰片久久毛片| 成人做爽爽免费视频| 国产精品久久久午夜夜伦鲁鲁| 久久激情五月婷婷| 国产在线精品一区免费香蕉| 又骚又黄的视频| 久久精品国产精品亚洲精品 | yellow视频在线观看一区二区| 99精品视频免费看| 国产.欧美.日韩| 韩日午夜在线资源一区二区| 天天操天天干天天| 久久视频一区二区| 亚洲精品一卡二卡三卡四卡| 欧美a免费在线| 一区二区三区视频在线观看| 可以看毛片的网址| 日本成人三级电影| 欧美日韩mp4| xxxxwww一片| 欧美成a人免费观看久久| 亚洲码在线观看| 日韩欧美黄色网址| 综合在线一区| 97av视频在线| 在线观看日批视频| 丁香桃色午夜亚洲一区二区三区| 久久99九九| 日本美女在线中文版| 亚洲免费观看高清| 黑人糟蹋人妻hd中文字幕| av激情成人网| 欧美va亚洲va| 卡一卡二卡三在线观看| 伊人青青综合网| 欧美亚洲国产日本| 97精品人妻一区二区三区香蕉| 成人午夜视频福利| 欧美性大战久久久久| 黄色av电影在线播放| 懂色aⅴ精品一区二区三区蜜月| 91av资源网| 国产精久久一区二区| 亚洲国产三级网| 中文字幕第20页| 精品1区2区3区4区| 国产精品人成电影在线观看| 免费观看国产精品| 中文字幕成人在线观看| 成人一区二区免费视频| 欧美一区二区三区婷婷| 亚洲激情国产精品| 天天鲁一鲁摸一摸爽一爽| 国产农村妇女精品一区二区| 亚洲va久久久噜噜噜| 精品无人乱码| 午夜视黄欧洲亚洲| 69久久精品无码一区二区| 国产一区二区三区91| 欧美俄罗斯乱妇| 国产一区二区视频免费观看| 久久丝袜美腿综合| 久久久久免费看黄a片app| 国产精品1区| 中文字幕精品国产| 国产www在线| k8久久久一区二区三区| 特大黑人娇小亚洲女mp4| 91综合国产| 亚洲欧洲一区二区三区久久| 日本少妇xxx| 波多野结衣在线播放一区| 98精品国产自产在线观看| 国产高清视频免费| 亚洲三级在线看| 超碰超碰在线观看| 欧美午夜精品一区二区三区电影| 欧美性一区二区三区| 亚洲精品久久久久久久久久久久久久| 国产精品二三区| 黄色手机在线视频| 欧美一级精品| 国产精品高潮呻吟久久av野狼 | 夜夜躁日日躁狠狠久久88av| 欧美国产成人精品一区二区三区| www.亚洲免费av| 男女啪啪免费视频网站| 精品福利一区| 午夜精品久久久久久久久久久久久 | 视频一区视频二区在线观看| 欧美精品与人动性物交免费看| 欧洲一区精品| 亚洲欧美日韩国产中文| 无码人妻一区二区三区免费 | 亚洲色图100p| 极品少妇xxxx精品少妇偷拍| 天天爱天天做天天操| 国产一区二区| 欧美激情视频免费观看| 日本激情一区二区| 欧美日韩国产精品专区| 亚洲成人日韩在线| 日韩中文字幕亚洲一区二区va在线 | 亚洲av无码专区在线| 亚洲国产精品天堂| 免费a级黄色片| 青青国产91久久久久久| 亚洲砖区区免费| 欧美日韩黄色| 777午夜精品福利在线观看| 欧美男男同志| 欧美日韩午夜在线视频| 欧美色图亚洲视频| 成人精品视频一区| 干日本少妇首页| 91日韩欧美| av免费观看久久| 手机在线理论片| 色婷婷成人综合| 精品国产av鲁一鲁一区| 天天影视涩香欲综合网| 蜜桃久久精品成人无码av| 精品一区二区三区香蕉蜜桃| 日韩成人手机在线| 国产成人ay| 成人有码视频在线播放| а√天堂资源官网在线资源| 亚洲人精品午夜在线观看| 国产一区二区自拍视频| 亚洲h在线观看| 色www亚洲国产阿娇yao| 岛国精品一区二区| 中文字幕一区二区三区四区在线视频 | 亚洲精品国精品久久99热| 欧美性猛交xxxx乱大交hd| 亚洲人成网站影音先锋播放| 最近中文字幕无免费| 久久精品99国产精品日本| 日韩欧美不卡在线| 日韩一区二区在线| 国产视频一区二区不卡| 91精品国产自产观看在线| 欧美一性一乱一交一视频| 国产在线高清视频| 亚洲欧美日韩国产中文| 国产日韩免费视频| 日本韩国精品在线| 日本免费在线播放| 国产在线精品一区二区夜色| 国产美女网站在线观看| 国产精品久久久久久久久妇女 | 日韩免费av| 久久久com| 亚洲乱码一区| 国产美女精品视频免费观看| 亚洲精品88| 久久久久免费精品国产| dy888亚洲精品一区二区三区| 亚洲欧美国产日韩天堂区| 免费观看成年人视频| 欧美一级搡bbbb搡bbbb| 中文字幕在线播放日韩| 欧美性xxxx在线播放| 国产稀缺真实呦乱在线| 一区二区三区在线视频免费 | 精品久久久久国产| 欧美日韩亚洲国产另类| 国产精品盗摄一区二区三区| 国产精品一二三区在线观看| 2020国产精品| 人妻少妇精品视频一区二区三区| 成人性视频免费网站| 无套内谢丰满少妇中文字幕| 卡一卡二国产精品 | 亚洲日本视频在线| 成人女保姆的销魂服务| 欧美天堂在线| 国产精品网址在线| 99只有精品| 国产精品久久久久久久久久免费 | 久久久综合香蕉尹人综合网| www国产精品| 国产91精品入口17c| 视频一区日韩精品| 91九色对白| 日韩激情欧美| 国产二区一区| 久久久久久久久久久久久久久久久久久久| 91丨九色丨国产| 中文字幕一区二区三区中文字幕 | 污污的视频网站在线观看| 精品久久久久久久久久久院品网| 亚洲第一色网站| 欧美不卡视频一区| 好吊色视频一区二区| 亚洲福利视频专区| 欧美成熟毛茸茸| 亚洲人成网站777色婷婷| 国产精品一级伦理| 色偷偷亚洲男人天堂| 成人区精品一区二区不卡| 欧美猛交免费看| 2018av在线| 日本免费一区二区三区视频观看| 2019年精品视频自拍| 91精品久久久久久久久青青 | 日韩影片中文字幕| 国产精品精品视频| 日本一区二区乱| 久久久福利视频| 日韩精品一区二区久久| 特色特色大片在线| 亚洲欧洲视频| 天天操天天爽天天射| 国产一区二区在线电影| 污片免费在线观看| 欧美国产一区二区在线观看| 91九色丨porny丨极品女神| 亚洲国产一区二区视频| 7799精品视频天天看| 91精品欧美一区二区三区综合在 | 日韩毛片中文字幕| av片在线看| 欧美激情影音先锋| 国产在线|日韩| 大波视频国产精品久久| 九九热线有精品视频99| 色撸撸在线观看| 久久不射中文字幕| 手机在线视频一区| 久久免费美女视频| 少妇被躁爽到高潮无码文| 疯狂蹂躏欧美一区二区精品| 91超薄丝袜肉丝一区二区| 日韩av一卡二卡| 九色porny丨首页在线| 国内伊人久久久久久网站视频 | 精品无人乱码一区二区三区 | 久久精品久久久| 视频一区视频二区视频| 欧美在线网站| 日本 片 成人 在线| www.激情成人| 国产乱国产乱老熟300| 在线看日韩精品电影| 懂色av成人一区二区三区| 最近2019中文字幕一页二页| 高清在线视频不卡| 亚洲最大av网站| 日韩片欧美片| 日韩免费毛片视频| 白白色 亚洲乱淫| 欧美日韩一级大片| 777xxx欧美| 国产香蕉在线| 欧美尤物巨大精品爽| av成人资源网| japanese在线播放| 久久国产精品区| 谁有免费的黄色网址| 精品久久久久久久久久久久久久| 国产人妖一区二区| 日韩中文字在线| 国产成人福利夜色影视| 日本中文不卡| 久久av最新网址| 一本色道综合久久欧美日韩精品 | 欧美视频xxxx| 亚洲女人天堂色在线7777| 都市激情国产精品| 国产91aaa| 黄色工厂这里只有精品| 欧美熟妇另类久久久久久多毛| 中文字幕亚洲欧美在线不卡| 中文在线字幕av| 在线观看国产精品91| 成人黄色视屏网站| 亚洲国产高清国产精品| 日韩精品一二三区| 日本少妇xxxxx| 欧美伊人久久大香线蕉综合69| 欧洲天堂在线观看| 日本道色综合久久影院| 亚洲精品**不卡在线播he| 国产免费毛卡片| 久久久国际精品| 国产精品xxxxxx| 色妞欧美日韩在线| 欧美成人福利| 日本美女爱爱视频| 国产成人精品免费一区二区| 久久国产露脸精品国产| 亚洲国产精品网站| 最新日韩精品| 天堂va久久久噜噜噜久久va| 另类人妖一区二区av| 婷婷国产成人精品视频| 555www色欧美视频| 污网站在线免费看| 国产在线视频欧美一区二区三区| 99热这里只有精品8| 美女久久久久久久久久| 欧美色图一区二区三区| 国产一二三区在线观看| 国产成人看片| 新67194成人永久网站| 国产又粗又黄又猛| 日韩无一区二区| 色戒汤唯在线观看| 日产中文字幕在线精品一区| 久久99久久久久久久久久久| 久草视频在线免费看| 日韩精品亚洲元码| 成人久久网站| 欧美乱做爰xxxⅹ久久久| 99精品视频在线观看免费| 久久久999久久久| 美女国内精品自产拍在线播放| 91成人在线精品视频| 国产精彩免费视频| 亚洲欧洲精品天堂一级| 日韩一区免费视频| 国产精品r级在线| 欧美黄色免费| 欧美狂猛xxxxx乱大交3| 欧美一区二区三区在线看| а√在线中文在线新版| 亚洲欧美丝袜| 成人精品免费网站| 中文字幕一区二区三区免费看| 精品视频9999| 波多野结衣在线观看一区二区| 日本女人性视频| 日本丰满少妇一区二区三区| 亚洲妇熟xxxx妇色黄| 日本免费一区二区三区| 国产成人精品免费网站| 一本一道精品欧美中文字幕| 韩剧1988在线观看免费完整版| 亚洲v在线看|