(轉(zhuǎn))從內(nèi)核文件系統(tǒng)看文件讀寫過程

閱讀目錄
系統(tǒng)調(diào)用
虛擬文件系統(tǒng)
I/O 緩沖區(qū)
Page Cache
Address Space
文件讀寫基本流程

回到頂部
系統(tǒng)調(diào)用
操作系統(tǒng)的主要功能是為管理硬件資源和為應(yīng)用程序開發(fā)人員提供良好的環(huán)境,但是計(jì)算機(jī)系統(tǒng)的各種硬件資源是有限的蓝翰,因此為了保證每一個(gè)進(jìn)程都能安全的執(zhí)行剃斧。處理器設(shè)有兩種模式:“用戶模式”與“內(nèi)核模式”娜扇。一些容易發(fā)生安全問題的操作都被限制在只有內(nèi)核模式下才可以執(zhí)行,例如I/O操作炼幔,修改基址寄存器內(nèi)容等。而連接用戶模式和內(nèi)核模式的接口稱之為系統(tǒng)調(diào)用。
應(yīng)用程序代碼運(yùn)行在用戶模式下卷胯,當(dāng)應(yīng)用程序需要實(shí)現(xiàn)內(nèi)核模式下的指令時(shí),先向操作系統(tǒng)發(fā)送調(diào)用請(qǐng)求威酒。操作系統(tǒng)收到請(qǐng)求后窑睁,執(zhí)行系統(tǒng)調(diào)用接口,使處理器進(jìn)入內(nèi)核模式兼搏。當(dāng)處理器處理完系統(tǒng)調(diào)用操作后卵慰,操作系統(tǒng)會(huì)讓處理器返回用戶模式,繼續(xù)執(zhí)行用戶代碼佛呻。
進(jìn)程的虛擬地址空間可分為兩部分裳朋,內(nèi)核空間和用戶空間。內(nèi)核空間中存放的是內(nèi)核代碼和數(shù)據(jù),而進(jìn)程的用戶空間中存放的是用戶程序的代碼和數(shù)據(jù)鲤嫡。不管是內(nèi)核空間還是用戶空間送挑,它們都處于虛擬空間中,都是對(duì)物理地址的映射暖眼。
應(yīng)用程序中實(shí)現(xiàn)對(duì)文件的操作過程就是典型的系統(tǒng)調(diào)用過程惕耕。

回到頂部
虛擬文件系統(tǒng)
一個(gè)操作系統(tǒng)可以支持多種底層不同的文件系統(tǒng)(比如NTFS, FAT, ext3, ext4),為了給內(nèi)核和用戶進(jìn)程提供統(tǒng)一的文件系統(tǒng)視圖诫肠,Linux在用戶進(jìn)程和底層文件系統(tǒng)之間加入了一個(gè)抽象層司澎,即虛擬文件系統(tǒng)(Virtual File System, VFS),進(jìn)程所有的文件操作都通過VFS栋豫,由VFS來適配各種底層不同的文件系統(tǒng)挤安,完成實(shí)際的文件操作。
通俗的說丧鸯,VFS就是定義了一個(gè)通用文件系統(tǒng)的接口層和適配層蛤铜,一方面為用戶進(jìn)程提供了一組統(tǒng)一的訪問文件,目錄和其他對(duì)象的統(tǒng)一方法丛肢,另一方面又要和不同的底層文件系統(tǒng)進(jìn)行適配围肥。如圖所示:

虛擬文件系統(tǒng)主要模塊
1、超級(jí)塊(super_block)蜂怎,用于保存一個(gè)文件系統(tǒng)的所有元數(shù)據(jù)穆刻,相當(dāng)于這個(gè)文件系統(tǒng)的信息庫,為其他的模塊提供信息派敷。因此一個(gè)超級(jí)塊可代表一個(gè)文件系統(tǒng)蛹批。文件系統(tǒng)的任意元數(shù)據(jù)修改都要修改超級(jí)塊。超級(jí)塊對(duì)象是常駐內(nèi)存并被緩存的篮愉。
2腐芍、目錄項(xiàng)模塊,管理路徑的目錄項(xiàng)试躏。比如一個(gè)路徑 /home/foo/hello.txt猪勇,那么目錄項(xiàng)有home, foo, hello.txt。目錄項(xiàng)的塊颠蕴,存儲(chǔ)的是這個(gè)目錄下的所有的文件的inode號(hào)和文件名等信息泣刹。其內(nèi)部是樹形結(jié)構(gòu),操作系統(tǒng)檢索一個(gè)文件犀被,都是從根目錄開始椅您,按層次解析路徑中的所有目錄,直到定位到文件寡键。
3掀泳、inode模塊,管理一個(gè)具體的文件,是文件的唯一標(biāo)識(shí)员舵,一個(gè)文件對(duì)應(yīng)一個(gè)inode脑沿。通過inode可以方便的找到文件在磁盤扇區(qū)的位置。同時(shí)inode模塊可鏈接到address_space模塊马僻,方便查找自身文件數(shù)據(jù)是否已經(jīng)緩存庄拇。
4、打開文件列表模塊韭邓,包含所有內(nèi)核已經(jīng)打開的文件措近。已經(jīng)打開的文件對(duì)象由open系統(tǒng)調(diào)用在內(nèi)核中創(chuàng)建,也叫文件句柄仍秤。打開文件列表模塊中包含一個(gè)列表熄诡,每個(gè)列表表項(xiàng)是一個(gè)結(jié)構(gòu)體struct file,結(jié)構(gòu)體中的信息用來表示打開的一個(gè)文件的各種狀態(tài)參數(shù)诗力。
5、file_operations模塊我抠。這個(gè)模塊中維護(hù)一個(gè)數(shù)據(jù)結(jié)構(gòu)苇本,是一系列函數(shù)指針的集合,其中包含所有可以使用的系統(tǒng)調(diào)用函數(shù)菜拓,例如open瓣窄、read、write纳鼎、mmap等俺夕。每個(gè)打開文件(打開文件列表模塊的一個(gè)表項(xiàng))都可以連接到file_operations模塊,從而對(duì)任何已打開的文件贱鄙,通過系統(tǒng)調(diào)用函數(shù)劝贸,實(shí)現(xiàn)各種操作。
6逗宁、address_space模塊映九,它表示一個(gè)文件在頁緩存中已經(jīng)緩存了的物理頁。它是頁緩存和外部設(shè)備中文件系統(tǒng)的橋梁瞎颗。如果將文件系統(tǒng)可以理解成數(shù)據(jù)源件甥,那么address_space可以說關(guān)聯(lián)了內(nèi)存系統(tǒng)和文件系統(tǒng)。我們會(huì)在文章后面繼續(xù)討論哼拔。
模塊間的相互作用和邏輯關(guān)系如下圖所示:

由圖可以看出:
1引有、每個(gè)模塊都維護(hù)了一個(gè)X_op指針指向它所對(duì)應(yīng)的操作對(duì)象X_operations。
2倦逐、超級(jí)塊維護(hù)了一個(gè)s_files指針指向了“已打開文件列表模塊”譬正,即內(nèi)核所有的打開文件的鏈表,這個(gè)鏈表信息是所有進(jìn)程共享的。
3导帝、目錄操作模塊和inode模塊都維護(hù)了一個(gè)X_sb指針指向超級(jí)塊守谓,從而可以獲得整個(gè)文件系統(tǒng)的元數(shù)據(jù)信息。
4您单、 目錄項(xiàng)對(duì)象和inode對(duì)象各自維護(hù)了指向?qū)Ψ降闹羔樥瘢梢哉业綄?duì)方的數(shù)據(jù)。
5虐秦、已打開文件列表上每一個(gè)file結(jié)構(gòu)體實(shí)例維護(hù)了一個(gè)f_dentry指針平酿,指向了它對(duì)應(yīng)的目錄項(xiàng),從而可以根據(jù)目錄項(xiàng)找到它對(duì)應(yīng)的inode信息悦陋。
6蜈彼、已打開文件列表上每一個(gè)file結(jié)構(gòu)體實(shí)例維護(hù)了一個(gè)f_op指針,指向可以對(duì)這個(gè)文件進(jìn)行操作的所有函數(shù)集合file_operations俺驶。
7幸逆、inode中不僅有和其他模塊關(guān)聯(lián)的指針,重要的是它可以指向address_space模塊暮现,從而獲得自身文件在內(nèi)存中的緩存信息还绘。
8、address_space內(nèi)部維護(hù)了一個(gè)樹結(jié)構(gòu)來指向所有的物理頁結(jié)構(gòu)page栖袋,同時(shí)維護(hù)了一個(gè)host指針指向inode來獲得文件的元數(shù)據(jù)拍顷。
進(jìn)程和虛擬文件系統(tǒng)交互
1、內(nèi)核使用task_struct來表示單個(gè)進(jìn)程的描述符塘幅,其中包含維護(hù)一個(gè)進(jìn)程的所有信息昔案。task_struct結(jié)構(gòu)體中維護(hù)了一個(gè) files的指針(和“已打開文件列表”上的表項(xiàng)是不同的指針)來指向結(jié)構(gòu)體files_struct,files_struct中包含文件描述符表和打開的文件對(duì)象信息电媳。
2踏揣、file_struct中的文件描述符表實(shí)際是一個(gè)file類型的指針列表(和“已打開文件列表”上的表項(xiàng)是相同的指針),可以支持動(dòng)態(tài)擴(kuò)展匆背,每一個(gè)指針指向虛擬文件系統(tǒng)中文件列表模塊的某一個(gè)已打開的文件呼伸。

3、file結(jié)構(gòu)一方面可從f_dentry鏈接到目錄項(xiàng)模塊以及inode模塊钝尸,獲取所有和文件相關(guān)的信息括享,另一方面鏈接file_operations子模塊,其中包含所有可以使用的系統(tǒng)調(diào)用函數(shù)珍促,從而最終完成對(duì)文件的操作铃辖。這樣,從進(jìn)程到進(jìn)程的文件描述符表猪叙,再關(guān)聯(lián)到已打開文件列表上對(duì)應(yīng)的文件結(jié)構(gòu)娇斩,從而調(diào)用其可執(zhí)行的系統(tǒng)調(diào)用函數(shù)仁卷,實(shí)現(xiàn)對(duì)文件的各種操作。
進(jìn)程 vs 文件列表 vs Inode
1犬第、多個(gè)進(jìn)程可以同時(shí)指向一個(gè)打開文件對(duì)象(文件列表表項(xiàng))锦积,例如父進(jìn)程和子進(jìn)程間共享文件對(duì)象;
2歉嗓、一個(gè)進(jìn)程可以多次打開一個(gè)文件丰介,生成不同的文件描述符,每個(gè)文件描述符指向不同的文件列表表項(xiàng)鉴分。但是由于是同一個(gè)文件哮幢,inode唯一,所以這些文件列表表項(xiàng)都指向同一個(gè)inode志珍。通過這樣的方法實(shí)現(xiàn)文件共享(共享同一個(gè)磁盤文件)橙垢;

回到頂部
I/O 緩沖區(qū)
概念
如高速緩存(cache)產(chǎn)生的原理類似,在I/O過程中伦糯,讀取磁盤的速度相對(duì)內(nèi)存讀取速度要慢的多柜某。因此為了能夠加快處理數(shù)據(jù)的速度,需要將讀取過的數(shù)據(jù)緩存在內(nèi)存里舔株。而這些緩存在內(nèi)存里的數(shù)據(jù)就是高速緩沖區(qū)(buffer cache)莺琳,下面簡(jiǎn)稱為“buffer”。
具體來說载慈,buffer(緩沖區(qū))是一個(gè)用于存儲(chǔ)速度不同步的設(shè)備或優(yōu)先級(jí)不同的設(shè)備之間傳輸數(shù)據(jù)的區(qū)域。一方面珍手,通過緩沖區(qū)办铡,可以使進(jìn)程之間的相互等待變少,從而使從速度慢的設(shè)備讀入數(shù)據(jù)時(shí)琳要,速度快的設(shè)備的操作進(jìn)程不發(fā)生間斷寡具。另一方面,可以保護(hù)硬盤或減少網(wǎng)絡(luò)傳輸?shù)拇螖?shù)稚补。
Buffer和Cache
buffer和cache是兩個(gè)不同的概念:cache是高速緩存童叠,用于CPU和內(nèi)存之間的緩沖;buffer是I/O緩存课幕,用于內(nèi)存和硬盤的緩沖厦坛;簡(jiǎn)單的說,cache是加速“讀”乍惊,而buffer是緩沖“寫”杜秸,前者解決讀的問題,保存從磁盤上讀出的數(shù)據(jù)润绎,后者是解決寫的問題撬碟,保存即將要寫入到磁盤上的數(shù)據(jù)诞挨。
Buffer Cache和 Page Cache
buffer cache和page cache都是為了處理設(shè)備和內(nèi)存交互時(shí)高速訪問的問題。buffer cache可稱為塊緩沖器呢蛤,page cache可稱為頁緩沖器惶傻。在linux不支持虛擬內(nèi)存機(jī)制之前,還沒有頁的概念其障,因此緩沖區(qū)以塊為單位對(duì)設(shè)備進(jìn)行银室。在linux采用虛擬內(nèi)存的機(jī)制來管理內(nèi)存后,頁是虛擬內(nèi)存管理的最小單位静秆,開始采用頁緩沖的機(jī)制來緩沖內(nèi)存粮揉。Linux2.6之后內(nèi)核將這兩個(gè)緩存整合,頁和塊可以相互映射抚笔,同時(shí)扶认,頁緩存page cache面向的是虛擬內(nèi)存,塊I/O緩存Buffer cache是面向塊設(shè)備殊橙。需要強(qiáng)調(diào)的是辐宾,頁緩存和塊緩存對(duì)進(jìn)程來說就是一個(gè)存儲(chǔ)系統(tǒng),進(jìn)程不需要關(guān)注底層的設(shè)備的讀寫膨蛮。
buffer cache和page cache兩者最大的區(qū)別是緩存的粒度叠纹。buffer cache面向的是文件系統(tǒng)的塊。而內(nèi)核的內(nèi)存管理組件采用了比文件系統(tǒng)的塊更高級(jí)別的抽象:頁page敞葛,其處理的性能更高誉察。因此和內(nèi)存管理交互的緩存組件,都使用頁緩存惹谐。

回到頂部
Page Cache
頁緩存是面向文件持偏,面向內(nèi)存的。通俗來說氨肌,它位于內(nèi)存和文件之間緩沖區(qū)鸿秆,文件IO操作實(shí)際上只和page cache交互,不直接和內(nèi)存交互怎囚。page cache可以用在所有以文件為單元的場(chǎng)景下卿叽,比如網(wǎng)絡(luò)文件系統(tǒng)等等。page cache通過一系列的數(shù)據(jù)結(jié)構(gòu)恳守,比如inode, address_space, struct page考婴,實(shí)現(xiàn)將一個(gè)文件映射到頁的級(jí)別:
1、struct page結(jié)構(gòu)標(biāo)志一個(gè)物理內(nèi)存頁井誉,通過page + offset就可以將此頁幀定位到一個(gè)文件中的具體位置蕉扮。同時(shí)struct page還有以下重要參數(shù):
(1)標(biāo)志位flags來記錄該頁是否是臟頁,是否正在被寫回等等颗圣;
(2)mapping指向了地址空間address_space喳钟,表示這個(gè)頁是一個(gè)頁緩存中頁屁使,和一個(gè)文件的地址空間對(duì)應(yīng);
(3)index記錄這個(gè)頁在文件中的頁偏移量奔则;
2蛮寂、文件系統(tǒng)的inode實(shí)際維護(hù)了這個(gè)文件所有的塊block的塊號(hào),通過對(duì)文件偏移量offset取囊撞纾可以很快定位到這個(gè)偏移量所在的文件系統(tǒng)的塊號(hào)酬蹋,磁盤的扇區(qū)號(hào)。同樣抽莱,通過對(duì)文件偏移量offset進(jìn)行取姆蹲ィ可以計(jì)算出偏移量所在的頁的偏移量。
3食铐、page cache緩存組件抽象了地址空間address_space這個(gè)概念來作為文件系統(tǒng)和頁緩存的中間橋梁匕垫。地址空間address_space通過指針可以方便的獲取文件inode和struct page的信息,所以可以很方便地定位到一個(gè)文件的offset在各個(gè)組件中的位置虐呻,即通過:文件字節(jié)偏移量 --> 頁偏移量 --> 文件系統(tǒng)塊號(hào) block --> 磁盤扇區(qū)號(hào)
4象泵、頁緩存實(shí)際上就是采用了一個(gè)基數(shù)樹結(jié)構(gòu)將一個(gè)文件的內(nèi)容組織起來存放在物理內(nèi)存struct page中。一個(gè)文件inode對(duì)應(yīng)一個(gè)地址空間address_space斟叼。而一個(gè)address_space對(duì)應(yīng)一個(gè)頁緩存基數(shù)樹偶惠。它們之間的關(guān)系如下:

回到頂部
Address Space
下面我們總結(jié)已經(jīng)討論過的address_space所有功能。address_space是Linux內(nèi)核中的一個(gè)關(guān)鍵抽象朗涩,它被作為文件系統(tǒng)和頁緩存的中間適配器忽孽,用來指示一個(gè)文件在頁緩存中已經(jīng)緩存了的物理頁。因此谢床,它是頁緩存和外部設(shè)備中文件系統(tǒng)的橋梁扒腕。如果將文件系統(tǒng)可以理解成數(shù)據(jù)源,那么address_space可以說關(guān)聯(lián)了內(nèi)存系統(tǒng)和文件系統(tǒng)萤悴。
由圖中可以看到,地址空間address_space鏈接到頁緩存基數(shù)樹和inode皆的,因此address_space通過指針可以方便的獲取文件inode和page的信息覆履。那么頁緩存是如何通過address_space實(shí)現(xiàn)緩沖區(qū)功能的?我們?cè)賮砜赐暾奈募x寫流程费薄。

回到頂部
文件讀寫基本流程
讀文件
1硝全、進(jìn)程調(diào)用庫函數(shù)向內(nèi)核發(fā)起讀文件請(qǐng)求;
2楞抡、內(nèi)核通過檢查進(jìn)程的文件描述符定位到虛擬文件系統(tǒng)的已打開文件列表表項(xiàng)伟众;
3、調(diào)用該文件可用的系統(tǒng)調(diào)用函數(shù)read()
3召廷、read()函數(shù)通過文件表項(xiàng)鏈接到目錄項(xiàng)模塊凳厢,根據(jù)傳入的文件路徑账胧,在目錄項(xiàng)模塊中檢索,找到該文件的inode先紫;
4治泥、在inode中,通過文件內(nèi)容偏移量計(jì)算出要讀取的頁遮精;
5居夹、通過inode找到文件對(duì)應(yīng)的address_space;
6本冲、在address_space中訪問該文件的頁緩存樹准脂,查找對(duì)應(yīng)的頁緩存結(jié)點(diǎn):
(1)如果頁緩存命中,那么直接返回文件內(nèi)容檬洞;
(2)如果頁緩存缺失狸膏,那么產(chǎn)生一個(gè)頁缺失異常,創(chuàng)建一個(gè)頁緩存頁疮胖,同時(shí)通過inode找到文件該頁的磁盤地址环戈,讀取相應(yīng)的頁填充該緩存頁;重新進(jìn)行第6步查找頁緩存澎灸;
7院塞、文件內(nèi)容讀取成功。

寫文件
前5步和讀文件一致性昭,在address_space中查詢對(duì)應(yīng)頁的頁緩存是否存在:
6拦止、如果頁緩存命中,直接把文件內(nèi)容修改更新在頁緩存的頁中糜颠。寫文件就結(jié)束了汹族。這時(shí)候文件修改位于頁緩存,并沒有寫回到磁盤文件中去其兴。
7顶瞒、如果頁緩存缺失,那么產(chǎn)生一個(gè)頁缺失異常元旬,創(chuàng)建一個(gè)頁緩存頁榴徐,同時(shí)通過inode找到文件該頁的磁盤地址,讀取相應(yīng)的頁填充該緩存頁匀归。此時(shí)緩存頁命中坑资,進(jìn)行第6步。
8穆端、一個(gè)頁緩存中的頁如果被修改袱贮,那么會(huì)被標(biāo)記成臟頁。臟頁需要寫回到磁盤中的文件塊体啰。有兩種方式可以把臟頁寫回磁盤:
(1)手動(dòng)調(diào)用sync()或者fsync()系統(tǒng)調(diào)用把臟頁寫回
(2)pdflush進(jìn)程會(huì)定時(shí)把臟頁寫回到磁盤
同時(shí)注意攒巍,臟頁不能被置換出內(nèi)存嗽仪,如果臟頁正在被寫回,那么會(huì)被設(shè)置寫回標(biāo)記窑业,這時(shí)候該頁就被上鎖钦幔,其他寫請(qǐng)求被阻塞直到鎖釋放。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末常柄,一起剝皮案震驚了整個(gè)濱河市鲤氢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌西潘,老刑警劉巖卷玉,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異喷市,居然都是意外死亡相种,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門品姓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寝并,“玉大人,你說我怎么就攤上這事腹备〕牧剩” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵植酥,是天一觀的道長(zhǎng)镀岛。 經(jīng)常有香客問我,道長(zhǎng)友驮,這世上最難降的妖魔是什么漂羊? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮卸留,結(jié)果婚禮上走越,老公的妹妹穿的比我還像新娘。我一直安慰自己耻瑟,他們只是感情好买喧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著匆赃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪今缚。 梳的紋絲不亂的頭發(fā)上算柳,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音姓言,去河邊找鬼瞬项。 笑死蔗蹋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的囱淋。 我是一名探鬼主播猪杭,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼妥衣!你這毒婦竟也來了皂吮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤税手,失蹤者是張志新(化名)和其女友劉穎蜂筹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芦倒,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡艺挪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年赴邻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乍钻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涨椒,死狀恐怖器钟,靈堂內(nèi)的尸體忽然破棺而出津坑,到底是詐尸還是另有隱情,我是刑警寧澤俱箱,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布国瓮,位于F島的核電站,受9級(jí)特大地震影響狞谱,放射性物質(zhì)發(fā)生泄漏乃摹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一跟衅、第九天 我趴在偏房一處隱蔽的房頂上張望孵睬。 院中可真熱鬧,春花似錦伶跷、人聲如沸掰读。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹈集。三九已至,卻和暖如春雇初,著一層夾襖步出監(jiān)牢的瞬間拢肆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留郭怪,地道東北人支示。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鄙才,于是被迫代替她去往敵國(guó)和親颂鸿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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