第一章 計算機系統(tǒng)漫游
1.1 信息就是位+上下文
系統(tǒng)中的所有信息裕寨,包括磁盤文件,內(nèi)存中的程序,內(nèi)存中存放的用戶數(shù)據(jù)以及網(wǎng)絡上傳送的數(shù)據(jù)宾袜,都是由一串比特表示的捻艳。區(qū)分不同數(shù)據(jù)對象的唯一方法是我們讀到這些數(shù)據(jù)對象的上下文。
1.2 程序被其他程序翻譯成不同格式
一個程序的生命周期是從一個高級C語言程序開始的庆猫,為了能在系統(tǒng)上運行該程序认轨,每條語句都必須被其他程序轉(zhuǎn)換成一系列低級機器語言,然后這些指令按照可執(zhí)行目標程序的格式打包好月培,并以二進制文件的形式存儲起來嘁字。得到可執(zhí)行目標文件。
這個翻譯過程可歸為四個階段杉畜,預處理纪蜒,編譯,匯編此叠,鏈接纯续,四個階段構(gòu)成了編譯系統(tǒng)灭袁。
預處理階段
預處理器根據(jù)預編譯指令,對C程序進行文本替換烤芦。得到.i文件。
編譯階段
編譯器將.i翻譯成.s铜涉,得到一個匯編語言程序芙代。C語言和Fortran編譯器產(chǎn)生的輸出文件都是一樣的匯編語言盖彭。
匯編階段
將.s文件翻譯成機器語言指令召边,并打包成可重定位目標程序,把存在目標文件.o中片挂。.o是二進制文件音念。
鏈接
C語言頭文件中中的函數(shù)存在了預編譯好的目標文件,因此該階段將調(diào)用的函數(shù)合并到我們的.o文件中整葡,得到可執(zhí)行目標文件掘宪。該文件可以被加載到內(nèi)存中由系統(tǒng)執(zhí)行攘烛。
1.3 了解編譯系統(tǒng)如何工作的益處
-
優(yōu)化程序性能
我們需要了解一些機器代碼以及編譯器如何將C轉(zhuǎn)換為機器代碼的方式坟漱。不同循環(huán)語句的比較,switch和ifelse的比較等腥寇。
理解鏈接時出現(xiàn)的錯誤
避免安全漏洞赦役,如緩沖區(qū)溢出等
1.4 處理器讀并解釋儲存在內(nèi)存中的指令
當程序被編譯完成后栅炒,我們可通過shell指令
linux> ./hello
來運行程序
1.4.1 系統(tǒng)的硬件組成
為了理解運行hello程序時發(fā)生了什么赢赊,我們需要了解系統(tǒng)的硬件組織。
這是一張近期Intel產(chǎn)品族的模型
總線
貫穿于整個系統(tǒng)的電子管道叭披,攜帶信息字節(jié)并負責在各個部件間傳遞涩蜘≈逄常總線傳輸?shù)臄?shù)是個重要的系統(tǒng)參數(shù)豆巨。
IO設(shè)備
IO設(shè)備是系統(tǒng)與外部的聯(lián)系通道,每個IO設(shè)備通過控制器或適配器與IO總線相連熊户】苑控制器和適配器的差別在于他們的封裝方式艇棕。控制器是IO設(shè)備本身或系統(tǒng)的主印刷電路板北苟,適配器是插在主板插槽上的卡友鼻。
主存
主存用來存放程序和數(shù)據(jù)闺骚,由DRAM構(gòu)成僻爽。按字節(jié)編址。
處理器
處理器按照指令模型來操作敦捧,該模型由指令集架構(gòu)決定绞惦。指定按照嚴格的順序執(zhí)行洋措,并更新PC寄存器杰刽。
1.4.2 運行hello程序
shell將hello文件加載到內(nèi)存中贺嫂,通過dma技術(shù),文件可以直接從磁盤到內(nèi)存糜俗,不經(jīng)過cpu悠抹。
hello程序?qū)⒆址械淖止?jié)從主存復制到寄存器楔敌,再從寄存器復制到顯示設(shè)備,輸出到磁盤庆聘。
1.5 高速緩存至關(guān)重要
如上的簡單示例說明了一個重要問題伙判,計算機會經(jīng)常進行IO操作澳腹。這些開銷減慢了程序運行的速度杨何。因此系統(tǒng)設(shè)計者的一個重要目標就是使IO操作盡快完成危虱。
處理器與主存之間存在著巨大的速度差距,并且還在一直擴大蕊玷。針對這種差異弥雹,系統(tǒng)設(shè)計者采用了更小更快的高速緩沖存儲器作為暫時存儲剪勿。L1高速緩存通常可達數(shù)萬字節(jié)酱固,訪問速度幾乎和訪問寄存器一樣快运悲。通過該方案项钮,能讓內(nèi)存操作基本都在緩存中完成希停,基于程序局部性原理脖苏。
1.6 儲存器的層次結(jié)構(gòu)
計算機的各儲存部件間形成了層次結(jié)構(gòu)棍潘,底層速度快亦歉,造價高畅哑,容量小,高層相反赛蔫。通過該層次結(jié)構(gòu)呵恢,就可以用高層的價格和容量媚创,達到底層的速度钞钙。
1.7 操作系統(tǒng)管理硬件
當我們執(zhí)行程序時芒炼,程序并沒有直接訪問計算機硬件,而是通過操作系統(tǒng)提供的服務來訪問鲸湃。我們可以把操作系統(tǒng)看作是應用程序和硬件之間插入的一層軟件唤锉。
操作系統(tǒng)有兩個基本功能:
防止硬件被應用程序濫用别瞭,向應用程序提供簡單一致的機制來控制硬件設(shè)備株憾。操作系統(tǒng)通過幾個抽象服務來實現(xiàn)晒衩,如進程听系,虛擬內(nèi)存靠胜,文件等毕源。
1.8 系統(tǒng)之間利用網(wǎng)絡通信
現(xiàn)代系統(tǒng)經(jīng)常通過網(wǎng)絡和其它系統(tǒng)連接到一起霎褐,網(wǎng)絡可視作一個IO設(shè)備冻璃,數(shù)據(jù)流可以通過網(wǎng)絡直接發(fā)給另一臺機器,不經(jīng)過本地磁盤娘纷,也可通過網(wǎng)絡直接讀取數(shù)據(jù)到主存中跋炕。
1.9 重要主題
1.9.1 Amdahl定律
對系統(tǒng)的某一部分加速時枣购,其對系統(tǒng)整體性能影響取決于該部分的重要性和加速程度。
由此可知涩堤,想要顯著加速整個系統(tǒng)胎围,必須提升全系統(tǒng)中相當大部分的速度
1.9.2 并發(fā)和并行
-
線程級并發(fā)
構(gòu)建在進程抽象之上白魂,我們能夠設(shè)計出同時有多個程序執(zhí)行的系統(tǒng)上岗,這就導致了并發(fā)。自20世紀60年代出現(xiàn)時間共享以來敬锐,計算機系統(tǒng)就開始有了對并發(fā)執(zhí)行的支持,但只是簡單的使任務按時間切換径玖。這種配置稱為單處理器系統(tǒng)颤介。
后來隨著多核處理器,超線程的出現(xiàn)丰泊,我們廣泛使用了多處理器系統(tǒng)瞳购,將多個CPU(核)集成到集成電路芯片上亏推,每個核都有自己的L1和L2緩存,而共用L3緩存.
而超線程技術(shù)則允許一個核并行執(zhí)行多個控制流盏浇。在使用超線程的核中绢掰,程序計數(shù)器核寄存器有多個備份童擎,共用其他資源顾复。
-
指令級并行
在CPU中,使用流水線技術(shù)來極大加快指令的執(zhí)行萧芙。如果指令速度快于一周期一條假丧,則可成為超標量處理器包帚。
-
單指令,多數(shù)據(jù)并行
許多處理器擁有特殊的硬件擎场,允許一條指令產(chǎn)生多個并行的數(shù)據(jù)操作几莽。如SIMD指令可以并行加法章蚣,通常需要在編程時顯式聲明。