在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

編程中的同步和異步意味著什么?

GReq_mcu168 ? 來源:碼農(nóng)的荒島求生 ? 作者:碼農(nóng)的荒島求生 ? 2021-02-23 16:02 ? 次閱讀

承接上文《終于明白了,一文徹底理解I/O多路復用》。在這篇文章中我們來討論一下到底什么是同步,什么是異步,以及在編程中這兩個極為重要的概念到底意味著什么。

相信很多同學遇到同步異步這兩個詞的時候大腦瞬間就像紅綠燈失靈的十字路口一樣陷入一片懵逼的狀態(tài):是的,這兩個看上去很像實際上也很像的詞匯給博主造成過很大的困擾,這兩個詞背后所代表的含義到底是什么呢?

我們先從工作場景講起。

苦逼程序員

假設現(xiàn)在老板分配給了你一個很緊急并且很重要的任務,讓你下班前必須完成(萬惡的資本主義)。為了督促進度,老板搬了個椅子坐在一邊盯著你寫代碼。 你心里肯定已經(jīng)罵上了,“WTF,你有這么閑嗎?盯著老子,你就不能去干點其他事情嗎?” 老板仿佛接收到了你的腦電波一樣:“我就在這等著,你寫完前我哪也不去,廁所也不去?!?/p>

這個例子中老板交給你任務后就一直等待,什么都不做直到你寫完,這個場景就是所謂的同步。

第二天,老板又交給了你一項任務。

不過這次就沒那么著急啦,這次老板輕描淡寫,“小伙子可以啊,不錯不錯,你再努力干一年,明年我就財務自由了,今天的這個任務不著急,你寫完告訴我一聲就行”。

這次老板沒有盯著你寫代碼,而是轉身刷視頻去了,你寫完后簡單的和老板報告一聲“我寫完了”。

在這個例子中老板交代完任務后不再一直等著什么都不做而是就去忙其它事情,你完成任務后簡單的告訴老板任務完成,這就是所謂的異步。

值得注意的是,在異步這種場景下重點是在你寫代碼的同時老板在刷劇,這兩件事在同時進行,而不是一方等待另一方,因此這就是為什么一般來說異步比同步高效的本質(zhì)所在,不管同步異步應用在什么場景下。

我們可以看到同步這個詞往往和任務的“依賴”、“關聯(lián)”、“等待”等關鍵詞相關,而異步往往和任務的“不依賴”,“無關聯(lián)”,“無需等待”,“同時發(fā)生”等關鍵詞相關。

By the way,如果遇到一個在身后盯著你寫代碼的老板,三十六計走為上策。

打電話與發(fā)郵件

作為一名苦逼的程序員是不能只顧埋頭搬磚的,平時工作中的溝通免除不了,其中一種高效的溝通方式是吵架。。。啊不,是電話。

通常打電話時都是一個人在說另一個人聽,一個人在說的時候另一個人等待,等另一個人說完后再接著說,因此在這個場景中你可以看到,“依賴”、“關聯(lián)”、“等待”這些關鍵詞出現(xiàn)了,因此打電話這種溝通方式就是所謂的同步。

另一種碼農(nóng)常用的溝通方式是郵件。

郵件是另一種必不可少溝通方式,因為沒有人傻等著你寫郵件什么都不做,因此你可以慢慢悠悠的寫,當你在寫郵件時收件人可以去做一些像摸摸魚啊、上個廁所、和同時抱怨一下為什么十一假期不放兩周之類有意義的事情。

同時當你寫完郵件發(fā)出去后也不需要干巴巴的等著對方回復什么都不做,你也可以做一些像摸魚之類這樣有意義的事情。

12656534-74dd-11eb-8b86-12bb97331649.png

在這里,你寫郵件別人摸魚,這兩件事又在同時進行,收件人和發(fā)件人都不需要相互等待,發(fā)件人寫完郵件的時候簡單的點個發(fā)送就可以了,收件人收到后就可以閱讀啦,收件人和發(fā)件人不需要相互依賴、不需要相互等待。

你看,在這個場景下“不依賴”,“無關聯(lián)”,“無需等待”這些關鍵詞就出現(xiàn)了,因此郵件這種溝通方式就是異步的。

同步調(diào)用

現(xiàn)在終于回到編程的主題啦。

既然現(xiàn)在我們已經(jīng)理解了同步與異步在各種場景下的意義(I hope so),那么對于程序員來說該怎樣理解同步與異步呢?

我們先說同步調(diào)用,這是程序員最熟悉的場景。

一般的函數(shù)調(diào)用都是同步的,就像這樣:

funcA() { // 等待函數(shù)funcB執(zhí)行完成 funcB(); // 繼續(xù)接下來的流程}

funcA調(diào)用funcB,那么在funcB執(zhí)行完前,funcA中的后續(xù)代碼都不會被執(zhí)行,也就是說funcA必須等待funcB執(zhí)行完成,就像這樣:

12c9d85c-74dd-11eb-8b86-12bb97331649.png

從上圖中我們可以看到,在funcB運行期間funcA什么都做不了,這就是典型的同步。

注意,一般來說,像這種同步調(diào)用,funcA和funcB是運行在同一個線程中的,這是最為常見的情況。

但值得注意的是,即使運行在兩個不能線程中的函數(shù)也可以進行同步調(diào)用,像我們進行IO操作時實際上底層是通過系統(tǒng)調(diào)用(關于系統(tǒng)調(diào)用請參考《程序員應如何理解系統(tǒng)調(diào)用》)的方式向操作系統(tǒng)發(fā)出請求的,比如磁盤文件讀?。?/p>

read(file, buf);

這就是我們在《讀取文件時,程序經(jīng)歷了什么》中描述的阻塞式I/O,在read函數(shù)返回前程序是無法繼續(xù)向前推進的

read(file, buf);// 程序暫停運行,// 等待文件讀取完成后繼續(xù)運行

如圖所示:

1325ed5e-74dd-11eb-8b86-12bb97331649.png

只有當read函數(shù)返回后程序才可以被繼續(xù)執(zhí)行。

注意,和上面的同步調(diào)用不同的是,函數(shù)和被調(diào)函數(shù)運行在不同的線程中。

因此我們可以得出結論,同步調(diào)用和函數(shù)與被調(diào)函數(shù)是否運行在同一個線程是沒有關系的。

在這里我們還要再次強調(diào),同步方式下函數(shù)和被調(diào)函數(shù)無法同時進行。

同步編程對程序員來說是最自然最容易理解的。

但容易理解的代價就是在一些場景下,同步并不是高效的,原因很簡單,因為任務沒有辦法同時進行。

接下來我們看異步調(diào)用。

異步調(diào)用

有同步調(diào)用就有異步調(diào)用。

如果你真的理解了本節(jié)到目前為止的內(nèi)容的話,那么異步調(diào)用對你來說不是問題。

一般來說,異步調(diào)用總是和I/O操作等耗時較高的任務如影隨形,像磁盤文件讀寫、網(wǎng)絡數(shù)據(jù)的收發(fā)、數(shù)據(jù)庫操作等。

我們還是以磁盤文件讀取為例。

在read函數(shù)的同步調(diào)用方式下,文件讀取完之前調(diào)用方是無法繼續(xù)向前推進的,但如果read函數(shù)可以異步調(diào)用情況就不一樣了。

假如read函數(shù)可以異步調(diào)用的話,即使文件還沒有讀取完成,read函數(shù)也可以立即返回。

read(file, buff);// read函數(shù)立即返回// 不會阻塞當前程序

就像這樣:

13b30e32-74dd-11eb-8b86-12bb97331649.png

可以看到,在異步這種調(diào)用方式下,調(diào)用方不會被阻塞,函數(shù)調(diào)用完成后可以立即執(zhí)行接下來的程序。

這時異步的重點就在于調(diào)用方接下來的程序執(zhí)行可以和文件讀取同時進行,從上圖中我們也能看出這一點,這就是異步的高效之處。

但是,請注意,異步調(diào)用對于程序員來說在理解上是一種負擔,代碼編寫上更是一種負擔,總的來說,上帝在為你打開一扇門的時候會適當?shù)年P上一扇窗戶。

有的同學可能會問,在同步調(diào)用下,調(diào)用方不再繼續(xù)執(zhí)行而是暫停等待,被調(diào)函數(shù)執(zhí)行完后很自然的就是調(diào)用方繼續(xù)執(zhí)行,那么異步調(diào)用下調(diào)用方怎知道被調(diào)函數(shù)是否執(zhí)行完成呢?

這就分為了兩種情況:

調(diào)用方根本就不關心執(zhí)行結果

調(diào)用方需要知道執(zhí)行結果

第一種情況比較簡單,無需討論。

第二種情況下就比較有趣了,通常有兩種實現(xiàn)方式:

一種是通知機制,也就是說當任務執(zhí)行完成后發(fā)送信號來通知調(diào)用方任務完成,注意這里的信號有很多實現(xiàn)方式,Linux中的signal,或者使用信號量等機制都可以實現(xiàn)。

另一種是就是回調(diào),也就是我們常說的callback,關于回調(diào)我們將在下一篇文章中重點講解,本篇會有簡短的討論。

接下來我們用一個具體的例子講解一下同步調(diào)用與異步調(diào)用。

同步 VS 異步

我們以常見的Web服務來舉例說明這一問題。

一般來說Web Server接收到用戶請求后會有一些典型的處理邏輯,最常見的就是數(shù)據(jù)庫查詢(當然,你也可以把這里的數(shù)據(jù)庫查詢換成其它I/O操作,比如磁盤讀取、網(wǎng)絡通信等),在這里我們假定處理一次用戶請求需要經(jīng)過步驟A、B、C,然后讀取數(shù)據(jù)庫,數(shù)據(jù)庫讀取完成后需要經(jīng)過步驟D、E、F,就像這樣:

# 處理一次用戶請求需要經(jīng)過的步驟:A;B;C;數(shù)據(jù)庫讀取;D;E;F;

其中步驟A、B、C和D、E、F不需要任何I/O,也就是說這六個步驟不需要讀取文件、網(wǎng)絡通信等,涉及到I/O操作的只有數(shù)據(jù)庫查詢這一步。

一般來說這樣的Web Server有兩個典型的線程:主線程和數(shù)據(jù)庫處理線程,注意,這討論的只是典型的場景,具體業(yè)務實際上可會有差別,但這并不影響我們用兩個線程來說明問題。

首先我們來看下最簡單的實現(xiàn)方式,也就是同步。

這種方式最為自然也最為容易理解:

// 主線程main_thread() { A; B; C; 發(fā)送數(shù)據(jù)庫查詢請求; D; E; F;}// 數(shù)據(jù)庫線程DataBase_thread() { while(1) { 處理數(shù)據(jù)庫讀取請求; 返回結果; }}

這就是最為典型的同步方法,主線程在發(fā)出數(shù)據(jù)庫查詢請求后就會被阻塞而暫停運行,直到數(shù)據(jù)庫查詢完畢后面的D、E、F才可以繼續(xù)運行,就像這樣:

13e824e6-74dd-11eb-8b86-12bb97331649.png

從圖中我們可以看到,主線程中會有“空隙”,這個空隙就是主線程的“休閑時光”,主線程在這段休閑時光中需要等待數(shù)據(jù)庫查詢完成才能繼續(xù)后續(xù)處理流程。

在這里主線程就好比監(jiān)工的老板,數(shù)據(jù)庫線程就好比苦逼搬磚的程序員,在搬完磚前老板什么都不做只是緊緊的盯著你,等你搬完磚后才去忙其它事情。

顯然,高效的程序員是不能容忍主線程偷懶的。

是時候祭出大殺器了,這就是異步。

在異步這種實現(xiàn)方案下主線程根本不去等待數(shù)據(jù)庫是否查詢完成,而是發(fā)送完數(shù)據(jù)庫讀寫請求后直接處理下一個請求。

有的同學可能會有疑問,一個請求需要經(jīng)過A、B、C、數(shù)據(jù)庫查詢、D、E、F這七個步驟,如果主線程在完成A、B、C、數(shù)據(jù)庫查詢后直接進行處理接下來的請求,那么上一個請求中剩下的D、E、F幾個步驟怎么辦呢?

如果大家還沒有忘記上一小節(jié)內(nèi)容的話應該知道,這有兩種情況,我們來分別討論。

1,主線程不關心數(shù)據(jù)庫操作結果

在這種情況下,主線程根本就不關心數(shù)據(jù)庫是否查詢完畢,數(shù)據(jù)庫查詢完畢后自行處理接下來的D、E、F三個步驟,就像這樣:

1441a94e-74dd-11eb-8b86-12bb97331649.png

看到了吧,接下來重點來了哦。

我們說過一個請求需要經(jīng)過七個步驟,其中前三個是在主線程中完成的,后四個是在數(shù)據(jù)庫線程中完成的,那么數(shù)據(jù)庫線程是怎么知道查完數(shù)據(jù)庫后要處理D、E、F這幾個步驟呢?

這時,我們的另一個主角回調(diào)函數(shù)就開始登場啦。

沒錯,回調(diào)函數(shù)就是用來解決這一問題的。

我們可以將處理D、E、F這幾個步驟封裝到一個函數(shù)中,假定將該函數(shù)命名為handle_DEF_after_DB_query:

void handle_DEF_after_DB_query () { D; E; F;}

這樣主線程在發(fā)送數(shù)據(jù)庫查詢請求的同時將該函數(shù)一并當做參數(shù)傳遞過去:

DB_query(request, handle_DEF_after_DB_query);

數(shù)據(jù)庫線程處理完后直接調(diào)用handle_DEF_after_DB_query就可以了,這就是回調(diào)函數(shù)的作用。

也有的同學可能會有疑問,為什么這個函數(shù)要傳遞給數(shù)據(jù)庫線程而不是數(shù)據(jù)庫線程自己定義自己調(diào)用呢?

因為從軟件組織結構上講,這不是數(shù)據(jù)庫線程該做的工作。

數(shù)據(jù)庫線程需要做的僅僅就是查詢數(shù)據(jù)庫、然后調(diào)用一個處理函數(shù),至于這個處理函數(shù)做了些什么數(shù)據(jù)庫線程根本就不關心,也不應該關心。

你可以傳入各種各樣的回調(diào)函數(shù)。也就是說數(shù)據(jù)庫系統(tǒng)可以針對回調(diào)函數(shù)這一抽象的函數(shù)變量來編程,從而更好的應對變化,因為回調(diào)函數(shù)的內(nèi)容改變不會影響到數(shù)據(jù)庫線程的邏輯,而如果數(shù)據(jù)庫線程自己定義處理函數(shù)那么這種設計就沒有靈活性可言了。

而從軟件開發(fā)的角度看,假設數(shù)據(jù)庫線程邏輯封裝為了庫提供給其它團隊,當數(shù)據(jù)庫團隊在研發(fā)時怎么可能知道數(shù)據(jù)庫查詢后該做什么呢?

顯然,只有使用方才知道查詢完數(shù)據(jù)庫后該做些什么,因此使用方在使用時簡單的傳入這個回調(diào)函數(shù)就可以了。

這樣復雜數(shù)據(jù)庫的團隊就和使用方團隊實現(xiàn)了所謂的解耦。

現(xiàn)在你應該明白回調(diào)函數(shù)的作用了吧。

如果你覺得有幫到你,請伸出你的小手幫忙分享再看一下,原創(chuàng)不易,你的一個在看是對博主最大的肯定,拜托大家啦。

不容易啊,容我喝口水叉會兒腰歇一歇。

我們繼續(xù)。

另外仔細觀察上面兩張圖,你能看出為什么異步比同步高效嗎?

原因很簡單,這也是我們在本篇提到過的,異步天然就無需等待,無依賴。

從上一張圖中我們可以看到主線程的“休閑時光”不見了,取而代之的是不斷的工作、工作、工作,就像苦逼的996程序員一樣,而且數(shù)據(jù)庫線程也沒有那么大段大段的空閑了,取而代之的也是工作、工作、工作。

主線程處理請求和數(shù)據(jù)庫處理查詢請求可以同時進行,因此從系統(tǒng)性能上看,這樣的設計能更加充分的利用系統(tǒng)資源,更加快速的處理請求;從用戶的角度看,系統(tǒng)的響應也會更加迅速。

這就是異步的高效之處。

但我們應該也可以看出,異步編程并不如同步來的容易理解,系統(tǒng)可維護性上也不如同步模式。

那么有沒有一種方法既能結合同步模式的容易理解又能結合異步模式的高效呢?答案是肯定的,我們將在后續(xù)章節(jié)詳細講解這一技術。

接下來我們看第二種情況,那就是主線程需要關心數(shù)據(jù)庫查詢結果。

2. 主線程關心數(shù)據(jù)庫操作結果

在這種情況下,數(shù)據(jù)庫線程需要將查詢結果利用通知機制發(fā)送給主線程,主線程在接收到消息后繼續(xù)處理上一個請求的后半部分,就像這樣:

1dca0f9c-74dd-11eb-8b86-12bb97331649.png

從這里我們可以看到,ABCDEF幾個步驟全部在主線中處理,同時主線程同樣也沒有了“休閑時光”,只不過在這種情況下數(shù)據(jù)庫線程是比較清閑的,從這里并沒有上一種方法高效,但是依然要比同步模式下要高效。

最后需要注意的是,并不是所有的情況下異步都一定比同步高效,還需要結合具體業(yè)務以及IO的復雜度具體情況具體分析。

總結

在這篇文章中我們從各種場景分析了同步與異步這兩個概念,但是不管在什么場景下,同步往往意味著雙方要相互等待、相互依賴,而異步意味著雙方相互獨立、各行其是。希望本篇能對大家理解這兩個重要的概念有所幫助。

原文標題:從小白到高手,你需要理解同步與異步(內(nèi)含10張圖)

文章出處:【微信公眾號:玩轉單片機】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編程
    +關注

    關注

    88

    文章

    3685

    瀏覽量

    94923
  • 同步
    +關注

    關注

    0

    文章

    89

    瀏覽量

    19496
  • 異步
    +關注

    關注

    0

    文章

    62

    瀏覽量

    18268

原文標題:從小白到高手,你需要理解同步與異步(內(nèi)含10張圖)

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    求助,關于iMX DDR3寄存器編程輔助問題求解

    為 933MHz。 使用編程輔助工具,如果我在表輸入933Mhz、它會計算出1.071ns 的時鐘周期時間、這會導致 tRCD 寄存器值變?yōu)椤? 這是否意味著我使用了錯誤的 clock cycle frequency 值,還是
    發(fā)表于 03-27 07:16

    AFE0064芯片手冊把所有的地引腳都表示為GND,是不是就意味著不分數(shù)字地和模擬地呢?

    最近在用AFE0064設計一款產(chǎn)品,再畫版圖的時候遇到了問題,就是AFE0064芯片手冊把所有的地引腳都表示為GND,是不是就意味著不分數(shù)字地和模擬地呢?如果后端AD分數(shù)字地和模擬地,為了達到更好的性能,GND應該和數(shù)字地相連,還是模擬地鏈接呢?
    發(fā)表于 01-10 07:06

    ADS7230有兩個電源和兩個地,是不是意味著芯片內(nèi)部模擬部分和數(shù)字部分是隔離的?

    ADS7230有兩個電源和兩個地,是不是意味著芯片內(nèi)部模擬部分和數(shù)字部分是隔離的?或者是非隔離,只做電平轉換的?忘各位大俠解答,小弟不甚感激?。?!
    發(fā)表于 01-08 08:21

    ADS1274沒有DRDY信號輸出,是否意味著芯片已經(jīng)損壞?

    ADS1274有CLK信號,但是沒有DRDY信號輸出,是否意味著芯片已經(jīng)損壞? 芯片工作正常應該一直有DRDY信號輸出的,之前芯片一直是正常的,接了個傳感器加載測試結果DRDY就沒輸出了,傳感器
    發(fā)表于 12-31 07:34

    ADS8671 datasheet里寫的是小信號輸入-3db帶寬為15KHz,是不是意味著正常信號超過10K衰減已經(jīng)很厲害了?

    ADS8671這個芯片,datasheet里寫的是小信號輸入-3db帶寬為15KHz,是不是意味著正常信號超過10K衰減已經(jīng)很厲害了,那要1MSPS這么高的采樣速率有什么用?
    發(fā)表于 12-20 07:54

    在ADS8320的規(guī)格書里,Tcsd最大為0ns,請問這是不是意味著Dclock極性只能是空閑為低?

    在ADS8320的規(guī)格書里,Tcsd最大為0ns,請問這是不是意味著Dclock極性只能是空閑為低?
    發(fā)表于 11-29 06:47

    ADC的數(shù)據(jù)表給出了±VREF的輸入范圍,是否意味著可以測量相對于接地的負電壓?

    我的 ADC 的數(shù)據(jù)表給出了 ±VREF 的輸入范圍。這是否意味著我可以測量相對于接地的負電壓?
    發(fā)表于 11-26 08:22

    永磁同步電機的工作原理 永磁同步電機與異步電機的區(qū)別

    與定子繞組的電流相互作用,產(chǎn)生轉矩。 同步運行 :在永磁同步電機,轉子的轉速與定子產(chǎn)生的旋轉磁場的轉速相同,因此稱為“同步”。這
    的頭像 發(fā)表于 11-22 10:08 ?2435次閱讀

    ADS1262浮空測量波動大,是否意味著連接上信號實測波動也會很大?

    : 1.這樣的測試數(shù)據(jù)是否具有參考價值?換句話說,浮空測量波動大,是否意味著連接上信號實測波動也會很大? 2.USB轉TTL芯片接電腦輸出的5V電壓是否不夠穩(wěn)定,無法正確反應采集效果?
    發(fā)表于 11-19 06:17

    同步電機與異步電機在功能、用途上的主要區(qū)別是什么?

    。這意味著同步電機的轉速是固定的,不會隨著負載的變化而改變。而異步電機的轉子轉速則略低于同步速度,這種速度差稱為滑差。異步電機的轉速會隨著負
    的頭像 發(fā)表于 10-24 13:51 ?1564次閱讀

    請問固定增益芯片是否意味著不能通過改變外圍參數(shù)來改變增益?

    固定增益芯片是否意味著我不能通過改變外圍參數(shù)來改變增益?
    發(fā)表于 09-11 07:13

    同步調(diào)制異步調(diào)制的概念及優(yōu)缺點

    和接收方的時鐘信號是同步的。這意味著發(fā)送方和接收方都使用相同的時鐘頻率來發(fā)送和接收數(shù)據(jù)。同步調(diào)制通常用于高速數(shù)據(jù)傳輸,如局域網(wǎng)(LAN)和廣域網(wǎng)(WAN)。 優(yōu)點 高數(shù)據(jù)傳輸速率 :由于發(fā)送方和接收方的時鐘
    的頭像 發(fā)表于 08-14 11:17 ?2650次閱讀

    想要對脈寬3ns的脈沖信號進行放大,是不是意味著我選放大器時的響應時間要小于3ns?

    想要對脈寬3ns的脈沖信號進行放大,是不是意味著我選放大器時的響應時間要小于3ns?
    發(fā)表于 08-08 07:31

    怎么判斷同步清零和異步清零

    在數(shù)字電路設計,清零操作是一種常見的操作,用于將寄存器或計數(shù)器的值清零。清零操作可以分為同步清零和異步清零兩種方式,它們在電路設計中有著不同的應用場景和特點。 同步清零和
    的頭像 發(fā)表于 07-23 11:11 ?5516次閱讀

    FPGA同步復位和異步復位

    FPGA(Field-Programmable Gate Array,現(xiàn)場可編程門陣列)的復位操作是設計過程不可或缺的一環(huán),它負責將電路恢復到初始狀態(tài),以確保系統(tǒng)的正確啟動和穩(wěn)定運行。在FPGA設計
    的頭像 發(fā)表于 07-17 11:12 ?2502次閱讀
    主站蜘蛛池模板: 91九色成人| 中国又粗又大又爽的毛片 | 亚欧乱色束缚一区二区三区 | 日本黄色美女网站 | 久久国产免费观看 | 国模掰开| 性欧美另类 | 综合五月 | 你懂的在线观看网站 | 亚洲精品成人网 | 狠狠操欧美| 综合久久2o19 | 天天干夜夜曰 | 久久香蕉国产线看观看亚洲片 | 黄色一级片网址 | 午夜视频在线免费看 | 加勒比啪啪 | 韩国三级无遮挡床戏视频 | 日本三级黄色录像 | h黄视频| 欧美日韩精品一区二区另类 | 噜噜噜久久 | 88影视在线观看污污 | 永久黄色免费网站 | 88av在线看 | 日韩午夜精品 | 国产美女视频黄a视频免费全过程 | 深夜福利一区 | 性大特级毛片视频 | 4455永久在线毛片观看 | 国产午夜精品视频 | 人人插人人干 | 国模大尺度酒店私拍视频拍拍 | 亚洲一级毛片免费在线观看 | 1024国产你懂的日韩 | 月夜免费观看高清在线完整 | 久久精品视频5 | 天堂资源在线最新版 | 欧洲天堂网 | 天天干天天玩 | 久久婷婷国产综合精品 |