進(jìn)程阴汇、線程数冬、協(xié)程之間的演變

1.進(jìn)程

1.1定義

進(jìn)程是計(jì)算機(jī)中一個(gè)正在執(zhí)行的程序?qū)嵗臁_M(jìn)程是操作系統(tǒng)中最基本的執(zhí)行單元,它擁有自己的程序代碼秸架、數(shù)據(jù)集合和執(zhí)行狀態(tài)揍庄,并由操作系統(tǒng)管理和調(diào)度。

1.2內(nèi)容

進(jìn)程通常由程序东抹、數(shù)據(jù)集合和進(jìn)程控制塊三部分組成蚂子。

  1. 程序,是進(jìn)程的代碼部分缭黔,它是計(jì)算機(jī)程序的執(zhí)行體現(xiàn)食茎。程序通常由指令和數(shù)據(jù)組成,它們被存儲(chǔ)在進(jìn)程的內(nèi)存空間中馏谨,并由 CPU 執(zhí)行别渔。

  2. 數(shù)據(jù)集合包括進(jìn)程所需的所有數(shù)據(jù),例如變量田巴、數(shù)組钠糊、對(duì)象等。數(shù)據(jù)集合通常也被存儲(chǔ)在進(jìn)程的內(nèi)存空間中壹哺,它們可以被程序訪問(wèn)和修改抄伍。

  3. 進(jìn)程控制塊(Process Control Block,PCB)是操作系統(tǒng)用來(lái)管理進(jìn)程的數(shù)據(jù)結(jié)構(gòu)管宵。它包含了進(jìn)程的狀態(tài)截珍、進(jìn)程標(biāo)識(shí)符、程序計(jì)數(shù)器箩朴、內(nèi)存管理信息岗喉、進(jìn)程優(yōu)先級(jí)等信息。操作系統(tǒng)可以使用進(jìn)程控制塊來(lái)管理和調(diào)度進(jìn)程炸庞,例如創(chuàng)建和終止進(jìn)程钱床、切換進(jìn)程的執(zhí)行等。

1.3特征

輔助記憶

  • 進(jìn)程開(kāi)始前:動(dòng)態(tài)性(可動(dòng)態(tài)創(chuàng)建埠居、調(diào)度和終止)查牌、獨(dú)立性(擁有獨(dú)立的內(nèi)存空間、資源和當(dāng)前執(zhí)行狀態(tài))滥壕、共享性(進(jìn)程運(yùn)行與操作系統(tǒng)中纸颜,因此文件、消息隊(duì)列绎橘、信號(hào)量等用于對(duì)進(jìn)程控制胁孙,且具備共享屬性)
  • 進(jìn)程開(kāi)始中:并發(fā)性(可以多個(gè)進(jìn)程并發(fā)運(yùn)行,承托于cpu)、異步性(由于可并發(fā)涮较,所以對(duì)于CPU稠鼻、公共內(nèi)存、I/O等是互相爭(zhēng)奪的)
  1. 動(dòng)態(tài)性:進(jìn)程是一個(gè)動(dòng)態(tài)的概念狂票,它代表了一個(gè)正在執(zhí)行的程序?qū)嵗喜停梢詣?chuàng)建、調(diào)度和終止苫亦。在操作系統(tǒng)中,進(jìn)程的創(chuàng)建和銷毀是動(dòng)態(tài)進(jìn)行的怨咪。

  2. 并發(fā)性:在操作系統(tǒng)中屋剑,可以同時(shí)存在多個(gè)進(jìn)程在執(zhí)行,它們之間是并發(fā)執(zhí)行的诗眨。操作系統(tǒng)可以通過(guò)進(jìn)程調(diào)度算法來(lái)協(xié)調(diào)多個(gè)進(jìn)程之間的執(zhí)行唉匾,從而實(shí)現(xiàn)對(duì)系統(tǒng)資源的高效利用。

  3. 獨(dú)立性:進(jìn)程是操作系統(tǒng)中的獨(dú)立執(zhí)行單元匠楚,每個(gè)進(jìn)程都有自己獨(dú)立的內(nèi)存空間巍膘、資源和執(zhí)行狀態(tài),不會(huì)受到其他進(jìn)程的影響芋簿。

  4. 異步性:不同進(jìn)程之間的執(zhí)行速度是不同的峡懈,它們可以相互競(jìng)爭(zhēng)系統(tǒng)資源,例如 CPU与斤、內(nèi)存肪康、I/O 設(shè)備等。進(jìn)程之間的執(zhí)行順序是不可預(yù)測(cè)的撩穿,需要通過(guò)操作系統(tǒng)的調(diào)度算法進(jìn)行管理磷支。

  5. 共享性:進(jìn)程之間可以共享系統(tǒng)資源,例如文件食寡、消息隊(duì)列雾狈、信號(hào)量等。操作系統(tǒng)提供了各種機(jī)制來(lái)協(xié)調(diào)進(jìn)程之間的資源共享抵皱,從而實(shí)現(xiàn)對(duì)系統(tǒng)資源的高效利用善榛。

1.4梳理

image.png

2.線程

2.1定義

線程是操作系統(tǒng)中能夠被調(diào)度的最小執(zhí)行單元。一個(gè)進(jìn)程可以包含多個(gè)線程叨叙,每個(gè)線程都是獨(dú)立的執(zhí)行流程锭弊,擁有自己的程序計(jì)數(shù)器、棧和局部變量等線程上下文信息擂错,但共享進(jìn)程的代碼味滞、數(shù)據(jù)和全局變量等資源。

2.2由來(lái)

任務(wù)調(diào)度:任務(wù)調(diào)度是操作系統(tǒng)中的一種機(jī)制,它用于協(xié)調(diào)和管理系統(tǒng)中的各種任務(wù)或進(jìn)程的執(zhí)行順序和優(yōu)先級(jí)剑鞍。任務(wù)調(diào)度器會(huì)根據(jù)一定的策略昨凡,將CPU時(shí)間片分配給需要執(zhí)行的任務(wù)或進(jìn)程,以實(shí)現(xiàn)高效的系統(tǒng)資源利用和響應(yīng)性能蚁署。

在任務(wù)調(diào)度的過(guò)程中便脊,操作系統(tǒng)會(huì)根據(jù)不同的調(diào)度算法來(lái)確定任務(wù)的執(zhí)行順序和優(yōu)先級(jí)。常見(jiàn)的調(diào)度算法包括先來(lái)先服務(wù)(FCFS)光戈、最短作業(yè)優(yōu)先(SJF)哪痰、優(yōu)先級(jí)調(diào)度、時(shí)間片輪轉(zhuǎn)等久妆。

在早期的操作系統(tǒng)中并沒(méi)有線程的概念晌杰,進(jìn)程是能擁有資源和獨(dú)立運(yùn)行的最小單位,也是程序執(zhí)行的最小單位筷弦。任務(wù)調(diào)度采用的是時(shí)間片輪轉(zhuǎn)的搶占式調(diào)度方式肋演,而進(jìn)程是任務(wù)調(diào)度的最小單位,每個(gè)進(jìn)程有各自獨(dú)立的一塊內(nèi)存烂琴,使得各個(gè)進(jìn)程之間內(nèi)存地址相互隔離爹殊。后來(lái),隨著計(jì)算機(jī)的發(fā)展奸绷,對(duì)CPU的要求越來(lái)越高梗夸,進(jìn)程之間的切換開(kāi)銷較大,已經(jīng)無(wú)法滿足越來(lái)越復(fù)雜的程序的要求了健盒,于是就發(fā)明了線程绒瘦。

2.3內(nèi)容

線程通常由線程 ID、程序計(jì)數(shù)器扣癣、寄存器集合惰帽、棧和狀態(tài)等組成。

  1. 線程 ID:每個(gè)線程都有一個(gè)唯一的線程 ID父虑,用于區(qū)分不同的線程该酗。

  2. 程序計(jì)數(shù)器:程序計(jì)數(shù)器是一個(gè)指針,用于記錄當(dāng)前線程執(zhí)行的位置士嚎。當(dāng)線程被暫臀仄牵或切換時(shí),程序計(jì)數(shù)器的值會(huì)保存到線程控制塊中莱衩,以便下次恢復(fù)執(zhí)行爵嗅。

  3. 寄存器集合:線程也擁有自己的寄存器集合,用于保存線程的局部變量和其他狀態(tài)信息笨蚁。

  4. 棧:每個(gè)線程都有自己的棧睹晒,用于保存函數(shù)調(diào)用時(shí)的參數(shù)趟庄、返回地址和局部變量等信息。線程棧通常比進(jìn)程棧小得多伪很,因?yàn)榫€程不需要保存進(jìn)程的所有狀態(tài)信息戚啥。

  5. 狀態(tài):線程可以處于就緒、運(yùn)行锉试、等待或結(jié)束等不同的狀態(tài)猫十。就緒狀態(tài)表示線程可以立即執(zhí)行,等待狀態(tài)表示線程需要等待某些條件滿足才能執(zhí)行呆盖,運(yùn)行狀態(tài)表示線程正在執(zhí)行拖云,結(jié)束狀態(tài)表示線程已經(jīng)完成執(zhí)行。

java線程狀態(tài)圖:線程狀態(tài)圖-參考博客

線程狀態(tài)圖

2.3.1Java棧

Java棧是Java虛擬機(jī)中的一種重要數(shù)據(jù)結(jié)構(gòu)应又,用于存儲(chǔ)方法調(diào)用的信息江兢,包括局部變量、方法參數(shù)丁频、返回值等。每個(gè)線程在運(yùn)行時(shí)都會(huì)有一個(gè)對(duì)應(yīng)的Java棧邑贴。

Java棧中的每個(gè)元素稱為棧幀(Stack Frame)席里,用于保存方法調(diào)用的上下文信息。棧幀中包含了局部變量表拢驾、操作數(shù)棧奖磁、返回地址和異常處理表等信息。

棧的數(shù)據(jù)結(jié)構(gòu)

圖片來(lái)源

2.3.2幀棧

寄存器的使用

在x86架構(gòu)的CPU中繁疤,棧通常從高地址向低地址增長(zhǎng)咖为。通用寄存器(General Purpose Registers):包括eax、ebx稠腊、ecx躁染、edx、esi架忌、edi吞彤、ebp、esp等8個(gè)寄存器叹放。

  1. ebp寄存器(Extended Base Pointer Register):通常用于指向當(dāng)前棧幀的基地址(Base Address)

  2. esp寄存器(Extended Stack Pointer Register):通常用于指向棧頂指針

  3. ebx寄存器(Extended Base Register):通常用作指針饰恕,保存內(nèi)存地址,也用于存儲(chǔ)函數(shù)調(diào)用的返回值井仰。

  4. edi寄存器(Destination Index Register):通常用于存儲(chǔ)目標(biāo)地址埋嵌,例如字符串復(fù)制等操作。

  5. esi寄存器(Source Index Register):通常用于存儲(chǔ)源地址俱恶,例如字符串比較等操作雹嗦。

操作流程:

調(diào)用方法時(shí)范舀,會(huì)將當(dāng)前棧幀壓入虛擬機(jī)棧中,然后創(chuàng)建新的棧幀俐银,并將ebp和esp寄存器設(shè)置為新棧幀的基地址和棧頂指針尿背。

返回方法時(shí),會(huì)彈出當(dāng)前棧幀捶惜,并將ebp和esp寄存器恢復(fù)為上一個(gè)棧幀的基地址和棧頂指針田藐。

參考博客

int main()
{
    int a = 10;
    int b = 20;
    int c = 0;
    c = max(a, b);
    printf( "%d\n", c);
    system( "pause");
    return 0;
}
int max(int x, int y)
{
    int z = 0;
    if (x > y)
        z = x;
    else
        z = y;
    return z;
}

執(zhí)行順序:

1.esp和ebp分別先指向main()的棧幀基地址和棧頂

2.從棧底向棧頂方向壓入,分別是參數(shù)吱七、返回地址汽久、main的返回地址、main的ebp基地址

3.最后棧頂會(huì)分別壓入ebx踊餐、esi景醇、edi寄存器


棧幀中包含了局部變量表、操作數(shù)棧吝岭、返回地址和異常處理表等信息三痰。

棧幀內(nèi)容

棧幀中包含了局部變量表、操作數(shù)棧窜管、返回地址和異常處理表等信息散劫。

  1. 局部變量表:用于存儲(chǔ)方法中定義的局部變量,包括基本數(shù)據(jù)類型和對(duì)象引用等幕帆,以索引的方式訪問(wèn)获搏,從0開(kāi)始。

  2. 操作數(shù)棧:用于存儲(chǔ)操作數(shù)和返回值失乾,通常使用先進(jìn)先出(FIFO)的方式進(jìn)行操作常熙。

  3. 返回地址:用于保存方法調(diào)用完成后返回的地址,以便程序跳轉(zhuǎn)回原來(lái)的調(diào)用點(diǎn)繼續(xù)執(zhí)行碱茁。

  4. 異常處理表:用于保存方法執(zhí)行過(guò)程中可能拋出的異常處理信息裸卫,以便在發(fā)生異常時(shí)進(jìn)行處理。

操作數(shù)棧補(bǔ)充:

Java虛擬機(jī)規(guī)范中規(guī)定纽竣,每個(gè)操作數(shù)棧的最大深度不能超過(guò)255個(gè)棧單元彼城。如果超過(guò)了這個(gè)限制,將會(huì)拋出StackOverflowError異常退个。操作數(shù)棧的大小受到Java虛擬機(jī)內(nèi)存分配的限制募壕,如果內(nèi)存不足,也會(huì)拋出OutOfMemoryError異常语盈。

復(fù)現(xiàn)方式:無(wú)限遞歸回調(diào)

2.4梳理

3.協(xié)程

3.1定義

協(xié)程舱馅,英文Coroutines,是一種基于線程之上刀荒,比線程更加輕量級(jí)的存在代嗤,這種由程序員自己寫程序來(lái)管理的輕量級(jí)線程叫做『用戶空間線程』棘钞,具有對(duì)內(nèi)核來(lái)說(shuō)不可見(jiàn)的特性。

概念補(bǔ)充:

  • 內(nèi)核線程:由操作系統(tǒng)內(nèi)核創(chuàng)建和管理的一種線程干毅,即跟CPU的物理核數(shù)相關(guān)

  • 超線程技術(shù)(Hyper-Threading Technology):是一種基于硬件的多線程技術(shù)宜猜,將單個(gè)物理處理器中增加一個(gè)線程調(diào)度器和一組寄存器,用于存儲(chǔ)多個(gè)線程的上下文信息硝逢,以此實(shí)現(xiàn)并行執(zhí)行多個(gè)線程的效果姨拥。

3.2由來(lái)

多線程的缺點(diǎn)

  1. 復(fù)雜度增加:多線程編程需要考慮線程之間的同步、互斥渠鸽、協(xié)作等問(wèn)題叫乌,如鎖、信號(hào)量徽缚、條件變量等憨奸,增加了程序的復(fù)雜度和開(kāi)發(fā)難度。

  2. 死鎖和競(jìng)態(tài)條件:多線程之間共享內(nèi)存區(qū)域凿试,容易發(fā)生死鎖排宰、競(jìng)態(tài)條件等問(wèn)題,導(dǎo)致程序的不穩(wěn)定性和異常終止那婉。

  3. 資源消耗增加:每個(gè)線程都需要一定的系統(tǒng)資源额各,如內(nèi)存、文件句柄吧恃、網(wǎng)絡(luò)連接等,大量的線程會(huì)導(dǎo)致系統(tǒng)資源的耗盡和浪費(fèi)麻诀。

  4. 上下文切換開(kāi)銷:線程之間的切換需要進(jìn)行上下文的保存和恢復(fù)痕寓,會(huì)增加系統(tǒng)開(kāi)銷和延遲,影響程序的性能和響應(yīng)速度蝇闭。

協(xié)程的優(yōu)點(diǎn)

  1. 快速切換:相比線程呻率,協(xié)程沒(méi)有自己的調(diào)度器和上下文切換,協(xié)程通常采用生成器(Generator)或異步生成器(Async Generator)實(shí)現(xiàn)快速切換呻引。生成器是一種特殊的函數(shù)礼仗,可以通過(guò)yield關(guān)鍵字暫停函數(shù)的執(zhí)行,并返回一個(gè)中間結(jié)果逻悠,然后在需要的時(shí)候重新開(kāi)始執(zhí)行元践。異步生成器是一種特殊的生成器,可以在異步環(huán)境下使用童谒,例如在事件循環(huán)中實(shí)現(xiàn)異步操作单旁。

  2. 開(kāi)銷輕量:線程的默認(rèn)Stack大小是1M,而協(xié)程接近1K饥伊,因此可減少多線程的系統(tǒng)資源開(kāi)銷象浑。

  3. 低復(fù)雜度:線程的復(fù)雜度訪問(wèn)共有內(nèi)存數(shù)據(jù)時(shí)蔫饰,需要考慮鎖、信號(hào)量愉豺、條件變量等篓吁,由此衍生出死鎖和各種競(jìng)爭(zhēng)狀態(tài),協(xié)程由于生成器是一種特殊的等待函數(shù)蚪拦,可實(shí)現(xiàn)同步返回和恢復(fù)執(zhí)行杖剪,且異步生成器則是異步返回和恢復(fù)執(zhí)行,由此解決多線程網(wǎng)絡(luò)通信外盯、I/O操作等的死鎖和競(jìng)爭(zhēng)問(wèn)題摘盆。

3.3原理

  • 生成器:一種同步的生成器,它通過(guò)yield關(guān)鍵字來(lái)逐步生成數(shù)據(jù)饱苟。在生成器函數(shù)中孩擂,當(dāng)執(zhí)行到y(tǒng)ield語(yǔ)句時(shí),生成器會(huì)將當(dāng)前狀態(tài)保存下來(lái)箱熬,并將yield語(yǔ)句后面的值返回給調(diào)用方类垦。當(dāng)調(diào)用方需要獲取下一個(gè)元素時(shí),生成器會(huì)恢復(fù)之前保存的狀態(tài)城须,并從上一次的yield語(yǔ)句處繼續(xù)執(zhí)行蚤认,生成下一個(gè)元素。生成器的應(yīng)用場(chǎng)景主要是處理大量數(shù)據(jù)的場(chǎng)景糕伐,例如數(shù)據(jù)分頁(yè)砰琢、數(shù)據(jù)轉(zhuǎn)換等。

  • 異步生成器:異步生成器是基于異步迭代器(Async Iterator)實(shí)現(xiàn)的良瞧,可以處理異步的數(shù)據(jù)源陪汽。當(dāng)異步生成器需要生成下一個(gè)元素時(shí),它會(huì)暫停當(dāng)前的協(xié)程執(zhí)行褥蚯,等待異步數(shù)據(jù)源返回?cái)?shù)據(jù)后再生成下一個(gè)元素挚冤。異步生成器的應(yīng)用場(chǎng)景主要是處理異步數(shù)據(jù)源、網(wǎng)絡(luò)通信等場(chǎng)景赞庶。

協(xié)程最重要的特點(diǎn)是支持掛起和恢復(fù)操作训挡。在協(xié)程中,可以通過(guò)掛起函數(shù)將協(xié)程掛起歧强,并將協(xié)程的狀態(tài)保存下來(lái)澜薄,以便后續(xù)恢復(fù)執(zhí)行。協(xié)程的掛起和恢復(fù)是由程序員手動(dòng)控制的摊册,因此可以更靈活地控制程序的執(zhí)行順序和并發(fā)度表悬。

3.4梳理


博客參考:

https://www.cnblogs.com/Survivalist/p/11527949.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市丧靡,隨后出現(xiàn)的幾起案子蟆沫,更是在濱河造成了極大的恐慌籽暇,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饭庞,死亡現(xiàn)場(chǎng)離奇詭異戒悠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)舟山,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門绸狐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人累盗,你說(shuō)我怎么就攤上這事寒矿。” “怎么了若债?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵符相,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蠢琳,道長(zhǎng)啊终,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任傲须,我火速辦了婚禮蓝牲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泰讽。我一直安慰自己例衍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布已卸。 她就那樣靜靜地躺著佛玄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咬最。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天欠动,我揣著相機(jī)與錄音永乌,去河邊找鬼。 笑死具伍,一個(gè)胖子當(dāng)著我的面吹牛翅雏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播人芽,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼望几,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了萤厅?” 一聲冷哼從身側(cè)響起橄抹,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤靴迫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后楼誓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體玉锌,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年疟羹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了主守。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡榄融,死狀恐怖参淫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情愧杯,我是刑警寧澤涎才,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站民效,受9級(jí)特大地震影響憔维,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜畏邢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一业扒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舒萎,春花似錦程储、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至咆贬,卻和暖如春败徊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掏缎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工皱蹦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人眷蜈。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓沪哺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親酌儒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辜妓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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