Java零拷貝一步曲——Linux 中的零拷貝技術(shù)

傳統(tǒng)的 Linux 操作系統(tǒng)的標(biāo)準(zhǔn) I/O 接口是基于數(shù)據(jù)拷貝操作的扑媚,即 I/O 操作會導(dǎo)致數(shù)據(jù)在操作系統(tǒng)內(nèi)核地址空間的緩沖區(qū)和應(yīng)用程序地址空間定義的緩沖區(qū)之間進(jìn)行傳輸喳魏。這樣做最大的好處是可以減少磁盤 I/O 的操作,因為如果所請求的數(shù)據(jù)已經(jīng)存放在操作系統(tǒng)的高速緩沖存儲器中,那么就不需要再進(jìn)行實際的物理磁盤 I/O 操作。但是數(shù)據(jù)傳輸過程中的數(shù)據(jù)拷貝操作卻導(dǎo)致了極大的 CPU 開銷官帘,限制了操作系統(tǒng)有效進(jìn)行數(shù)據(jù)傳輸操作的能力。

零拷貝( zero-copy )這種技術(shù)可以有效地改善數(shù)據(jù)傳輸?shù)男阅苊烈辏趦?nèi)核驅(qū)動程序(比如網(wǎng)絡(luò)堆椆艉纾或者磁盤存儲驅(qū)動程序)處理 I/O 數(shù)據(jù)的時候,零拷貝技術(shù)可以在某種程度上減少甚至完全避免不必要 CPU 數(shù)據(jù)拷貝操作∧匚埽現(xiàn)代的 CPU 和存儲體系結(jié)構(gòu)提供了很多特征可以有效地實現(xiàn)零拷貝技術(shù)涌哲,但是因為存儲體系結(jié)構(gòu)非常復(fù)雜,而且網(wǎng)絡(luò)協(xié)議棧有時需要對數(shù)據(jù)進(jìn)行必要的處理尚镰,所以零拷貝技術(shù)有可能會產(chǎn)生很多負(fù)面的影響阀圾,甚至?xí)?dǎo)致零拷貝技術(shù)自身的優(yōu)點(diǎn)完全喪失。

為什么需要零拷貝技術(shù)

如今钓猬,很多網(wǎng)絡(luò)服務(wù)器都是基于客戶端 - 服務(wù)器這一模型的稍刀。在這種模型中,客戶端向服務(wù)器端請求數(shù)據(jù)或者服務(wù)敞曹;服務(wù)器端則需要響應(yīng)客戶端發(fā)出的請求账月,并為客戶端提供它所需要的數(shù)據(jù)。隨著網(wǎng)絡(luò)服務(wù)的逐漸普及澳迫,video 這類應(yīng)用程序發(fā)展迅速局齿。當(dāng)今的計算機(jī)系統(tǒng)已經(jīng)具備足夠的能力去處理 video 這類應(yīng)用程序?qū)蛻舳怂斐傻闹刎?fù)荷,但是對于服務(wù)器端來說橄登,它應(yīng)付由 video 這類應(yīng)用程序引起的網(wǎng)絡(luò)通信量就顯得捉襟見肘了抓歼。而且,客戶端的數(shù)量增長迅速拢锹,那么服務(wù)器端就更容易成為性能瓶頸谣妻。而對于負(fù)荷很重的服務(wù)器來說,操作系統(tǒng)通常都是引起性能瓶頸的罪魁禍?zhǔn)鬃湮取Ee個例子來說蹋半,當(dāng)數(shù)據(jù)“寫”操作或者數(shù)據(jù)“發(fā)送”操作的系統(tǒng)調(diào)用發(fā)出時,操作系統(tǒng)通常都會將數(shù)據(jù)從應(yīng)用程序地址空間的緩沖區(qū)拷貝到操作系統(tǒng)內(nèi)核的緩沖區(qū)中去充坑。操作系統(tǒng)這樣做的好處是接口簡單减江,但是卻在很大程度上損失了系統(tǒng)性能,因為這種數(shù)據(jù)拷貝操作不單需要占用 CPU 時間片捻爷,同時也需要占用額外的內(nèi)存帶寬辈灼。

一般來說,客戶端通過網(wǎng)絡(luò)接口卡向服務(wù)器端發(fā)送請求也榄,操作系統(tǒng)將這些客戶端的請求傳遞給服務(wù)器端應(yīng)用程序巡莹,服務(wù)器端應(yīng)用程序會處理這些請求,請求處理完成以后,操作系統(tǒng)還需要將處理得到的結(jié)果通過網(wǎng)絡(luò)適配器傳遞回去榕莺。

下邊這一小節(jié)會跟讀者簡單介紹一下傳統(tǒng)的服務(wù)器是如何進(jìn)行數(shù)據(jù)傳輸?shù)睦荆约斑@種數(shù)據(jù)傳輸?shù)奶幚磉^程存在哪些問題有可能會造成服務(wù)器的性能損失

Linux中傳統(tǒng)服務(wù)器進(jìn)行數(shù)據(jù)傳輸?shù)牧鞒?/p>

Linux ?中傳統(tǒng)的 I/O 操作是一種緩沖 I/O,I/O 過程中產(chǎn)生的數(shù)據(jù)傳輸通常需要在緩沖區(qū)中進(jìn)行多次的拷貝操作钉鸯。一般來說吧史,在傳輸數(shù)據(jù)的時候,用戶應(yīng)用程序需要分配一塊大小合適的緩沖區(qū)用來存放需要傳輸?shù)臄?shù)據(jù)唠雕。應(yīng)用程序從文件中讀取一塊數(shù)據(jù)贸营,然后把這塊數(shù)據(jù)通過網(wǎng)絡(luò)發(fā)送到接收端去。用戶應(yīng)用程序只是需要調(diào)用兩個系統(tǒng)調(diào)用 read() 和 write() 就可以完成這個數(shù)據(jù)傳輸操作岩睁,應(yīng)用程序并不知曉在這個數(shù)據(jù)傳輸?shù)倪^程中操作系統(tǒng)所做的數(shù)據(jù)拷貝操作钞脂。對于 Linux 操作系統(tǒng)來說,基于數(shù)據(jù)排序或者校驗等各方面因素的考慮捕儒,操作系統(tǒng)內(nèi)核會在處理數(shù)據(jù)傳輸?shù)倪^程中進(jìn)行多次拷貝操作冰啃。在某些情況下,這些數(shù)據(jù)拷貝操作會極大地降低數(shù)據(jù)傳輸?shù)男阅堋?/p>

當(dāng)應(yīng)用程序需要訪問某塊數(shù)據(jù)的時候刘莹,操作系統(tǒng)內(nèi)核會先檢查這塊數(shù)據(jù)是不是因為前一次對相同文件的訪問而已經(jīng)被存放在操作系統(tǒng)內(nèi)核地址空間的緩沖區(qū)內(nèi)阎毅,如果在內(nèi)核緩沖區(qū)中找不到這塊數(shù)據(jù),Linux 操作系統(tǒng)內(nèi)核會先將這塊數(shù)據(jù)從磁盤讀出來放到操作系統(tǒng)內(nèi)核的緩沖區(qū)里去点弯。如果這個數(shù)據(jù)讀取操作是由 DMA 完成的扇调,那么在 DMA 進(jìn)行數(shù)據(jù)讀取的這一過程中,CPU 只是需要進(jìn)行緩沖區(qū)管理抢肛,以及創(chuàng)建和處理 DMA 狼钮,除此之外,CPU 不需要再做更多的事情捡絮,DMA 執(zhí)行完數(shù)據(jù)讀取操作之后熬芜,會通知操作系統(tǒng)做進(jìn)一步的處理。Linux 操作系統(tǒng)會根據(jù) read() 系統(tǒng)調(diào)用指定的應(yīng)用程序地址空間的地址福稳,把這塊數(shù)據(jù)存放到請求這塊數(shù)據(jù)的應(yīng)用程序的地址空間中去涎拉,在接下來的處理過程中,操作系統(tǒng)需要將數(shù)據(jù)再一次從用戶應(yīng)用程序地址空間的緩沖區(qū)拷貝到與網(wǎng)絡(luò)堆棧相關(guān)的內(nèi)核緩沖區(qū)中去灵寺,這個過程也是需要占用 CPU 的。數(shù)據(jù)拷貝操作結(jié)束以后区岗,數(shù)據(jù)會被打包略板,然后發(fā)送到網(wǎng)絡(luò)接口卡上去。在數(shù)據(jù)傳輸?shù)倪^程中慈缔,應(yīng)用程序可以先返回進(jìn)而執(zhí)行其他的操作叮称。之后,在調(diào)用 write() 系統(tǒng)調(diào)用的時候,用戶應(yīng)用程序緩沖區(qū)中的數(shù)據(jù)內(nèi)容可以被安全的丟棄或者更改瓤檐,因為操作系統(tǒng)已經(jīng)在內(nèi)核緩沖區(qū)中保留了一份數(shù)據(jù)拷貝赂韵,當(dāng)數(shù)據(jù)被成功傳送到硬件上之后,這份數(shù)據(jù)拷貝就可以被丟棄挠蛉。

從上面的描述可以看出祭示,在這種傳統(tǒng)的數(shù)據(jù)傳輸過程中,數(shù)據(jù)至少發(fā)生了四次拷貝操作谴古,即便是使用了 DMA 來進(jìn)行與硬件的通訊质涛,CPU 仍然需要訪問數(shù)據(jù)兩次。在 read() 讀數(shù)據(jù)的過程中掰担,數(shù)據(jù)并不是直接來自于硬盤汇陆,而是必須先經(jīng)過操作系統(tǒng)的文件系統(tǒng)層。在 write() 寫數(shù)據(jù)的過程中带饱,為了和要傳輸?shù)臄?shù)據(jù)包的大小相吻合毡代,數(shù)據(jù)必須要先被分割成塊,而且還要預(yù)先考慮包頭勺疼,并且要進(jìn)行數(shù)據(jù)校驗和操作教寂。

圖 1. 傳統(tǒng)使用 read 和 write 系統(tǒng)調(diào)用的數(shù)據(jù)傳輸

零拷貝(zero copy)技術(shù)概述

什么是零拷貝?

簡單一點(diǎn)來說,零拷貝就是一種避免 CPU 將數(shù)據(jù)從一塊存儲拷貝到另外一塊存儲的技術(shù)鞠绰。針對操作系統(tǒng)中的設(shè)備驅(qū)動程序异逐、文件系統(tǒng)以及網(wǎng)絡(luò)協(xié)議堆棧而出現(xiàn)的各種零拷貝技術(shù)極大地提升了特定應(yīng)用程序的性能,并且使得這些應(yīng)用程序可以更加有效地利用系統(tǒng)資源因妇。這種性能的提升就是通過在數(shù)據(jù)拷貝進(jìn)行的同時,允許 CPU 執(zhí)行其他的任務(wù)來實現(xiàn)的猿诸。零拷貝技術(shù)可以減少數(shù)據(jù)拷貝和共享總線操作的次數(shù)婚被,消除傳輸數(shù)據(jù)在存儲器之間不必要的中間拷貝次數(shù),從而有效地提高數(shù)據(jù)傳輸效率梳虽。而且址芯,零拷貝技術(shù)減少了用戶應(yīng)用程序地址空間和操作系統(tǒng)內(nèi)核地址空間之間因為上下文切換而帶來的開銷。進(jìn)行大量的數(shù)據(jù)拷貝操作其實是一件簡單的任務(wù)窜觉,從操作系統(tǒng)的角度來說谷炸,如果 CPU 一直被占用著去執(zhí)行這項簡單的任務(wù),那么這將會是很浪費(fèi)資源的禀挫;如果有其他比較簡單的系統(tǒng)部件可以代勞這件事情旬陡,從而使得 CPU 解脫出來可以做別的事情,那么系統(tǒng)資源的利用則會更加有效语婴。綜上所述描孟,零拷貝技術(shù)的目標(biāo)可以概括如下:

避免數(shù)據(jù)拷貝

避免操作系統(tǒng)內(nèi)核緩沖區(qū)之間進(jìn)行數(shù)據(jù)拷貝操作驶睦。

避免操作系統(tǒng)內(nèi)核和用戶應(yīng)用程序地址空間這兩者之間進(jìn)行數(shù)據(jù)拷貝操作。

用戶應(yīng)用程序可以避開操作系統(tǒng)直接訪問硬件存儲匿醒。

數(shù)據(jù)傳輸盡量讓 DMA 來做

將多種操作結(jié)合在一起

避免不必要的系統(tǒng)調(diào)用和上下文切換场航。

需要拷貝的數(shù)據(jù)可以先被緩存起來。

對數(shù)據(jù)進(jìn)行處理盡量讓硬件來做廉羔。

前文提到過溉痢,對于高速網(wǎng)絡(luò)來說,零拷貝技術(shù)是非常重要的蜜另。這是因為高速網(wǎng)絡(luò)的網(wǎng)絡(luò)鏈接能力與 CPU 的處理能力接近适室,甚至?xí)^ CPU 的處理能力。如果是這樣的話举瑰,那么 CPU 就有可能需要花費(fèi)幾乎所有的時間去拷貝要傳輸?shù)臄?shù)據(jù)捣辆,而沒有能力再去做別的事情,這就產(chǎn)生了性能瓶頸此迅,限制了通訊速率汽畴,從而降低了網(wǎng)絡(luò)鏈接的能力。一般來說耸序,一個 CPU 時鐘周期可以處理一位的數(shù)據(jù)忍些。舉例來說,一個 1 GHz 的處理器可以對 1Gbit/s 的網(wǎng)絡(luò)鏈接進(jìn)行傳統(tǒng)的數(shù)據(jù)拷貝操作坎怪,但是如果是 10 Gbit/s 的網(wǎng)絡(luò)罢坝,那么對于相同的處理器來說,零拷貝技術(shù)就變得非常重要了搅窿。對于超過 1 Gbit/s 的網(wǎng)絡(luò)鏈接來說嘁酿,零拷貝技術(shù)在超級計算機(jī)集群以及大型的商業(yè)數(shù)據(jù)中心中都有所應(yīng)用。然而男应,隨著信息技術(shù)的發(fā)展闹司,1 Gbit/s,10 Gbit/s 以及 100 Gbit/s 的網(wǎng)絡(luò)會越來越普及沐飘,那么零拷貝技術(shù)也會變得越來越普及游桩,這是因為網(wǎng)絡(luò)鏈接的處理能力比 CPU 的處理能力的增長要快得多。傳統(tǒng)的數(shù)據(jù)拷貝受限于傳統(tǒng)的操作系統(tǒng)或者通信協(xié)議耐朴,這就限制了數(shù)據(jù)傳輸性能借卧。零拷貝技術(shù)通過減少數(shù)據(jù)拷貝次數(shù),簡化協(xié)議處理的層次筛峭,在應(yīng)用程序和網(wǎng)絡(luò)之間提供更快的數(shù)據(jù)傳輸方法铐刘,從而可以有效地降低通信延遲,提高網(wǎng)絡(luò)吞吐率蜒滩。零拷貝技術(shù)是實現(xiàn)主機(jī)或者路由器等設(shè)備高速網(wǎng)絡(luò)接口的主要技術(shù)之一滨达。

現(xiàn)代的 CPU 和存儲體系結(jié)構(gòu)提供了很多相關(guān)的功能來減少或避免 I/O 操作過程中產(chǎn)生的不必要的 CPU 數(shù)據(jù)拷貝操作,但是俯艰,CPU 和存儲體系結(jié)構(gòu)的這種優(yōu)勢經(jīng)常被過高估計捡遍。存儲體系結(jié)構(gòu)的復(fù)雜性以及網(wǎng)絡(luò)協(xié)議中必需的數(shù)據(jù)傳輸可能會產(chǎn)生問題,有時甚至?xí)?dǎo)致零拷貝這種技術(shù)的優(yōu)點(diǎn)完全喪失竹握。在下一章中画株,我們會介紹幾種 Linux 操作系統(tǒng)中出現(xiàn)的零拷貝技術(shù),簡單描述一下它們的實現(xiàn)方法啦辐,并對它們的弱點(diǎn)進(jìn)行分析谓传。

零拷貝技術(shù)分類

零拷貝技術(shù)的發(fā)展很多樣化,現(xiàn)有的零拷貝技術(shù)種類也非常多芹关,而當(dāng)前并沒有一個適合于所有場景的零拷貝技術(shù)的出現(xiàn)续挟。對于 Linux 來說,現(xiàn)存的零拷貝技術(shù)也比較多侥衬,這些零拷貝技術(shù)大部分存在于不同的 Linux 內(nèi)核版本诗祸,有些舊的技術(shù)在不同的 Linux 內(nèi)核版本間得到了很大的發(fā)展或者已經(jīng)漸漸被新的技術(shù)所代替。本文針對這些零拷貝技術(shù)所適用的不同場景對它們進(jìn)行了劃分轴总。概括起來直颅,Linux 中的零拷貝技術(shù)主要有下面這幾種:

直接 I/O:對于這種數(shù)據(jù)傳輸方式來說,應(yīng)用程序可以直接訪問硬件存儲怀樟,操作系統(tǒng)內(nèi)核只是輔助數(shù)據(jù)傳輸:這類零拷貝技術(shù)針對的是操作系統(tǒng)內(nèi)核并不需要對數(shù)據(jù)進(jìn)行直接處理的情況功偿,數(shù)據(jù)可以在應(yīng)用程序地址空間的緩沖區(qū)和磁盤之間直接進(jìn)行傳輸,完全不需要 Linux 操作系統(tǒng)內(nèi)核提供的頁緩存的支持往堡。

在數(shù)據(jù)傳輸?shù)倪^程中械荷,避免數(shù)據(jù)在操作系統(tǒng)內(nèi)核地址空間的緩沖區(qū)和用戶應(yīng)用程序地址空間的緩沖區(qū)之間進(jìn)行拷貝。有的時候投蝉,應(yīng)用程序在數(shù)據(jù)進(jìn)行傳輸?shù)倪^程中不需要對數(shù)據(jù)進(jìn)行訪問养葵,那么,將數(shù)據(jù)從 Linux 的頁緩存拷貝到用戶進(jìn)程的緩沖區(qū)中就可以完全避免瘩缆,傳輸?shù)臄?shù)據(jù)在頁緩存中就可以得到處理关拒。在某些特殊的情況下,這種零拷貝技術(shù)可以獲得較好的性能庸娱。Linux 中提供類似的系統(tǒng)調(diào)用主要有 mmap()着绊,sendfile() 以及 splice()。

對數(shù)據(jù)在 Linux 的頁緩存和用戶進(jìn)程的緩沖區(qū)之間的傳輸過程進(jìn)行優(yōu)化熟尉。該零拷貝技術(shù)側(cè)重于靈活地處理數(shù)據(jù)在用戶進(jìn)程的緩沖區(qū)和操作系統(tǒng)的頁緩存之間的拷貝操作归露。這種方法延續(xù)了傳統(tǒng)的通信方式,但是更加靈活斤儿。在Linux中剧包,該方法主要利用了寫時復(fù)制技術(shù)恐锦。

前兩類方法的目的主要是為了避免應(yīng)用程序地址空間和操作系統(tǒng)內(nèi)核地址空間這兩者之間的緩沖區(qū)拷貝操作。這兩類零拷貝技術(shù)通常適用在某些特殊的情況下疆液,比如要傳送的數(shù)據(jù)不需要經(jīng)過操作系統(tǒng)內(nèi)核的處理或者不需要經(jīng)過應(yīng)用程序的處理一铅。第三類方法則繼承了傳統(tǒng)的應(yīng)用程序地址空間和操作系統(tǒng)內(nèi)核地址空間之間數(shù)據(jù)傳輸?shù)母拍睿M(jìn)而針對數(shù)據(jù)傳輸本身進(jìn)行優(yōu)化堕油。我們知道潘飘,硬件和軟件之間的數(shù)據(jù)傳輸可以通過使用 DMA 來進(jìn)行,DMA ?進(jìn)行數(shù)據(jù)傳輸?shù)倪^程中幾乎不需要? CPU ?參與掉缺,這樣就可以把 CPU 解放出來去做更多其他的事情卜录,但是當(dāng)數(shù)據(jù)需要在用戶地址空間的緩沖區(qū)和? Linux ?操作系統(tǒng)內(nèi)核的頁緩存之間進(jìn)行傳輸?shù)臅r候,并沒有類似? DMA ?這種工具可以使用眶明,CPU ?需要全程參與到這種數(shù)據(jù)拷貝操作中艰毒,所以這第三類方法的目的是可以有效地改善數(shù)據(jù)在用戶地址空間和操作系統(tǒng)內(nèi)核地址空間之間傳遞的效率。

在此我向大家推薦一個架構(gòu)學(xué)習(xí)交流群搜囱。交流學(xué)習(xí)群號:938837867 暗號:555 里面會分享一些資深架構(gòu)師錄制的視頻錄像:有Spring现喳,MyBatis,Netty源碼分析犬辰,高并發(fā)嗦篱、高性能、分布式幌缝、微服務(wù)架構(gòu)的原理灸促,JVM性能優(yōu)化、分布式架構(gòu)等這些成為架構(gòu)師必備

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涵卵,一起剝皮案震驚了整個濱河市浴栽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌轿偎,老刑警劉巖典鸡,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異坏晦,居然都是意外死亡萝玷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門昆婿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來球碉,“玉大人,你說我怎么就攤上這事仓蛆≌龆” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵看疙,是天一觀的道長豆拨。 經(jīng)常有香客問我直奋,道長,這世上最難降的妖魔是什么施禾? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任帮碰,我火速辦了婚禮,結(jié)果婚禮上拾积,老公的妹妹穿的比我還像新娘。我一直安慰自己丰涉,他們只是感情好拓巧,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著一死,像睡著了一般肛度。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上投慈,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天承耿,我揣著相機(jī)與錄音,去河邊找鬼伪煤。 笑死加袋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抱既。 我是一名探鬼主播职烧,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼防泵!你這毒婦竟也來了蚀之?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捷泞,失蹤者是張志新(化名)和其女友劉穎足删,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锁右,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡失受,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了咏瑟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贱纠。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖响蕴,靈堂內(nèi)的尸體忽然破棺而出谆焊,到底是詐尸還是另有隱情,我是刑警寧澤浦夷,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布辖试,位于F島的核電站辜王,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏罐孝。R本人自食惡果不足惜呐馆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望莲兢。 院中可真熱鬧汹来,春花似錦、人聲如沸改艇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谒兄。三九已至摔桦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間承疲,已是汗流浹背邻耕。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留燕鸽,地道東北人兄世。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像啊研,于是被迫代替她去往敵國和親碘饼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容