久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

C和Java沒那么香了,Serverless時(shí)代Rust即將稱王?

瀏覽:108日期:2022-08-10 09:21:47
目錄高并發(fā)模式初探C語言的高并發(fā)案例Java的高并發(fā)實(shí)現(xiàn)Go的高并發(fā)實(shí)現(xiàn)Rust的高并發(fā)實(shí)現(xiàn)總結(jié)高并發(fā)模式初探

在這個(gè)高并發(fā)時(shí)代最重要的設(shè)計(jì)模式無疑是生產(chǎn)者、消費(fèi)者模式,比如著名的消息隊(duì)列kafka其實(shí)就是一個(gè)生產(chǎn)者消費(fèi)者模式的典型實(shí)現(xiàn)。其實(shí)生產(chǎn)者消費(fèi)者問題,也就是有限緩沖問題,可以用以下場(chǎng)景進(jìn)行簡(jiǎn)要描述,生產(chǎn)者生成一定量的產(chǎn)品放到庫(kù)房,并不斷重復(fù)此過程;與此同時(shí),消費(fèi)者也在緩沖區(qū)消耗這些數(shù)據(jù),但由于庫(kù)房大小有限,所以生產(chǎn)者和消費(fèi)者之間步調(diào)協(xié)調(diào),生產(chǎn)者不會(huì)在庫(kù)房滿的情況放入端口,消費(fèi)者也不會(huì)在庫(kù)房空時(shí)消耗數(shù)據(jù)。詳見下圖:

C和Java沒那么香了,Serverless時(shí)代Rust即將稱王?

而如果在生產(chǎn)者與消費(fèi)者之間完美協(xié)調(diào)并保持高效,這就是高并發(fā)要解決的本質(zhì)問題。

C語言的高并發(fā)案例

筆者在前文曾經(jīng)介紹過TDEngine的相關(guān)代碼,其中Sheduler模塊的相關(guān)調(diào)度算法就使用了生產(chǎn)、消費(fèi)者模式進(jìn)行消息傳遞功能的實(shí)現(xiàn),也就是有多個(gè)生產(chǎn)者(producer)生成并不斷向隊(duì)列中傳遞消息,也有多個(gè)消費(fèi)者(consumer)不斷從隊(duì)列中取消息。

后面我們也會(huì)說明類型功能在Go、Java等高級(jí)語言中類似的功能已經(jīng)被封裝好了,但是在C語言中你就必須要用好互斥體( mutex)和信號(hào)量(semaphore)并協(xié)調(diào)他們之間的關(guān)系。由于C語言的實(shí)現(xiàn)是最復(fù)雜的,先來看結(jié)構(gòu)體設(shè)計(jì)和他的注釋:

typedef struct { char label[16];//消息內(nèi)容 sem_t emptySem;//此信號(hào)量代表隊(duì)列的可寫狀態(tài) sem_t fullSem;//此信號(hào)量代表隊(duì)列的可讀狀態(tài) pthread_mutex_t queueMutex;//此互斥體為保證消息不會(huì)被誤修改,保證線程程安全 int fullSlot;//隊(duì)尾位置 int emptySlot;//隊(duì)頭位置 int queueSize;#隊(duì)列長(zhǎng)度 int numOfThreads;//同時(shí)操作的線程數(shù)量 pthread_t * qthread;//線程指針 SSchedMsg * queue;//隊(duì)列指針} SSchedQueue;

再來看Shceduler初始化函數(shù),這里需要特別說明的是,兩個(gè)信號(hào)量的創(chuàng)建,其中emptySem是隊(duì)列的可寫狀態(tài),初始化時(shí)其值為queueSize,即初始時(shí)隊(duì)列可寫,可接受消息長(zhǎng)度為隊(duì)列長(zhǎng)度,fullSem是隊(duì)列的可讀狀態(tài),初始化時(shí)其值為0,即初始時(shí)隊(duì)列不可讀。具體代碼及我的注釋如下:

void *taosInitScheduler(int queueSize, int numOfThreads, char *label) { pthread_attr_t attr; SSchedQueue * pSched = (SSchedQueue *)malloc(sizeof(SSchedQueue)); memset(pSched, 0, sizeof(SSchedQueue)); pSched->queueSize = queueSize; pSched->numOfThreads = numOfThreads; strcpy(pSched->label, label); if (pthread_mutex_init(&pSched->queueMutex, NULL) < 0) { pError('init %s:queueMutex failed, reason:%s', pSched->label, strerror(errno)); goto _error; } //emptySem是隊(duì)列的可寫狀態(tài),初始化時(shí)其值為queueSize,即初始時(shí)隊(duì)列可寫,可接受消息長(zhǎng)度為隊(duì)列長(zhǎng)度。 if (sem_init(&pSched->emptySem, 0, (unsigned int)pSched->queueSize) != 0) { pError('init %s:empty semaphore failed, reason:%s', pSched->label, strerror(errno)); goto _error; } //fullSem是隊(duì)列的可讀狀態(tài),初始化時(shí)其值為0,即初始時(shí)隊(duì)列不可讀 if (sem_init(&pSched->fullSem, 0, 0) != 0) { pError('init %s:full semaphore failed, reason:%s', pSched->label, strerror(errno)); goto _error; } if ((pSched->queue = (SSchedMsg *)malloc((size_t)pSched->queueSize * sizeof(SSchedMsg))) == NULL) { pError('%s: no enough memory for queue, reason:%s', pSched->label, strerror(errno)); goto _error; } memset(pSched->queue, 0, (size_t)pSched->queueSize * sizeof(SSchedMsg)); pSched->fullSlot = 0;//實(shí)始化時(shí)隊(duì)列為空,故隊(duì)頭和隊(duì)尾的位置都是0 pSched->emptySlot = 0;//實(shí)始化時(shí)隊(duì)列為空,故隊(duì)頭和隊(duì)尾的位置都是0 pSched->qthread = malloc(sizeof(pthread_t) * (size_t)pSched->numOfThreads); pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); for (int i = 0; i < pSched->numOfThreads; ++i) { if (pthread_create(pSched->qthread + i, &attr, taosProcessSchedQueue, (void *)pSched) != 0) { pError('%s: failed to create rpc thread, reason:%s', pSched->label, strerror(errno)); goto _error; } } pTrace('%s scheduler is initialized, numOfThreads:%d', pSched->label, pSched->numOfThreads); return (void *)pSched;_error: taosCleanUpScheduler(pSched); return NULL;}

再來看讀消息的taosProcessSchedQueue函數(shù)這其實(shí)是消費(fèi)者一方的實(shí)現(xiàn),這個(gè)函數(shù)的主要邏輯是

1.使用無限循環(huán),只要隊(duì)列可讀即sem_wait(&pSched->fullSem)不再阻塞就繼續(xù)向下處理

2.在操作msg前,加入互斥體防止msg被誤用。

3.讀操作完畢后修改fullSlot的值,注意這為避免fullSlot溢出,需要對(duì)于queueSize取余。同時(shí)退出互斥體。

4.對(duì)emptySem進(jìn)行post操作,即把emptySem的值加1,如emptySem原值為5,讀取一個(gè)消息后,emptySem的值為6,即可寫狀態(tài),且能接受的消息數(shù)量為6

具體代碼及注釋如下:

void *taosProcessSchedQueue(void *param) { SSchedMsg msg; SSchedQueue *pSched = (SSchedQueue *)param; //注意這里是個(gè)無限循環(huán),只要隊(duì)列可讀即sem_wait(&pSched->fullSem)不再阻塞就繼續(xù)處理 while (1) { if (sem_wait(&pSched->fullSem) != 0) { pError('wait %s fullSem failed, errno:%d, reason:%s', pSched->label, errno, strerror(errno)); if (errno == EINTR) {/* sem_wait is interrupted by interrupt, ignore and continue */continue; } } //加入互斥體防止msg被誤用。 if (pthread_mutex_lock(&pSched->queueMutex) != 0) pError('lock %s queueMutex failed, reason:%s', pSched->label, strerror(errno)); msg = pSched->queue[pSched->fullSlot]; memset(pSched->queue + pSched->fullSlot, 0, sizeof(SSchedMsg)); //讀取完畢修改fullSlot的值,注意這為避免fullSlot溢出,需要對(duì)于queueSize取余。 pSched->fullSlot = (pSched->fullSlot + 1) % pSched->queueSize; //讀取完畢修改退出互斥體 if (pthread_mutex_unlock(&pSched->queueMutex) != 0) pError('unlock %s queueMutex failed, reason:%sn', pSched->label, strerror(errno)); //讀取完畢對(duì)emptySem進(jìn)行post操作,即把emptySem的值加1,如emptySem原值為5,讀取一個(gè)消息后,emptySem的值為6,即可寫狀態(tài),且能接受的消息數(shù)量為6 if (sem_post(&pSched->emptySem) != 0) pError('post %s emptySem failed, reason:%sn', pSched->label, strerror(errno)); if (msg.fp) (*(msg.fp))(&msg); else if (msg.tfp) (*(msg.tfp))(msg.ahandle, msg.thandle); }}

最后寫消息的taosScheduleTask函數(shù)也就是生產(chǎn)的實(shí)現(xiàn),其基本邏輯是

1.寫隊(duì)列前先對(duì)emptySem進(jìn)行減1操作,如emptySem原值為1,那么減1后為0,也就是隊(duì)列已滿,必須在讀取消息后,即emptySem進(jìn)行post操作后,隊(duì)列才能進(jìn)行可寫狀態(tài)。

2.加入互斥體防止msg被誤操作,寫入完成后退出互斥體

3.寫隊(duì)列完成后對(duì)fullSem進(jìn)行加1操作,如fullSem原值為0,那么加1后為1,也就是隊(duì)列可讀,咱們上面介紹的讀取taosProcessSchedQueue中sem_wait(&pSched->fullSem)不再阻塞就繼續(xù)向下。

int taosScheduleTask(void *qhandle, SSchedMsg *pMsg) { SSchedQueue *pSched = (SSchedQueue *)qhandle; if (pSched == NULL) { pError('sched is not ready, msg:%p is dropped', pMsg); return 0; } //在寫隊(duì)列前先對(duì)emptySem進(jìn)行減1操作,如emptySem原值為1,那么減1后為0,也就是隊(duì)列已滿,必須在讀取消息后,即emptySem進(jìn)行post操作后,隊(duì)列才能進(jìn)行可寫狀態(tài)。 if (sem_wait(&pSched->emptySem) != 0) pError('wait %s emptySem failed, reason:%s', pSched->label, strerror(errno));//加入互斥體防止msg被誤操作 if (pthread_mutex_lock(&pSched->queueMutex) != 0) pError('lock %s queueMutex failed, reason:%s', pSched->label, strerror(errno)); pSched->queue[pSched->emptySlot] = *pMsg; pSched->emptySlot = (pSched->emptySlot + 1) % pSched->queueSize; if (pthread_mutex_unlock(&pSched->queueMutex) != 0) pError('unlock %s queueMutex failed, reason:%s', pSched->label, strerror(errno)); //在寫隊(duì)列前先對(duì)fullSem進(jìn)行加1操作,如fullSem原值為0,那么加1后為1,也就是隊(duì)列可讀,咱們上面介紹的讀取函數(shù)可以進(jìn)行處理。 if (sem_post(&pSched->fullSem) != 0) pError('post %s fullSem failed, reason:%s', pSched->label, strerror(errno)); return 0;}Java的高并發(fā)實(shí)現(xiàn)

從并發(fā)模型來看,Go和Rust都有channel這個(gè)概念,也都是通過Channel來實(shí)現(xiàn)線(協(xié))程間的同步,由于channel帶有讀寫狀態(tài)且保證數(shù)據(jù)順序,而且channel的封裝程度和效率明顯可以做的更高,因此Go和Rust官方都會(huì)建議使用channel(通信)來共享內(nèi)存,而不是使用共享內(nèi)存來通信。

為了讓幫助大家找到區(qū)別,我們先以Java為例來,看一下沒有channel的高級(jí)語言Java,生產(chǎn)者消費(fèi)者該如何實(shí)現(xiàn),代碼及注釋如下:

public class Storage { // 倉(cāng)庫(kù)最大存儲(chǔ)量 private final int MAX_SIZE = 10; // 倉(cāng)庫(kù)存儲(chǔ)的載體 private LinkedList<Object> list = new LinkedList<Object>(); // 鎖 private final Lock lock = new ReentrantLock(); // 倉(cāng)庫(kù)滿的信號(hào)量 private final Condition full = lock.newCondition(); // 倉(cāng)庫(kù)空的信號(hào)量 private final Condition empty = lock.newCondition(); public void produce() {// 獲得鎖lock.lock();while (list.size() + 1 > MAX_SIZE) { System.out.println('【生產(chǎn)者' + Thread.currentThread().getName() + '】倉(cāng)庫(kù)已滿'); try {full.await(); } catch (InterruptedException e) {e.printStackTrace(); }}list.add(new Object());System.out.println('【生產(chǎn)者' + Thread.currentThread().getName() + '】生產(chǎn)一個(gè)產(chǎn)品,現(xiàn)庫(kù)存' + list.size()); empty.signalAll();lock.unlock(); } public void consume() {// 獲得鎖lock.lock();while (list.size() == 0) { System.out.println('【消費(fèi)者' + Thread.currentThread().getName() + '】倉(cāng)庫(kù)為空'); try {empty.await(); } catch (InterruptedException e) {e.printStackTrace(); }}list.remove();System.out.println('【消費(fèi)者' + Thread.currentThread().getName() + '】消費(fèi)一個(gè)產(chǎn)品,現(xiàn)庫(kù)存' + list.size()); full.signalAll();lock.unlock(); }}

在Java、C#這種面向?qū)ο螅菦]有channel語言中,生產(chǎn)者、消費(fèi)者模式至少要借助一個(gè)lock和兩個(gè)信號(hào)量共同完成。其中鎖的作用是保證同是時(shí)間,倉(cāng)庫(kù)中只有一個(gè)用戶進(jìn)行數(shù)據(jù)的修改,而還需要表示倉(cāng)庫(kù)滿的信號(hào)量,一旦達(dá)到倉(cāng)庫(kù)滿的情況則將此信號(hào)量置為阻塞狀態(tài),從而阻止其它生產(chǎn)者再向倉(cāng)庫(kù)運(yùn)商品了,反之倉(cāng)庫(kù)空的信號(hào)量也是一樣,一旦倉(cāng)庫(kù)空了,也要阻其它消費(fèi)者再前來消費(fèi)了。

Go的高并發(fā)實(shí)現(xiàn)

我們剛剛也介紹過了Go語言中官方推薦使用channel來實(shí)現(xiàn)協(xié)程間通信,所以不需要再添加lock和信號(hào)量就能實(shí)現(xiàn)模式了,以下代碼中我們通過子goroutine完成了生產(chǎn)者的功能,在在另一個(gè)子goroutine中實(shí)現(xiàn)了消費(fèi)者的功能,注意要阻塞主goroutine以確保子goroutine能夠執(zhí)行,從而輕而易舉的就這完成了生產(chǎn)者消費(fèi)者模式。下面我們就通過具體實(shí)踐中來看一下生產(chǎn)者消費(fèi)者模型的實(shí)現(xiàn)。

package mainimport ('fmt''time')func Product(ch chan<- int) { //生產(chǎn)者for i := 0; i < 3; i++ {fmt.Println('Product produceed', i)ch <- i //由于channel是goroutine安全的,所以此處沒有必要必須加鎖或者加lock操作.}}func Consumer(ch <-chan int) {for i := 0; i < 3; i++ {j := <-ch //由于channel是goroutine安全的,所以此處沒有必要必須加鎖或者加lock操作.fmt.Println('Consmuer consumed ', j)}}func main() {ch := make(chan int)go Product(ch)//注意生產(chǎn)者與消費(fèi)者放在不同goroutine中g(shù)o Consumer(ch)//注意生產(chǎn)者與消費(fèi)者放在不同goroutine中time.Sleep(time.Second * 1)//防止主goroutine退出/*運(yùn)行結(jié)果并不確定,可能為Product produceed 0Product produceed 1Consmuer consumed 0Consmuer consumed 1Product produceed 2Consmuer consumed 2*/}

可以看到和Java比起來使用GO來實(shí)現(xiàn)并發(fā)式的生產(chǎn)者消費(fèi)者模式的確是更為清爽了。

Rust的高并發(fā)實(shí)現(xiàn)

不得不說Rust的難度實(shí)在太高了,雖然筆者之前在匯編、C、Java等方面的經(jīng)驗(yàn)可以幫助我快速掌握Go語言。但是假期看了兩天Rust真想大呼告辭,這尼瑪也太勸退了。在Rust官方提供的功能中,其實(shí)并不包括多生產(chǎn)者、多消費(fèi)者的channel,std:sync空間下只有一個(gè)多生產(chǎn)者單消費(fèi)者(mpsc)的channel。其樣例實(shí)現(xiàn)如下:

use std::sync::mpsc;use std::thread;use std::time::Duration;fn main() { let (tx, rx) = mpsc::channel(); let tx1 = mpsc::Sender::clone(&tx); let tx2 = mpsc::Sender::clone(&tx); thread::spawn(move || {let vals = vec![ String::from('1'), String::from('3'), String::from('5'), String::from('7'),];for val in vals { tx1.send(val).unwrap(); thread::sleep(Duration::from_secs(1));} }); thread::spawn(move || {let vals = vec![ String::from('11'), String::from('13'), String::from('15'), String::from('17'),];for val in vals { tx.send(val).unwrap(); thread::sleep(Duration::from_secs(1));} }); thread::spawn(move || {let vals = vec![ String::from('21'), String::from('23'), String::from('25'), String::from('27'),];for val in vals { tx2.send(val).unwrap(); thread::sleep(Duration::from_secs(1));} }); for rec in rx {println!('Got: {}', rec); }}

可以看到在Rust下實(shí)現(xiàn)生產(chǎn)者消費(fèi)者是不難的,但是生產(chǎn)者可以clone多個(gè),不過消費(fèi)者卻只能有一個(gè),究其原因是因?yàn)镽ust下沒有GC也就是垃圾回收功能,而想保證安全Rust就必須要對(duì)于變更使用權(quán)限進(jìn)行嚴(yán)格管理。在Rust下使用move關(guān)鍵字進(jìn)行變更的所有權(quán)轉(zhuǎn)移,但是按照Rust對(duì)于變更生產(chǎn)周期的管理規(guī)定,線程間權(quán)限轉(zhuǎn)移的所有權(quán)接收者在同一時(shí)間只能有一個(gè),這也是Rust官方只提供MPSC的原因,

use std::thread;fn main() { let s = 'hello'; let handle = thread::spawn(move || {println!('{}', s); }); handle.join().unwrap();}

當(dāng)然Rust下有一個(gè)API比較貼心就是join,他可以所有子線程都執(zhí)行結(jié)束再退出主線程,這比Go中要手工阻塞還是要有一定的提高。而如果你想用多生產(chǎn)者、多消費(fèi)者的功能,就要入手crossbeam模塊了,這個(gè)模塊掌握起來難度也真的不低。

總結(jié)

通過上面的比較我們可以用一張表格來說明幾種主流語言的情況對(duì)比:

語言 安全性 運(yùn)行速度 進(jìn)程啟動(dòng)速度 學(xué)習(xí)難度 C 低 極快 極快 困難 Java 高 一般 一般 一般 Go 高 較快 較快 一般 Rust 高 極快(基本比肩C) 極快(基本比肩C) 極困難

可以看到Rust以其高安全性、基本比肩C的運(yùn)行及啟動(dòng)速度必將在Serverless的時(shí)代獨(dú)占鰲頭,Go基本也能緊隨其后,而C語言程序中難以避免的野指針,Java相對(duì)較低的運(yùn)行及啟動(dòng)速度,可能都不太適用于函數(shù)式運(yùn)算的場(chǎng)景,Java在企業(yè)級(jí)開發(fā)的時(shí)代打敗各種C#之類的對(duì)手,但是在云時(shí)代好像還真沒有之前統(tǒng)治力那么強(qiáng)了,真可謂是打敗你的往往不是你的對(duì)手,而是其它空間的降維打擊。

這篇文章的內(nèi)容就到這了,希望能給你帶來幫助,也希望您可以多多關(guān)注好吧啦網(wǎng)的更多內(nèi)容!

標(biāo)簽: Java
主站蜘蛛池模板: 日韩成人免费 | 久久三级视频 | 日韩综合 | 久草新视频在线观看 | 午夜久久久久 | 久久久久高清 | 欧美第一页 | 国产成人午夜高潮毛片 | aaaa大片 | 91精品视频在线 | 精品一区二区在线观看 | 国内精品视频一区国产 | 中文字幕亚洲综合 | 91香蕉视频在线观看 | 五月激情综合网 | 精品自拍视频 | 国产精品久久久久久久 | 久久精品不卡 | 欧美日韩免费一区二区三区 | 性处破╳╳╳高清欧美 | 久久久久久久久久久久91 | 亚洲欧美日韩系列 | 激情欧美一区二区三区 | 日本不卡一二三 | 国产精品一区二区在线 | 精品2区 | www.一区二区 | 亚洲啊v在线 | 中文字幕第18页 | 久久久久久久99 | 欧美日韩一级视频 | 色鲁97精品国产亚洲 | 亚洲精品乱码久久久久久蜜桃图片 | 亚洲国产中文字幕 | 国产精品久久久久久久久久99 | 久久99精品久久久 | 日韩高清av | 亚洲一区二区三区四区五区中文 | www.9191| 久久成人精品 | 91在线视频观看 | 成人免费xxx在线观看 | 国产一区二区三区免费 | 亚洲国产精品99久久久久久久久 | 一区二区久久 | 欧美精品自拍 | 老师的朋友2 | 久久夜色精品国产 | 国产一区二区亚洲 | 欧美激情一区二区 | 国产日韩高清在线 | 四虎影院在线免费播放 | av女人的天堂 | 国产精品久久久久久久久久久新郎 | 国产成人精品久久二区二区91 | 免费在线看a | 视频一区在线播放 | 日本阿v视频高清在线中文 中文二区 | 欧美一级免费 | 一区在线视频 | 狠狠天天 | 成年无码av片在线 | 久久精品综合 | 亚洲 欧美日韩 国产 中文 | 影音先锋在线看片资源 | 在线视频自拍 | 精品成人佐山爱一区二区 | 一区二区中文 | 日韩成年人视频 | 国产精国产精品 | 午夜小视频在线观看 | 久久精品亚洲一区二区 | 欧美伊人影院 | 日韩城人网站 | 538在线精品 | av一二三区 | 久久精品视 | www.av欧美 | 81精品国产乱码久久久久久 | 国产成人精品一区二区三区四区 | 国产在线看片 | 国产伦精品一区二区三区在线 | 91视频国产网站 | 精品一区二区av | 91资源在线观看 | 国产欧美网址 | 国产激情在线视频 | 久久精品无码一区二区日韩av | 美女久久久久 | 嫩草影院懂你的 | 国产小视频在线播放 | 美女超碰| 色婷婷亚洲一区二区三区 | 亚洲免费在线视频 | 欧美久久成人 | 在线观看亚洲视频 | 日韩视频一区二区三区 | 中文字幕在线三区 | 山岸逢花在线观看 | 日韩有码在线播放 | 久久精品国产视频 | 国产在线一区二区三区 | www.久久精品视频 | 久久久夜夜夜 | 亚洲精品久久久久久久久久久 | 午夜日韩| 禁果av一区二区三区 | а天堂中文最新一区二区三区 | 免费看毛片网 | 99精品久久 | 久久天堂电影 | 精品一区二区三区蜜桃 | 久久精品系列 | 在线免费毛片 | 91亚洲国产亚洲国产 | 伊人天天操| 成全视频免费观看在线看黑人 | 日韩精品一区二区三区中文在线 | 欧美日韩亚洲国产 | 三级成人片| 亚洲一区观看 | 久久久性色精品国产免费观看 | 中文字幕网在线 | 亚州中文 | 欧美激情在线播放 | 自拍偷拍专区 | 人人操日日干 | 黄色午夜| 亚洲精品一区二三区不卡 | 久久伊| 日韩精品三区 | 狠狠综合久久av一区二区老牛 | 男人的天堂视频网站 | 亚洲久久| 欧美2区| 欧美男人天堂 | 日韩中文字幕视频 | 中文字幕 在线观看 | 一级片观看 | 精品久久久久久久久久 | 啪啪tv网站免费入口 | 性色视频免费观看 | 色综合中文| 日本毛片视频 | 一区二区三区回区在观看免费视频 | 乳色吐息在线观看 | 激情小说综合网 | 日韩www视频 | 国产特黄一级 | 色综合99 | 日本一区二区三区中文字幕 | www.视频在线观看 | 午夜免费网 | 亚洲第一页中文字幕 | 一级毛片免费完整视频 | 国产精品久久久久久久久免费桃花 | 亚洲一区二区在线 | 亚洲 中文 欧美 日韩 在线观看 | 99精品全国免费观看视频软件 | 在线看91| 精品欧美一区二区三区久久久 | 中文字幕不卡在线 | www.操.com | 亚洲精品乱码久久久久久久 | 久久精品视频一区 | 999精品嫩草久久久久久99 | 国产成人av电影 | 亚洲欧美视频 | 干干干操操操 | 午夜精品久久久久久久久 | 亚洲综合色自拍一区 | 国产另类ts人妖一区二区 | 欧美日韩中文字幕 | 午夜精品久久久久久久男人的天堂 | 成人午夜在线 | 91亚洲免费 | 亚洲三区在线观看 | 亚洲免费视频大全 | 亚洲四区 | 国产一区二区在线看 | 伊人色综合久久天天五月婷 | 国产成人综合在线观看 | 亚洲精品亚洲人成人网 | 午夜影院在线观看版 | 国产色网 | 婷婷色国产偷v国产偷v小说 | 久久精品在线视频 | 不用播放器的免费av | 日韩精品一区二区三区四区视频 | 欧美精品在线观看 | 青青久草 | 精品在线一区二区 | 杨门女将寡妇一级裸片看 | 日韩成人免费av | av在线成人| 国产精品二区三区 | 午夜在线视频免费观看 | 色综合久久天天综合网 | 亚洲人成人一区二区在线观看 | 国产成人av一区二区三区 | 中文字幕在线观看的电影 | 成年人免费看 | 日本精品久久久一区二区三区 | 久久久久久91香蕉国产 | www.44181com| 日本一二三视频 | 国产一区二区在线电影 | 亚洲精品亚洲人成人网 | 欧美午夜精品一区二区三区电影 | 色吧综合网 | 日本精品一区二区三区在线观看 | 久久99精品一区二区三区三区 | 午夜精品影院 | 欧美日韩电影一区 | 亚洲欧美在线视频 | 一区二区av在线 | 久久国产一区二区 | 午夜精品一区二区三区免费视频 | 日本视频中文字幕 | 国产精品久久久久久av公交车 | 天天操网址 | 中文字幕一区在线 | 男人天堂视频在线观看 | 激情视频在线观看免费 | 一级全黄少妇性色生活片毛片 | 久久99操 | 爱爱视频在线 | 日本一二三区在线 | 亚洲综合婷婷 | 亚洲视频中文字幕 | 在线看欧美 | 欧美人妖在线 | 欧美日韩一二三区 | 中文字幕大全 | 91麻豆精品国产91久久久久久久久 | 欧美激情五月 | 成年人综合网 | 成人午夜性a一级毛片免费看 | 亚洲精品电影在线观看 | 亚洲欧美精品一区 | 亚洲精品视频在线 | 亚洲视频免费 | 亚洲视频一| 欧美一级在线观看视频 | 成人老司机 | 狠狠干狠狠干 | 国产精品久久国产精品 | 欧美激情小视频 | 天天干夜操| 日韩精品中文字幕在线播放 | 欧美视频在线播放 | 日韩在线观看视频一区二区 | 黑人av | 国产亚洲精品精品国产亚洲综合 | 欧美一区二区视频 | 成人资源在线观看 | 精品久久久网站 | 久久久久亚洲精品 | 国产精品国产精品国产专区不片 | 男人视频网站 | www精品| 久久久久久久久久久久久久av | 国产一区二区三区 | 久久久久久久国产 | 九色网址 | 成人欧美亚洲 | 日韩中文字幕三区 | 99久久久国产精品美女 | 日韩激情二区 | 国产精品日日做人人爱 | 亚洲精品一 | 欧美日韩久久 | 国产精品久久久久久婷婷天堂 | www.久久久 | aaa在线| 欧美天堂在线观看 | 成人免费影院 | 午夜激情免费在线观看 | 一级黄色毛片免费 | 成人免费一区二区三区视频网站 | 亚洲精品a在线观看 | 亚洲一区二区三区免费视频 | 九九热有精品 | 久久精品国产99国产精品 | 美女国产精品 | 精品久久久久久国产 | 国产精品二区三区 | 欧美日韩综合一区 | 亚洲毛片在线 | 成人在线视频播放 | 久久久久久久久综合 | 国产亚洲精品精品国产亚洲综合 | 精品国产一区二区三区av片 | 成人a视频 | 91福利网站在线观看 | 在线观看毛片网站 | 日韩精品一区二 | 蜜臀久久99精品久久久无需会员 | 成人国产精品一级毛片视频 | 99国产精品久久久久久久成人热 | 天天操天天干天天干 | 一级片黄片毛片 | 婷婷综合一区 | 亚洲免费精品 | 天天曰天天干 | 欧美区视频| 久久国产亚洲精品 | 亚洲精品国产二区 | 韩国毛片在线观看 | 一卡二卡久久 | 国产精品不卡视频 | a级性生活| 黄色片毛片 | 日韩免费高清视频 | 日本高清视频网站 | 精品人伦一区二区三区蜜桃视频 | 91精品国产综合久久精品 | 成人亚洲视频在线观看 | 日本电影www| 亚洲欧洲一区二区 | 亚洲三区在线观看 | 久久亚洲一区二区三 | 成人免费黄色片 | 国产成人一区 | 国产精品久久久99 | 亚洲欧美在线观看 | 亚洲欧洲在线观看 | 亚洲日本乱码一区两区在线观看 | 欧洲成人午夜免费大片 | 日本久久精品 | 精品久 | 香蕉久久一区二区不卡无毒影院 | 成人午夜精品一区二区三区 | 国产一级特黄aaa大片评分 | 免费成人av | 久久精品播放 | 在线a电影 | 欧美激情一区二区三区蜜桃视频 | 国产1区在线观看 | 久久精品国产一区二区电影 | 亚洲综合区 | 久久久精品区 | 99爱视频| 欧美精品成人一区二区在线 | 天堂中文av | 亚洲精品国精品久久99热 | 青青久视频 | 国产精品久久久久久久久免费高清 | 91久久精品日日躁夜夜躁欧美 | 91久久精品一区二区二区 | 久久精彩视频 | 国产精品国产三级国产aⅴ 羞羞的视频在线 | 日本中文在线 | 久久久一区二区三区 | 高清精品一区二区 | 亚洲国产一区二区三区四区 | 日韩免费在线视频 | 精产国产伦理一二三区 | 久久久久久中文字幕 | 国产精品美女久久久久久不卡 | 国产精品久久久久久中文字 | 国产精品久久久一区二区三区 | 狠狠入ady亚洲精品经典电影 | 不卡一区二区三区四区 | 欧美精品久久久 | 国产一区二区欧美 | 国产色 | 久久久久久久香蕉 | 日本精品一区二区三区视频 | 亚洲伊人久久综合 | 精品久久一区二区三区 | 午夜视频网站 | 亚洲一区二区三区在线观看免费 | 天堂在线中文 | 超碰伊人网 | 成人深夜福利视频 | 久久久亚洲一区 | 亚洲成人精品视频 | 成人免费在线播放 | 亚洲aⅴ| 亚洲精品国产9999久久久久 | 在线观看国产wwwa级羞羞视频 | 成人看的羞羞视频免费观看 | 亚洲精品中文视频 | 国产精品一区二区三区四区 | 夜夜夜久久久 | 国产精品亚洲精品 | 精品一区二区久久久久久久网站 | 久久综合久久综合久久综合 | 欧美日韩亚洲一区二区 | 国产精品久久久久久一级毛片 | 一区二区三区久久 | 一区二区在线看 | 亚洲精品无 | 中文字幕影院 | av黄色在线免费观看 | 日本亚洲精品成人欧美一区 | 久久综合社区 | 一级黄色录像在线观看 | 九色av | www精品 | 91影院| 国产成人一区 | 亚洲免费精品 | 久久青青视频 | 激情婷婷| 在线视频这里只有精品 | 国产精品久久久久久久久久大牛 | 国产精品婷婷午夜在线观看 | av7777| 欧美一级二级三级 | 一区二区三区国产 | 中文字幕视频在线 | 天天看天天做 | av中文字幕在线 | 在线亚州| 国产精品亚洲第一区在线暖暖韩国 | 日本精品一区二区三区在线观看 | 日韩综合视频在线观看 | 99久久婷婷国产综合精品电影 | 精品国产乱码简爱久久久久久 | 精品久久久网站 | 亚洲免费视频网站 | 在线观看国精产品二区1819 | 日韩欧美在线播放 | 天天久久 | 日韩精品在线视频观看 | 99视频在线免费观看 | 精品精品| 日韩av在线免费电影 | 一区二区不卡 | 久久综合网址 | 操操操av | 91在线视频播放 | 操操操操操 | 国产性猛交xxxx免费看久久 | 亚洲91精品 | 国产视频网| 国产精品一区二区久久久久 | 另类久久 | 国产欧美日韩综合精品一区二区 | 中文字幕一区在线观看视频 | 日韩免费视频 | 精品国产一区二区三区久久久 | 亚洲成av人片一区二区三区 | 久久精品中文字幕一区 | 狠狠色狠狠色合久久伊人 | 日韩在线视频中文字幕 | 国产精品中文字幕在线 | 福利精品视频 | 亚洲欧美精品 | 天天天插 | 午夜免费 | 国产日韩高清在线 | 亚洲精品视频在线播放 | 天天干天天操天天舔 | 日韩爱爱视频 | 成人精品视频 | 伊人青青久久 | 精品国产区 | 操人网 | 伊人久久综合 | 成人 在线 | 国产精品午夜电影 | 免费观看特级毛片 | www.99热这里只有精品 | 日韩一区二区三区在线 | 国内精品一区二区三区 | 伊人伊人网| 韩国毛片在线 | 免费h | 男人天堂网址 | 干一干操一操 | 中文字幕一区二区三区四区不卡 | 亚洲一区二区中文字幕 | а√天堂资源中文最新版地址 | 国产精品久久一区性色av图片 | 久久久久久1 | 国产亚洲精品美女久久久久久久久久 | 亚洲精品日韩激情在线电影 | 国产一区91 | 夜夜av| 西西做爰免费视频 | 日韩三级电影免费观看 | 日韩精品久久久久久 | 国产激情偷乱视频一区二区三区 | 成人av观看| 天天干夜夜操 | 日韩欧美国产精品综合嫩v 亚洲欧美日韩在线 | 久久精品伊人 | 美女久久| 成人九色 | 国产91福利视频 | 欧美日韩一区二区视频在线观看 | 天天干天天操 | 国产乱码精品一区二区三区忘忧草 | 日韩特级 | 91久久国产综合久久 | 一区福利视频 | 亚洲精品免费视频 | 久久久久久久国产精品 | 最新超碰 | 久久av一区 | 国产免费黄色 | 91久久艹 | 久产久精品 | 国产精品揄拍一区二区久久国内亚洲精 | 成人在线播放 | 欧产日产国产一区 | 天天精品视频免费观看 | 国产欧美久久久久久 | 欧美日韩一区二区在线观看 | www久久精品 | 色爱av| 免费毛片a线观看 | 这里只有精品视频 | aaa级片 | 欧美日韩福利 | 国产精品久久久久一区二区三区 | 日韩一区欧美一区 | 久久精品视 | 久久精品欧美电影 | 中文字幕在线观看第一页 | 亚洲精选久久 | 伊人春色成人 | 日韩福利视频 | 中文字幕一区二区三区四区不卡 | av性色| 999国内精品永久免费视频 | 黄网站免费在线观看 | 羞羞视频免费观 | 日本特黄特色aaa大片免费 | 午夜精品一区二区三区在线观看 | 欧美精品在线一区二区三区 | 在线免费视频成人 | 午夜在线电影 | 欧美人人 | 免费看的毛片 | a久久久 | 精品国产欧美一区二区 | 日韩视频久久 | 国产精品免费观看 | 人人干在线视频 | 在线观看毛片网站 | 亚洲国产一区二区在线观看 | 九九热这里只有精品6 | 成人免费在线观看视频 | 亚洲一区二区在线 | 色优久久 | 日韩成人免费中文字幕 | 九九综合 | 日韩成人免费 | 色婷婷国产精品综合在线观看 | 国产91视频在线观看 | 综合网av| 日韩成人 | 国产精品日韩精品 | 日韩欧美视频一区二区三区 | 欧美偷偷操 | 精品96久久久久久中文字幕无 | 免费av一区 | 亚洲国产精品成人久久久 | 九色影院 | 精品一区二区不卡 | 亚洲视频在线观看免费 | 人人草在线观看视频 | 精品视频三区 | 国产精品久久久久久二区 | 一区久久久 | 欧美日韩一区二区三区不卡视频 | 91精品久久久久久9s密挑 | 欧美精品1区 | 日韩欧美国产一区二区 | 999久久久国产999久久久 | 国产精品高潮呻吟久久av黑人 | 中文字幕av一区二区三区 | 日本一区二区三区四区 | 三级国产网站 | 视频一区二区三区在线观看 | 久草美女 | 成人黄色片网站 | 天天影视色香欲 | www精品| 欧美日韩不卡合集视频 | 日韩在线一区二区三区 | 香蕉大人久久国产成人av | 国产中文字幕在线 | 久久久香蕉| 午夜欧美 | 国产精品一区在线观看 | 日本一区二区三区中文字幕 | 伊人久久国产 | 日韩精品视频在线 | 蜜臀久久99精品久久久无需会员 | 国产视频久久久久 | 午夜欧美精品久久久久 | 亚洲伊人久久综合 | 久久国产精品99久久久久久老狼 | 国产一级做a爰片在线看免费 | 97人人干 | 亚洲欧美国产一区二区三区 | 色婷婷综合网 | 国内福利视频 | 国产精品毛片一区二区在线看 | 黄毛片网站 | 高清av在线| 在线亚洲精品 | 中文字幕在线观看 | 久久久激情视频 | 午夜久久久久 | 日韩国产一区二区 | 日本久久久久久久久 | 欧美日韩视频在线观看免费 | 国产日日夜夜操 | av资源中文在线天堂 |