計(jì)算機(jī)組成課程如何起到承上啟下的作用?

  1. 計(jì)算機(jī)組成原理課程在計(jì)算機(jī)系統(tǒng)中的位置

圖1描述了計(jì)算機(jī)系統(tǒng)抽象層的轉(zhuǎn)換。從圖1可以看出,計(jì)算機(jī)系統(tǒng)由不同的抽象層構(gòu)成,“計(jì)算”的過程就是不同抽象層轉(zhuǎn)換的過程,上層是下層的抽象,而下層則是上層的具體實(shí)現(xiàn)。


圖1 計(jì)算機(jī)系統(tǒng)抽象層的轉(zhuǎn)換

“計(jì)算機(jī)組成”課程涉及的內(nèi)容主要位于圖1中寄存器傳送層(RTL)以上的微結(jié)構(gòu)和ISA層次,介于軟件和底層硬件電路之間的交界面上,屬于整個(gè)計(jì)算機(jī)學(xué)科和計(jì)算機(jī)系統(tǒng)中最重要的基礎(chǔ)核心內(nèi)容。該課程是計(jì)算機(jī)專業(yè)最重要的專業(yè)基礎(chǔ)課之一,所涉及的內(nèi)容除了與數(shù)字邏輯電路、嵌入式系統(tǒng)等偏硬件類課程有直接關(guān)聯(lián)外,還與操作系統(tǒng)、編譯程序、高級(jí)語言程序設(shè)計(jì)等軟件方面的課程密切相關(guān)。因而,在整個(gè)計(jì)算機(jī)專業(yè)中,該課程起著重要的承上啟下的作用。

目前,國內(nèi)高校的課程設(shè)置通常是先開設(shè)一門“計(jì)算機(jī)系統(tǒng)概論”或“計(jì)算機(jī)科學(xué)導(dǎo)論”之類的入門課程,這些課程或者是內(nèi)容太散太多、沒有系統(tǒng)性(只是所有大學(xué)課程內(nèi)容的簡單羅列),或者是偏離計(jì)算機(jī)系統(tǒng)而側(cè)重于可計(jì)算理論方面的內(nèi)容,僅通過學(xué)習(xí)這類入門課程,學(xué)生還不能夠很好地建立起完整的計(jì)算機(jī)系統(tǒng)整機(jī)概念,也無法深刻理解計(jì)算機(jī)系統(tǒng)各抽象層的等價(jià)轉(zhuǎn)換關(guān)系。

對于與計(jì)算機(jī)系統(tǒng)核心內(nèi)容相關(guān)的課程,通常是在低年級(jí)先開設(shè)最上層的“高級(jí)語言程序設(shè)計(jì)”和最下層的“數(shù)字邏輯電路”課程,隨后開設(shè)中間層的“計(jì)算機(jī)組成”課程,然后是其上層的“操作系統(tǒng)”、“計(jì)算機(jī)體系結(jié)構(gòu)”和“編譯技術(shù)”等。顯然,對于最上層“高級(jí)語言程序設(shè)計(jì)”和最下層“數(shù)字邏輯電路”的教學(xué),因?yàn)樗鼈冊谟?jì)算機(jī)系統(tǒng)層次中相距較遠(yuǎn),很難把它們相互聯(lián)系在一起,都只能限定在各自局部層次中進(jìn)行教學(xué)。在學(xué)習(xí)“高級(jí)語言程序設(shè)計(jì)”時(shí),學(xué)生無法在程序與機(jī)器指令以及機(jī)器結(jié)構(gòu)之間建立關(guān)聯(lián),因而,對程序設(shè)計(jì)中的許多問題只能一知半解,甚至有些問題根本就無法理解。

同樣,在學(xué)習(xí)“數(shù)字邏輯電路”時(shí),也很難讓學(xué)生把邏輯電路與機(jī)器指令以及機(jī)器結(jié)構(gòu)建立關(guān)聯(lián),更不用說能夠明白邏輯電路和程序之間的關(guān)系了。在“計(jì)算機(jī)組成”課程教學(xué)時(shí),如果把僅它當(dāng)成一門純硬件課程,僅將課程內(nèi)容限定在ISA和微體系結(jié)構(gòu)層,那么,學(xué)生還是不能把程序、指令、機(jī)器結(jié)構(gòu)和邏輯電路等關(guān)聯(lián)起來,原來需要建立課程之間的關(guān)聯(lián)才能明白的很多重要問題還是無法弄清楚,因此,不能把“計(jì)算機(jī)組成”當(dāng)成一門純硬件課程,需要將它的內(nèi)容與“高級(jí)語言程序設(shè)計(jì)”和“數(shù)字邏輯電路”課程的內(nèi)容關(guān)聯(lián)起來。同樣,“計(jì)算機(jī)組成”和后續(xù)的“操作系統(tǒng)”、“計(jì)算機(jī)體系結(jié)構(gòu)”和“編譯技術(shù)”等課程也是密切相關(guān)的,如果能夠在教學(xué)過程中,把它們之間的關(guān)聯(lián)描述清楚,那么將會(huì)為后續(xù)相關(guān)課程的學(xué)習(xí)打下良好的基礎(chǔ)。

“計(jì)算機(jī)組成”課程在整個(gè)計(jì)算機(jī)系統(tǒng)相關(guān)課程鏈中處于中心位置,該課程教學(xué)效果的好壞,對于學(xué)生建立計(jì)算機(jī)系統(tǒng)整機(jī)概念和培養(yǎng)學(xué)生計(jì)算機(jī)系統(tǒng)分析、設(shè)計(jì)、開發(fā)和應(yīng)用能力是至關(guān)重要的。該課程應(yīng)起“粘合劑”的作用,在其教學(xué)過程中應(yīng)將計(jì)算機(jī)軟件和硬件有機(jī)結(jié)合,應(yīng)站在高級(jí)語言程序員的角度來理解計(jì)算機(jī)組成與系統(tǒng)結(jié)構(gòu),通過為程序員描述底層機(jī)器級(jí)行為來把計(jì)算機(jī)系統(tǒng)中的各個(gè)抽象層聯(lián)系起來。

本文將詳細(xì)闡述“計(jì)算機(jī)組成”與其他相關(guān)課程之間的關(guān)聯(lián),其中,第2節(jié)介紹該課程與“高級(jí)語言程序設(shè)計(jì)”課程之間的關(guān)聯(lián);第3節(jié)介紹該課程與“數(shù)字邏輯電路”和“計(jì)算機(jī)體系結(jié)構(gòu)”課程之間的關(guān)聯(lián);第4節(jié)和第5節(jié)分別介紹該課程與“操作系統(tǒng)”和“編譯技術(shù)”課程之間的關(guān)聯(lián)。

2 與高級(jí)語言程序設(shè)計(jì)課程的關(guān)聯(lián)

高級(jí)語言程序必須轉(zhuǎn)換為機(jī)器語言目標(biāo)代碼才能在計(jì)算機(jī)中運(yùn)行,其執(zhí)行結(jié)果雖然由高級(jí)語言語句和所處理的數(shù)據(jù)類型及數(shù)據(jù)的值來決定,但是,歸根到底還是由執(zhí)行程序的計(jì)算機(jī)的低層機(jī)器級(jí)行為來決定的。程序員如果能夠很好地了解計(jì)算機(jī)低層機(jī)器級(jí)行為特征,了解高級(jí)語言中數(shù)據(jù)、運(yùn)算、語句、(子)過程和文件操作等在計(jì)算機(jī)系統(tǒng)中的實(shí)現(xiàn)細(xì)節(jié),那么,就可以編制出高效的程序,并在程序調(diào)試、性能提升、程序移植和健壯性等方面成為編程高手。因此,“計(jì)算機(jī)組成”課程內(nèi)容可作為“高級(jí)語言程序設(shè)計(jì)”課程的深入內(nèi)容。

具體來說,在以下課程內(nèi)容中可以與高級(jí)語言程序設(shè)計(jì)的相關(guān)內(nèi)容建立關(guān)聯(lián)。

2.1數(shù)據(jù)的表示和運(yùn)算

數(shù)據(jù)的表示和運(yùn)算是“計(jì)算機(jī)組成”課程中的基本內(nèi)容,傳統(tǒng)上在該課程中僅介紹各類定點(diǎn)數(shù)和浮點(diǎn)數(shù)的編碼表示,非數(shù)值數(shù)據(jù)的編碼表示,以及相應(yīng)的各種算術(shù)運(yùn)算算法及其運(yùn)算電路,而很少把這些內(nèi)容與高級(jí)語言程序中處理的數(shù)據(jù)建立關(guān)聯(lián),而事實(shí)上高級(jí)語言程序中的數(shù)據(jù)就是該課程中所介紹的數(shù)據(jù),只是從不同角度看到的數(shù)據(jù)的屬性不同罷了。例如,C語言程序中unsigned型數(shù)據(jù)就是定點(diǎn)二進(jìn)制數(shù),int型數(shù)據(jù)就是定點(diǎn)補(bǔ)碼整數(shù),float和double型數(shù)據(jù)就是IEEE 754單精度和雙精度浮點(diǎn)數(shù);C語言中支持的各種運(yùn)算就是該課程中所介紹的運(yùn)算電路實(shí)現(xiàn)的;各種數(shù)據(jù)類型的位數(shù)就是定、浮點(diǎn)數(shù)編碼的位數(shù)。由于計(jì)算機(jī)中運(yùn)算數(shù)據(jù)通路寬度和其他底層機(jī)器結(jié)構(gòu)的限制,使得高級(jí)語言程序在進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換或特定運(yùn)算時(shí)會(huì)出現(xiàn)一些意外結(jié)果[3]37-38,45-47,74-75,如果不把高級(jí)語言程序中的數(shù)據(jù)及其運(yùn)算與低層機(jī)器結(jié)構(gòu)及機(jī)器級(jí)數(shù)據(jù)的表示建立關(guān)聯(lián),則很難理解為何會(huì)發(fā)生這些意外結(jié)果。

圖2是CMU CS213課程]的第一講講義中的一張幻燈片,它說明在計(jì)算機(jī)系統(tǒng)中int型數(shù)據(jù)不是現(xiàn)實(shí)世界中的整數(shù),浮點(diǎn)數(shù)也不是現(xiàn)實(shí)世界中的實(shí)數(shù),例如,對于現(xiàn)實(shí)世界中任意一個(gè)整數(shù)或?qū)崝?shù)x,都有xx≥0,但是,在計(jì)算機(jī)中,某些int型數(shù)據(jù)并不滿足這個(gè)結(jié)論,例如,當(dāng)x=50000時(shí),結(jié)果會(huì)得出xx≤0的結(jié)論。再例如,在現(xiàn)實(shí)世界中,整數(shù)和實(shí)數(shù)都滿足結(jié)合律,但是,在計(jì)算機(jī)中,某些浮點(diǎn)數(shù)運(yùn)算時(shí)就不滿足結(jié)合律,如當(dāng)x=1e20,y=-1e20,z=3.14時(shí),(x+y)+z=3.14,而x+(y+z)=0,兩者不等。

圖2 計(jì)算機(jī)內(nèi)運(yùn)算不同于現(xiàn)實(shí)世界中運(yùn)算的例子

如果在教學(xué)中除了介紹編碼表示以外,還把編碼表示與程序設(shè)計(jì)中遇到的問題結(jié)合起來,相信學(xué)生會(huì)得到更多的收益,也會(huì)對“計(jì)算機(jī)組成”課程的學(xué)習(xí)更感興趣。

同樣,在講述數(shù)據(jù)存放方式時(shí),也可把大端/小端方式與具體程序及指令相關(guān)聯(lián)。程序開發(fā)中經(jīng)常需要將二進(jìn)制代碼顯示出來以對程序進(jìn)行調(diào)試,程序員根據(jù)數(shù)據(jù)是按小端還是大端存放,就能通過二進(jìn)制代碼還原數(shù)據(jù)的真值。同樣,程序中的數(shù)據(jù)也涉及到是對齊還是不對齊存放的問題,在編譯器設(shè)置的數(shù)據(jù)對齊方式、高級(jí)語言程序中變量的地址(指針)、指令執(zhí)行時(shí)的訪存處理過程以及內(nèi)存模塊(內(nèi)存條)的組織結(jié)構(gòu)之間建立關(guān)聯(lián),可以讓學(xué)生從一個(gè)對齊存放的小問題中去深刻理解計(jì)算機(jī)系統(tǒng)各層次之間的關(guān)聯(lián),而且有了這些認(rèn)識(shí)后,可以在程序設(shè)計(jì)和程序調(diào)試時(shí)注意因?yàn)閿?shù)據(jù)對齊而出現(xiàn)的意想不到的結(jié)果。

2.2 Cache的基本原理

Cache的基本原理是“計(jì)算機(jī)組成”課程中重要的內(nèi)容。對這一部分的教學(xué),傳統(tǒng)上通常就介紹一下Cache的基本原理和訪問局部性,然后介紹三種映射方式和替換算法以及寫策略問題。實(shí)際上,高級(jí)語言程序與Cache之間有非常緊密的聯(lián)系[3]149-151。雖然從程序員角度來說,編程過程中根本感覺不到Cache的存在,Cache對程序員來說是透明的,但是,由于程序訪問的局部性特點(diǎn),使得引入Cache后可以保證其命中率非常高,從而在絕大多數(shù)情況下可以只訪問高速的Cache而使CPU訪存速度加快,因此,程序設(shè)計(jì)時(shí)是否考慮訪問局部性對程序的性能是至關(guān)重要的,要做一名高水平的程序員必須深刻理解Cache機(jī)制。

因?yàn)镃ache對程序員透明,所以在程序設(shè)計(jì)課程中肯定不會(huì)涉及到Cache問題。如果在“計(jì)算機(jī)組成”課程中又不將Cache與程序設(shè)計(jì)關(guān)聯(lián)的話,學(xué)生就不知道在編程時(shí)要考慮局部性,從而可能編寫出局部性很差的程序,極大降低程序執(zhí)行性能。

圖3是CMU CS213課程的第一講講義中的一個(gè)例子,說明了求轉(zhuǎn)置矩陣的兩種具有同樣代碼量的不同實(shí)現(xiàn)方式,因?yàn)槠鋽?shù)據(jù)訪問的局部性的不同,它們的性能在pentium 4上測試的結(jié)果相差21倍左右。


圖 3 訪問局部性對程序性能影響的例子

圖3中左邊的程序按照數(shù)組元素在內(nèi)存的存放順序進(jìn)行訪問,因而具有很好的空間局部性,而右邊的程序跳躍式訪問數(shù)組元素,因而空間局部性很差,在其他條件完全一樣的情況下,僅僅因?yàn)榭臻g局部性的不同就導(dǎo)致了20多倍的性能差異。相信學(xué)生通過學(xué)習(xí)這樣的例子,會(huì)對Cache與程序設(shè)計(jì)之間的關(guān)系產(chǎn)生深刻的印象,如果再進(jìn)一步對該例中每個(gè)數(shù)組元素的訪存過程進(jìn)行詳細(xì)講解,那么,對于Cache的工作原理以及訪問局部性和Cache之間的關(guān)系等原先很難理解的比較抽象的問題,就變得很容易理解了。

實(shí)際上,在高級(jí)語言程序設(shè)計(jì)中很多情況下都存在如何開發(fā)訪問局部性的問題,也有很多程序例子可以用于分析訪問局部性和程序性能之間的關(guān)系,從而更好地理解Cache基本原理。

2.3虛擬地址空間劃分

虛擬存儲(chǔ)器是“計(jì)算機(jī)組成”課程中的重要內(nèi)容,傳統(tǒng)教學(xué)只會(huì)介紹虛擬存儲(chǔ)器的基本概念、頁表和頁表項(xiàng),以及頁式、段式和段頁式三種存儲(chǔ)管理方式,很少把虛擬存儲(chǔ)器與程序設(shè)計(jì)的內(nèi)容進(jìn)行關(guān)聯(lián),因此,學(xué)生在學(xué)習(xí)這部分內(nèi)容的時(shí)候,會(huì)感到太抽象而不容易理解。例如,對于邏輯地址(即虛擬地址),通常定義為“用戶編制程序時(shí)所使用的地址”,對于虛擬地址空間,通常解釋為“程序員編寫程序時(shí)所用的統(tǒng)一的地址空間,每個(gè)程序都有相同的地址空間”,除此之外不會(huì)有更多的解釋,這對于學(xué)生來說是很難理解的。他們雖然能使用高級(jí)語言編制程序,也許還學(xué)過如何使用匯編語言編制程序,但是從這些經(jīng)驗(yàn)里面,他們并不能明白編制程序所使用的地址是什么。

因?yàn)楦呒?jí)語言在計(jì)算機(jī)系統(tǒng)中屬于操作系統(tǒng)以上的抽象層,高級(jí)語言程序中所使用的地址,不管是代碼的地址還是數(shù)據(jù)的地址,對應(yīng)用程序員(即上述“邏輯地址”定義中的用戶)來說都是感覺不到的;匯編語言雖然在計(jì)算機(jī)系統(tǒng)中屬于較低抽象層,匯編語言程序員可以為代碼段和數(shù)據(jù)段定義地址,但是這個(gè)地址并不是我們所說的虛擬地址,因此,即便是學(xué)生有用匯編語言編寫程序的經(jīng)驗(yàn),也無法正確理解“用戶編制程序時(shí)所用的地址”這樣的概念。

正確理解“虛擬地址”這個(gè)概念,對于虛擬存儲(chǔ)器整個(gè)知識(shí)點(diǎn)的學(xué)習(xí)是至關(guān)重要的。將虛擬地址空間的劃分和程序設(shè)計(jì)中的相關(guān)概念建立關(guān)聯(lián)[3]174-175,有助于學(xué)生理解“虛擬地址”概念,對于“所有程序使用相同的地址空間”這句話也就很好理解了,而且,對于學(xué)生進(jìn)一步理解程序設(shè)計(jì)中涉及到的變量的作用域和壽命等問題也有很大幫助。

圖4是在Linux操作系統(tǒng)下hello程序的一個(gè)進(jìn)程對應(yīng)的虛擬地址空間映像,通過對虛擬地址空間與hello程序各部分之間的對應(yīng)關(guān)系的說明,可以將很多相關(guān)概念關(guān)聯(lián)起來,從而使學(xué)生能夠比較容易地理解許多深層次的問題。


圖 4 hello程序?qū)?yīng)的Linux虛擬地址空間映像

首先,通過圖4可以簡要解釋程序開發(fā)過程中編譯鏈接環(huán)節(jié)的實(shí)現(xiàn)目標(biāo)以及程序裝入過程,為學(xué)生對整個(gè)程序開發(fā)和裝入運(yùn)行過程的理解提供必要的基本知識(shí),也為學(xué)生進(jìn)一步學(xué)習(xí)操作系統(tǒng)中的存儲(chǔ)器管理打下基礎(chǔ)。

其次,通過圖4還可以讓學(xué)生理解“程序”和“進(jìn)程”的本質(zhì)差別,hello程序是指在磁盤上的hello可執(zhí)行文件,而一旦通過操作系統(tǒng)“裝載程序”在虛擬地址空間中建立了圖4所示的存儲(chǔ)映像,hello程序就成為了“進(jìn)程”。

第三,通過圖4可以讓學(xué)生理解操作系統(tǒng)內(nèi)核空間和用戶空間的差別,理解為什么每個(gè)進(jìn)程的用戶空間的范圍和大小總是一樣的,例如圖4中顯示的用戶空間總是在0到0xc0000000之間的區(qū)間,每個(gè)用戶進(jìn)程的空間都一樣。

第四,通過圖4可以更好地理解用戶空間中的靜態(tài)區(qū)和動(dòng)態(tài)區(qū)的概念,從而更加深刻理解程序設(shè)計(jì)課程所學(xué)習(xí)過的變量的作用域和壽命的概念。如圖4所示,全局靜態(tài)變量全部分配在只讀數(shù)據(jù)或可讀寫數(shù)據(jù)區(qū),這兩個(gè)區(qū)域是靜態(tài)區(qū),不會(huì)被動(dòng)態(tài)覆蓋,因而只要進(jìn)程存在,變量的空間就一直存在,所以它們具有“全局壽命”;而局部動(dòng)態(tài)變量分配在用戶棧區(qū),用戶棧是由過程調(diào)用中每個(gè)過程對應(yīng)的“棧幀”不斷地動(dòng)態(tài)生長和消退而形成的[3]216-223(這個(gè)概念在本課程其他相關(guān)知識(shí)點(diǎn)的講解時(shí)建立),因而這類變量的作用域僅局限在所在過程或函數(shù)內(nèi),并且僅具有限于所在過程或函數(shù)的“局部壽命”。

第五,通過圖4也能使學(xué)生更好地理解存儲(chǔ)保護(hù)中地址越界和訪問越權(quán)的概念。可以看出,為了便于存儲(chǔ)保護(hù),圖4所示的虛擬空間中,程序中的只讀數(shù)據(jù)和所有代碼存放在一起,它們具有“不可寫”的特性,可讀寫的靜態(tài)數(shù)據(jù)占用固定的區(qū)域,它們具有“可讀可寫”的特性。這為在后續(xù)“操作系統(tǒng)”課程中學(xué)習(xí)相應(yīng)內(nèi)容打下了基礎(chǔ)。

第六,通過圖4可以幫助學(xué)生理解程序設(shè)計(jì)課程中與用戶空間的動(dòng)態(tài)分配與釋放相關(guān)的函數(shù)的功能,并且可以了解到虛擬空間中低地址向高地址增長的堆區(qū)就是動(dòng)態(tài)分配的空間,這些對學(xué)生在后續(xù)“操作系統(tǒng)”課程中學(xué)習(xí)相應(yīng)的存儲(chǔ)管理內(nèi)容會(huì)起到重要的作用,也使學(xué)生對存儲(chǔ)器泄漏問題的實(shí)質(zhì)有更清楚的認(rèn)識(shí)。

2.4指令系統(tǒng)設(shè)計(jì)

指令集體系結(jié)構(gòu)(ISA)是計(jì)算機(jī)系統(tǒng)中最核心的抽象層,位于軟件和硬件交界面,因此,指令系統(tǒng)設(shè)計(jì)是“計(jì)算機(jī)組成”課程中最核心的內(nèi)容。傳統(tǒng)上這部分教學(xué)著重介紹指令系統(tǒng)設(shè)計(jì)涉及的指令格式、操作碼編碼、操作類型和尋址方式問題,而不提及指令系統(tǒng)與高級(jí)語言之間的關(guān)系,事實(shí)上,高級(jí)語言程序作為指令系統(tǒng)設(shè)計(jì)的需求,它們之間是密切相關(guān)的,高級(jí)語言處理的數(shù)據(jù)及其運(yùn)算就是指令中的數(shù)據(jù)及其運(yùn)算,高級(jí)語言語句的實(shí)現(xiàn)就是若干條指令構(gòu)成的指令序列的實(shí)現(xiàn),因此,指令系統(tǒng)設(shè)計(jì)時(shí),需要從如何滿足高級(jí)語言中數(shù)據(jù)及其運(yùn)算以及各類語句功能的需要出發(fā),從如何解決高級(jí)語言功能的問題入手來講解指令系統(tǒng)相關(guān)知識(shí)點(diǎn)。

例如,要有效實(shí)現(xiàn)選擇結(jié)構(gòu)語句需要提供哪些指令?要有效實(shí)現(xiàn)循環(huán)語句需要提供哪些指令?提供什么樣的尋址方式可以方便實(shí)現(xiàn)循環(huán)體中數(shù)組元素的訪問?要實(shí)現(xiàn)高級(jí)語言中的過程(函數(shù))調(diào)用需要提供哪些指令以及什么樣的寄存器使用協(xié)議?過程調(diào)用時(shí)用戶棧中每個(gè)過程的棧幀的結(jié)構(gòu)如何規(guī)定?所有這些都是指令系統(tǒng)設(shè)計(jì)的關(guān)鍵,如果講解指令系統(tǒng)設(shè)計(jì)內(nèi)容時(shí)不從上述這些問題出發(fā),則學(xué)生基本上是只知其然而不知其所以然,了解的只是有關(guān)指令系統(tǒng)的一點(diǎn)皮毛,這樣的教學(xué)對學(xué)生專業(yè)能力的培養(yǎng)所起的作用不大。

3 與數(shù)字邏輯電路和體系結(jié)構(gòu)課程的關(guān)聯(lián)

通常,“數(shù)字邏輯電路”在“計(jì)算機(jī)組成”之前開設(shè),而“計(jì)算機(jī)體系結(jié)構(gòu)”則在“計(jì)算機(jī)組成”后面開設(shè),這三門課程的內(nèi)容位于計(jì)算機(jī)系統(tǒng)中同一層或相鄰層,它們之間存在較大關(guān)聯(lián)。

“計(jì)算機(jī)組成”與“數(shù)字邏輯電路”之間的關(guān)聯(lián),基本上貫穿所有涉及到微體系結(jié)構(gòu)設(shè)計(jì)的內(nèi)容,例如,寄存器(組)、加法器、ALU、乘法器、除法器、BCD碼加法器、存儲(chǔ)器基本電路、數(shù)據(jù)通路、控制器、I/O接口電路等,這些功能部件及其定時(shí)設(shè)計(jì)都基于數(shù)字邏輯電路基本原理,因而兩門課程內(nèi)容銜接很自然。不過,“計(jì)算機(jī)組成”與“計(jì)算機(jī)體系結(jié)構(gòu)”課程之間的關(guān)聯(lián)目前還存在很多問題,一方面兩門課重復(fù)內(nèi)容較多,另一方面兩門課又有一些內(nèi)容沒有銜接好。
在和“數(shù)字邏輯電路”及“計(jì)算機(jī)體系結(jié)構(gòu)”課程的關(guān)聯(lián)方面,“計(jì)算機(jī)組成”課程需要在下面幾個(gè)內(nèi)容教學(xué)時(shí)進(jìn)行改進(jìn)。

3.1基本運(yùn)算部件

半加器、全加器和無符號(hào)加法器的內(nèi)容應(yīng)該是“數(shù)字邏輯電路”中的主要內(nèi)容,包括像SN74181芯片和SN74182芯片等介紹都不應(yīng)作為”計(jì)算機(jī)組成”課程的主要內(nèi)容。特別是現(xiàn)代計(jì)算機(jī)中的CPU已經(jīng)集成了像Cache這樣的高速緩存,并且內(nèi)含了多個(gè)核處理器,已經(jīng)早就不需要通過用SN74181和SN74182類似芯片級(jí)聯(lián)形成CPU了,如果在課程教學(xué)中涉及到SN74181和SN74182等芯片及其級(jí)聯(lián)等內(nèi)容的話,其意義僅在于讓學(xué)生了解現(xiàn)代CPU中是如何用快速的先行進(jìn)位方式來實(shí)現(xiàn)加法器的,而不需要讓學(xué)生了解如何進(jìn)行芯片級(jí)聯(lián),更不能讓學(xué)生產(chǎn)生錯(cuò)誤的認(rèn)識(shí),以為現(xiàn)代計(jì)算機(jī)的CPU是由芯片級(jí)聯(lián)形成。

3.2 CPU的組織結(jié)構(gòu)

傳統(tǒng)上有關(guān)CPU組織的內(nèi)容都是以總線式CPU作為模型機(jī)來進(jìn)行講解的,有的是單總線結(jié)構(gòu)模型,有的是雙總線或三總線結(jié)構(gòu)CPU模型,這樣的模型機(jī)實(shí)際上都不能反映現(xiàn)實(shí)技術(shù),現(xiàn)代CPU中指令的執(zhí)行都采用高級(jí)流水線技術(shù),而總線式CPU連最基本的指令流水線都無法實(shí)現(xiàn),而且指令的執(zhí)行總是需要多個(gè)時(shí)鐘周期才能完成,相應(yīng)控制器的設(shè)計(jì)也比現(xiàn)實(shí)更復(fù)雜,因此這些內(nèi)容的傳授,并沒有讓學(xué)生了解到CPU的真實(shí)結(jié)構(gòu),也無助于培養(yǎng)學(xué)生進(jìn)行CPU設(shè)計(jì)的能力,更沒有為后續(xù)高級(jí)課程的學(xué)習(xí)打下必要的基礎(chǔ),與“計(jì)算機(jī)體系結(jié)構(gòu)”課程內(nèi)容之間存在較大鴻溝,學(xué)生無法從總線式CPU結(jié)構(gòu)一下子跳躍到“計(jì)算機(jī)體系結(jié)構(gòu)”課程中的高級(jí)流水線CPU結(jié)構(gòu)。

為了與“計(jì)算機(jī)體系結(jié)構(gòu)”能夠很好地銜接和關(guān)聯(lián),“計(jì)算機(jī)組成”課程中需要細(xì)化指令流水線的執(zhí)行過程,為此,需要在講解指令流水線之前給出單周期數(shù)據(jù)通路及其控制器的結(jié)構(gòu),然后在單周期處理器的基礎(chǔ)上給出流水線處理器的結(jié)構(gòu),再在流水線處理器中分析一個(gè)指令序列中的各指令在指令流水線中每個(gè)時(shí)鐘周期內(nèi)的數(shù)據(jù)流動(dòng)過程,從而為理解指令流水線執(zhí)行時(shí)可能的冒險(xiǎn)現(xiàn)象以及解決流水線冒險(xiǎn)的處理方法打下良好的基礎(chǔ)。

3.3 數(shù)據(jù)通路的定時(shí)

對于數(shù)據(jù)通路的定時(shí),傳統(tǒng)教學(xué)都會(huì)提到CPU的三級(jí)時(shí)序信號(hào)系統(tǒng)和機(jī)器周期的概念,事實(shí)上這些概念都是在引入Cache之前的處理器設(shè)計(jì)中所用的,在現(xiàn)代計(jì)算機(jī)中它們是過時(shí)的一些知識(shí)點(diǎn),不應(yīng)該作為其主要內(nèi)容,最多只能作為歷史性或過渡性介紹內(nèi)容。傳統(tǒng)教學(xué)中很少有對現(xiàn)代計(jì)算機(jī)中數(shù)據(jù)通路定時(shí)方式的介紹,而這個(gè)內(nèi)容卻是非常重要的,它是學(xué)生理解時(shí)鐘周期和主頻以及計(jì)算機(jī)性能等內(nèi)容的基礎(chǔ),需要在教學(xué)中增加這部分內(nèi)容。

3.4 微程序控制器的設(shè)計(jì)

傳統(tǒng)教學(xué)中通常把微程序控制器設(shè)計(jì)的內(nèi)容作為重要的部分來講,但是,現(xiàn)代計(jì)算機(jī)中即使是CISC處理器,其微體系架構(gòu)也都采用RISC思想,將指令轉(zhuǎn)換為類似RISC指令的微操作來實(shí)現(xiàn),因此那種與復(fù)雜指令對應(yīng)的微程序的設(shè)計(jì)應(yīng)該變得不重要了。

4 與操作系統(tǒng)課程的關(guān)聯(lián)

“操作系統(tǒng)”是“計(jì)算機(jī)組成”的后續(xù)課程。因?yàn)椤安僮飨到y(tǒng)”主要內(nèi)容是如何管理計(jì)算機(jī)中的資源,而“計(jì)算機(jī)組成”課程所介紹的正好就是這些計(jì)算機(jī)中的資源,如CPU、存儲(chǔ)器和I/O,而且操作系統(tǒng)需要通過硬件提供的特權(quán)指令直接對硬件底層進(jìn)行控制和處理,因而這兩門課程內(nèi)容之間存在非常密切的關(guān)聯(lián)。

這兩門課程之間的關(guān)聯(lián)主要體現(xiàn)在以下幾個(gè)方面。

4.1 異常和中斷處理

異常和中斷是打斷用戶進(jìn)程正常執(zhí)行的兩大類事件,它們的發(fā)生會(huì)引起CPU從執(zhí)行用戶進(jìn)程的用戶模式轉(zhuǎn)入執(zhí)行系統(tǒng)進(jìn)程的內(nèi)核模式。有關(guān)中斷和異常的概念在兩門課程中都是重點(diǎn)內(nèi)容,因?yàn)閮砷T課程都涉及到同樣的內(nèi)容,所以,需要對學(xué)生交代清楚:對“計(jì)算機(jī)組成”和“操作系統(tǒng)”來說應(yīng)該各自關(guān)注哪些方面,也就是要在這兩門課程之間給出一個(gè)比較清晰的接口,讓學(xué)生明確整個(gè)異常和中斷機(jī)制中哪些是需要硬件實(shí)現(xiàn)的功能,哪些是需要操作系統(tǒng)實(shí)現(xiàn)的功能。

目前在“計(jì)算機(jī)組成”課程傳統(tǒng)教學(xué)中,基本上沿用Intel 8086/8088中的說法,把內(nèi)部異常(exception)和外部中斷(Interrupt)統(tǒng)稱為中斷,并把中斷處理的相關(guān)內(nèi)容基本上都放到輸入/輸出系統(tǒng)部分進(jìn)行講解。在對異常和中斷部分的教學(xué)過程中,基本不會(huì)提到與操作系統(tǒng)及CPU運(yùn)行模式等內(nèi)容的關(guān)聯(lián),很少關(guān)注內(nèi)部異常和外部中斷之間的本質(zhì)差別,特別是沒有把有關(guān)異常和中斷的檢測及響應(yīng)過程放到指令執(zhí)行過程中去講解,因而學(xué)生很難理解隱指令的本質(zhì)含義,很難理解“異常和中斷的檢測與響應(yīng)由硬件執(zhí)行”這句話的實(shí)際含義,更無法理解指令流水線中的異常和中斷機(jī)制以及精確中斷和非精確中斷的含義。因?yàn)椤坝?jì)算機(jī)組成”課程的傳統(tǒng)教學(xué)中,沒有引入CPU運(yùn)行模式的概念,所以學(xué)生無法得到對很多關(guān)鍵問題的正確認(rèn)識(shí),例如,異常和中斷如何引起CPU模式的切換?硬件需要為此提供哪些機(jī)制?硬件和操作系統(tǒng)之間是如何協(xié)調(diào)處理異常和中斷的?中斷(異常)返回指令與過程返回指令功能的差別以及它們各自在數(shù)據(jù)通路中的執(zhí)行過程是什么?

本文認(rèn)為,為了更好地與操作系統(tǒng)中相應(yīng)內(nèi)容銜接,在“計(jì)算機(jī)組成”課程中應(yīng)該增加或強(qiáng)化以下內(nèi)容:嚴(yán)格區(qū)分內(nèi)部異常和外部中斷,并將內(nèi)部異常的內(nèi)容放在對CPU數(shù)據(jù)通路和控制器進(jìn)行介紹的部分,通過分析具體指令執(zhí)行過程中可能的異常事件來強(qiáng)化內(nèi)部異常的概念,并通過例子來說明異常響應(yīng)過程的具體操作,同時(shí)引入CPU運(yùn)行模式,將異常響應(yīng)過程與模式切換結(jié)合起來,在操作系統(tǒng)課程教學(xué)時(shí)再重溫回顧這部分內(nèi)容并細(xì)化操作系統(tǒng)內(nèi)核中相應(yīng)的處理細(xì)節(jié),這樣,學(xué)生可以非常清晰地了解整個(gè)過程,包括相關(guān)的硬件和軟件部分。
對于異常和中斷,“計(jì)算機(jī)組成”和“操作系統(tǒng)”兩門課程各自的側(cè)重點(diǎn)不同,前者應(yīng)更側(cè)重于異常和中斷的識(shí)別檢測及響應(yīng),對異常和中斷處理只要簡單提一下框架即可,而后者更側(cè)重于異常和中斷的處理,特別是針對不同異常類型和不同設(shè)備中斷的處理流程以及處理前的準(zhǔn)備工作流程和處理后的恢復(fù)及返回工作流程。

4.2 虛擬存儲(chǔ)器機(jī)制

“計(jì)算機(jī)組成”和“操作系統(tǒng)”課程中都涉及到虛擬存儲(chǔ)器,傳統(tǒng)教學(xué)在這兩門中所講的內(nèi)容很多都是重復(fù)的,例如,兩門課程都會(huì)講三種虛擬管理方式,地址轉(zhuǎn)換、頁表和頁表項(xiàng)、TLB等,如果不特別強(qiáng)調(diào)硬件和操作系統(tǒng)各自在實(shí)現(xiàn)虛擬存儲(chǔ)機(jī)制中的角色,就會(huì)給學(xué)生帶來困惑,不知道哪些內(nèi)容屬于硬件設(shè)計(jì)時(shí)需要考慮的,哪些是操作系統(tǒng)需要考慮的。

在“計(jì)算機(jī)組成”課程傳統(tǒng)教學(xué)中,很少提及操作系統(tǒng)是如何介入虛擬存儲(chǔ)管理機(jī)制的,而在“操作系統(tǒng)”課程教學(xué)中也很少明確告訴學(xué)生在虛擬存儲(chǔ)管理中硬件和操作系統(tǒng)之間的接口在哪里,學(xué)生很難建立“地址轉(zhuǎn)換是由CPU在執(zhí)行指令時(shí)完成的”這樣的概念,也很難明白“操作系統(tǒng)可借助于一種特殊的異常事件—缺頁來介入虛擬存儲(chǔ)管理”,更不容易明白“TLB缺失處理可以用軟件實(shí)現(xiàn)也可以用硬件實(shí)現(xiàn)”的道理。而上述這些都是關(guān)于計(jì)算機(jī)系統(tǒng)能力的非常重要的內(nèi)容。

在關(guān)于虛擬存儲(chǔ)器內(nèi)容的教學(xué)中,正如本文2.3節(jié)中所述,首先要講清楚虛擬地址空間的概念,然后,在此基礎(chǔ)上把虛擬存儲(chǔ)管理中最重要的“按需分頁”的基本思想說清楚,從而引入頁表和頁表項(xiàng)的概念,最后把地址轉(zhuǎn)換放到一條指令的執(zhí)行過程中來介紹,以強(qiáng)化地址轉(zhuǎn)換是由硬件執(zhí)行這樣的概念,在介紹地址轉(zhuǎn)換過程時(shí),再把硬件與操作系統(tǒng)之間的關(guān)聯(lián)講清楚。讓學(xué)生明白“缺頁”、“地址越界”和“訪問越權(quán)”等需要操作系統(tǒng)介入的異常事件是由CPU在執(zhí)行指令過程中進(jìn)行地址轉(zhuǎn)換時(shí)發(fā)現(xiàn)的,這些事件是與存儲(chǔ)管理相關(guān)的異常事件,像上述4.1節(jié)所述,在遇到這些異常事件時(shí),會(huì)發(fā)生CPU執(zhí)行模式的切換,使CPU從執(zhí)行用戶進(jìn)程的用戶態(tài)轉(zhuǎn)入內(nèi)核態(tài)執(zhí)行,在內(nèi)核態(tài)中CPU可以執(zhí)行特權(quán)指令并訪問操作系統(tǒng)內(nèi)核存儲(chǔ)區(qū),因而通過把頁表保存在操作系統(tǒng)內(nèi)核地址空間,操作系統(tǒng)內(nèi)核就可更新頁表,并防止用戶進(jìn)程改變頁表,從而確保用戶進(jìn)程只能訪問由OS分配給的用戶地址空間。

通過將虛擬存儲(chǔ)管理與指令執(zhí)行關(guān)聯(lián)起來講解可以非常具體地說明計(jì)算機(jī)系統(tǒng)中硬件和操作系統(tǒng)之間協(xié)調(diào)完成特定任務(wù)的過程。

同樣,介紹TLB工作原理時(shí)也可以與指令的執(zhí)行過程進(jìn)行關(guān)聯(lián),讓學(xué)生了解TLB缺失也是由CPU在執(zhí)行指令過程中進(jìn)行進(jìn)行地址轉(zhuǎn)換時(shí)發(fā)現(xiàn)的,如果用硬件實(shí)現(xiàn)對TLB缺失的處理,那么就像Cache缺失處理一樣,CPU凍結(jié)當(dāng)前指令的執(zhí)行時(shí)序,即當(dāng)前正在執(zhí)行的指令被阻塞,轉(zhuǎn)到相應(yīng)的缺失處理控制邏輯去執(zhí)行,結(jié)束后再回到當(dāng)前被凍結(jié)的指令進(jìn)行執(zhí)行;如果用軟件實(shí)現(xiàn)對TLB缺失的處理,那么就像缺頁處理一樣,會(huì)引起CPU執(zhí)行模式的切換,調(diào)出操作系統(tǒng)內(nèi)核進(jìn)行相應(yīng)處理。

4.3 系統(tǒng)控制類指令的設(shè)計(jì)

在“計(jì)算機(jī)組成”課程中講解指令系統(tǒng)的設(shè)計(jì)時(shí),都會(huì)提到指令系統(tǒng)中有系統(tǒng)控制類指令,但是對于具體有哪些指令則很少提到。事實(shí)上,這些系統(tǒng)控制類指令主要用于操作系統(tǒng)內(nèi)核程序,并且與機(jī)器底層的控制有關(guān),例如,操作系統(tǒng)在進(jìn)程切換時(shí),需要沖刷Cache和TLB,因此,會(huì)有一些與Cache和TLB管理相關(guān)的系統(tǒng)控制類指令;自陷和系統(tǒng)調(diào)用是從用戶態(tài)向核心態(tài)轉(zhuǎn)換的其中一種方式,因此,指令系統(tǒng)設(shè)計(jì)時(shí)需要有自陷指令和系統(tǒng)調(diào)用指令。如果在講到相關(guān)內(nèi)容時(shí),提一下系統(tǒng)控制類指令與進(jìn)程切換和CPU模式轉(zhuǎn)換等的關(guān)系,也可以為學(xué)生學(xué)好操作系統(tǒng)打下良好的基礎(chǔ)。

4.4 輸入/輸出系統(tǒng)

在“計(jì)算機(jī)組成”課程中,通常會(huì)有一個(gè)專門的章節(jié)來介紹I/O系統(tǒng),而操作系統(tǒng)與I/O系統(tǒng)有著極其密切的關(guān)系。OS在I/O系統(tǒng)方面的職責(zé)主要由I/O系統(tǒng)的三個(gè)特性決定的。

(1)共享性:指I/O系統(tǒng)被處理器執(zhí)行的多個(gè)程序共享,因此I/O系統(tǒng)應(yīng)該由OS統(tǒng)一調(diào)度管理,以保證用戶程序只能訪問自己有權(quán)訪問的那部分I/O設(shè)備,并對共享的I/O資源提供合理的調(diào)度管理,使系統(tǒng)的吞吐率達(dá)到最佳。

(2)復(fù)雜性:指I/O設(shè)備控制的細(xì)節(jié)比較復(fù)雜,不能由上層用戶程序來實(shí)現(xiàn),需要OS提供專門的驅(qū)動(dòng)程序來控制,以對用戶程序屏蔽設(shè)備控制的細(xì)節(jié),簡化用戶程序的編寫。

(3)“中斷”式交互性:指外部設(shè)備請求CPU介入時(shí)只能使用中斷方式,請求的目的是希望處理器執(zhí)行專門的輸入/出程序來完成外設(shè)與主機(jī)的數(shù)據(jù)交換,或希望處理器執(zhí)行像打印機(jī)缺紙這種特殊事件處理程序。像上述4.1節(jié)所述,中斷導(dǎo)致用戶態(tài)向操所系統(tǒng)內(nèi)核態(tài)轉(zhuǎn)移,因此,各種具體的中斷處理過程由OS來實(shí)現(xiàn)。
在操作系統(tǒng)的設(shè)備管理程序、設(shè)備驅(qū)動(dòng)程序和中斷服務(wù)程序中都涉及到關(guān)于I/O設(shè)備、I/O接口和I/O控制方式等內(nèi)容,而這些是“計(jì)算機(jī)組成”課程的基本內(nèi)容,在講解這部分內(nèi)容時(shí)如果能有意識(shí)地說明和操作系統(tǒng)之間的關(guān)聯(lián),將會(huì)為學(xué)生學(xué)習(xí)后續(xù)操作系統(tǒng)課程打下良好基礎(chǔ)。MIT6.004課程[5](Computation Structures,相當(dāng)于國內(nèi)的計(jì)算機(jī)組成課程)的實(shí)驗(yàn)8設(shè)計(jì)的實(shí)驗(yàn)內(nèi)容很有啟發(fā)性,它非常恰當(dāng)?shù)乇磉_(dá)了“計(jì)算機(jī)組成”和“操作系統(tǒng)”兩個(gè)課程與輸入/輸出系統(tǒng)之間的關(guān)系,對學(xué)生理解用戶是如何從用戶進(jìn)程陷入到操作系統(tǒng),最終由操作系統(tǒng)內(nèi)核直接控制輸入/輸出設(shè)備這樣的過程很有幫助。

5 與編譯技術(shù)課程的關(guān)聯(lián)

“計(jì)算機(jī)組成”是“編譯技術(shù)”課程的先行課程。因?yàn)榫幾g器的功能是將高級(jí)語言程序轉(zhuǎn)換為機(jī)器級(jí)程序,而機(jī)器級(jí)程序(即匯編指令序列或機(jī)器指令序列)的相關(guān)內(nèi)容以及執(zhí)行機(jī)器級(jí)程序的機(jī)器的相關(guān)內(nèi)容就是“計(jì)算機(jī)組成”課程講解的主要內(nèi)容,因此,“計(jì)算機(jī)組成”和“編譯技術(shù)”之間也有很大關(guān)聯(lián)。在“計(jì)算機(jī)組成”課程教學(xué)時(shí),可以在以下幾個(gè)方面與編譯程序建立關(guān)聯(lián)。

5.1 程序的等價(jià)翻譯轉(zhuǎn)換

在“計(jì)算機(jī)組成”第一講中通常會(huì)通過程序功能等價(jià)轉(zhuǎn)換的例子來闡述計(jì)算機(jī)系統(tǒng)層次結(jié)構(gòu),在這里可以通過例子讓學(xué)生初步了解編譯程序的概念。然后,在后續(xù)相關(guān)內(nèi)容的講解中,只要遇到用高級(jí)語言程序舉例說明時(shí),都強(qiáng)調(diào)是經(jīng)過編譯后得到的對應(yīng)機(jī)器級(jí)程序,并強(qiáng)調(diào)選擇哪個(gè)寄存器來存放高級(jí)語言程序變量是編譯器的工作,選擇什么樣的指令序列來實(shí)現(xiàn)特定高級(jí)語言程序功能也是編譯器的工作,由此來強(qiáng)化編譯程序與“計(jì)算機(jī)組成”相關(guān)內(nèi)容之間的關(guān)聯(lián),潛移默化地強(qiáng)化學(xué)生的計(jì)算機(jī)系統(tǒng)整體概念。

5.2 流水線調(diào)度與編譯優(yōu)化

在“計(jì)算機(jī)組成”課程中涉及到指令流水線設(shè)計(jì),其中的數(shù)據(jù)冒險(xiǎn)和控制冒險(xiǎn)的處理以及靜態(tài)和動(dòng)態(tài)流水線調(diào)度等內(nèi)容都與編譯優(yōu)化有關(guān),在介紹這些內(nèi)容時(shí),可以通過例子來說明編譯優(yōu)化的概念。因?yàn)樵凇熬幾g技術(shù)”課程中不會(huì)涉及計(jì)算機(jī)結(jié)構(gòu)和指令系統(tǒng),因而這方面的編譯優(yōu)化技術(shù)不可能在這門課中介紹,因此安排在“計(jì)算機(jī)組成”或“計(jì)算機(jī)體系結(jié)構(gòu)”課程中講解比較適合。

6 結(jié)語

“計(jì)算機(jī)組成”課程內(nèi)容位于計(jì)算機(jī)系統(tǒng)最核心的中間位置,它對學(xué)生建立計(jì)算機(jī)系統(tǒng)整體概念,對培養(yǎng)學(xué)生深刻理解、使用、設(shè)計(jì)和開發(fā)計(jì)算機(jī)系統(tǒng)起著非常重要的作用。在該課程的教學(xué)過程中,如果能夠很好地把它和高級(jí)語言程序設(shè)計(jì)課程內(nèi)容建立關(guān)聯(lián),它將能起到為“高級(jí)語言程序設(shè)計(jì)”課程解疑答惑的作用,強(qiáng)化學(xué)生在程序調(diào)試、程序性能提升、程序移植和程序健壯性等方面的能力。在與“數(shù)字邏輯電路”和“計(jì)算機(jī)體系結(jié)構(gòu)”課程的銜接中,還需要更加合理地安排內(nèi)容,減少重復(fù)的和陳舊的內(nèi)容,增加必要的過渡內(nèi)容。在與“操作系統(tǒng)”課程的關(guān)聯(lián)部分,需要把硬件實(shí)現(xiàn)部分和操作系統(tǒng)實(shí)現(xiàn)部分區(qū)分開來,側(cè)重講清楚硬件實(shí)現(xiàn)部分以及硬件與操作系統(tǒng)之間的接口部分,而把操作系統(tǒng)實(shí)現(xiàn)的部分留給操作系統(tǒng)課程。在與“編譯技術(shù)”課程的關(guān)聯(lián)中,著重讓學(xué)生了解編譯程序與機(jī)器結(jié)構(gòu)及指令系統(tǒng)的密切關(guān)系,并建立編譯優(yōu)化和指令流水線技術(shù)的關(guān)聯(lián)。

作者袁春風(fēng),南京大學(xué)計(jì)算機(jī)系教授。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,310評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,951評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,566評(píng)論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,055評(píng)論 1 322
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,303評(píng)論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,799評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,683評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,899評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,135評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評(píng)論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,528評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,844評(píng)論 2 372

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