第一章 ? 計(jì)算機(jī)系統(tǒng)漫游
1 ? 以hello程序?yàn)槔裕懻摮绦虻纳芷?/b>
? ??為了在系統(tǒng)上運(yùn)行hello.c程序定欧,每條c語句都必須被其他程序轉(zhuǎn)化為一系列的低級(jí)機(jī)器語言指令辈双。然后這些指令按照一種稱為可執(zhí)行目標(biāo)程序的格式打好包烛缔,并以二進(jìn)制磁盤文件的形式存放起來馏段。
? ??從源程序到目標(biāo)程序的轉(zhuǎn)化是由編譯器驅(qū)動(dòng)程序完成的。
(1)預(yù)處理階段
? ? 預(yù)處理器根據(jù)以字符#開頭的命令践瓷,修改原始的c程序院喜。比如#include<stdio.h>命令告訴與預(yù)處理器讀取系統(tǒng)頭文件stdio.h的內(nèi)容,并把它直接插入到程序文本中晕翠。.c ?---> ? .i文件喷舀。
(2)編譯階段
編譯器把文本文件hello.i翻譯成hello.s,它包含了一個(gè)匯編語言程序淋肾。
(3)匯編階段
? ? 匯編器將hello.s翻譯成機(jī)器語言指令硫麻,把這些指令打包成一種叫做可重定位目標(biāo)程序的格式,并將結(jié)果保存在目標(biāo)文件hello.o中樊卓。hello.o文件是一個(gè)二進(jìn)制文件拿愧。(指令編碼)
(4)鏈接階段
? ? 例如,程序中調(diào)用了printf碌尔,它是標(biāo)準(zhǔn)c庫中的一個(gè)函數(shù)浇辜。printf函數(shù)存在于一個(gè)名為printf.o的單獨(dú)的預(yù)編譯好了的目標(biāo)文件中券敌,而這個(gè)文件必須以某種方式合并到我們的hello.o程序中。
? ? 鏈接器就負(fù)責(zé)這種合并奢赂。結(jié)果就得到hello文件陪白,它是一個(gè)可執(zhí)行目標(biāo)文件,可被加載到內(nèi)存中膳灶,由系統(tǒng)執(zhí)行咱士。
2 ? ?編譯系統(tǒng)如何工作 ? ?
? ? 1 ?優(yōu)化系統(tǒng)性能
? ? ?如switch 和 if-else的比較。for和while的比較轧钓。指針引用和數(shù)組索引的比較序厉。等等
? ? 2 ?理解鏈接時(shí)出現(xiàn)的錯(cuò)誤。
? ? ?靜態(tài)變量和全局變量的區(qū)別毕箍。靜態(tài)庫和動(dòng)態(tài)庫的區(qū)別弛房。等等等等(第七章)
? ? 3 ?避免安全漏洞
? ? ?堆棧原理和緩沖區(qū)溢出。(限制從不受信任的源接收數(shù)據(jù)的數(shù)量和格式)
3 ? ?系統(tǒng)的硬件組成
? ? 1 總線
? ??· 貫穿整個(gè)系統(tǒng)的一組電子管道而柑,它攜帶信息字節(jié)并負(fù)責(zé)在各個(gè)部件間傳遞文捶。
? ??·通常總線被設(shè)計(jì)成傳送定長(zhǎng)的字節(jié)塊媒咳,也就是字粹排。
? ??·字中的字節(jié)數(shù)(字長(zhǎng))是一個(gè)基本的系統(tǒng)參數(shù),各個(gè)系統(tǒng)中不盡相同∩瑁現(xiàn)在的大多數(shù)機(jī)器要么是4字節(jié)(32位)顽耳,要么是8個(gè)字節(jié)(64位)。
? ? 2 I/O設(shè)備
? ? ·I/O設(shè)備是系統(tǒng)與外部世界的聯(lián)系通道妙同。
? ? ·每個(gè)I/O設(shè)備都通過一個(gè)控制器或適配器與I/O總線相連射富。控制器與適配器之間的額區(qū)別在于它們的封裝方式粥帚。主印刷電路板or插在主板插槽上的卡胰耗。
? ? 3 主存
? ? ·是一個(gè)臨時(shí)存儲(chǔ)設(shè)備,在處理器執(zhí)行程序時(shí)芒涡,用來存放程序和程序處理的數(shù)據(jù)宪郊。
? ? ·由一組動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(DRAM)芯片組成。
? ? ·是一個(gè)線性的字節(jié)數(shù)組拖陆,每個(gè)字節(jié)都有其唯一的地址(數(shù)組索引)弛槐。
? ? 4 處理器
? ? ·中央處理單元(CPU),是解釋存儲(chǔ)在主存中指令的引擎依啰。
? ? ·核心是一個(gè)大小只有一個(gè)字的存儲(chǔ)設(shè)備(或寄存器)乎串,稱為程序計(jì)數(shù)器(pc)。
? ? ·處理器從程序計(jì)數(shù)器指向的內(nèi)存出讀取指令,解釋指令中的位叹誉,執(zhí)行該指令指示的簡(jiǎn)單操作鸯两,然后更新pc。(圍繞著主存长豁,寄存器文件和ALU進(jìn)行)
例子:運(yùn)行hello程序
? ? 1)在鍵盤上輸入字符串“./hello”后钧唐,shell程序?qū)⒆址鹨蛔x入寄存器,再把它存放到內(nèi)存中匠襟。
? ? 2)shell執(zhí)行一系列指令來加載可執(zhí)行的hello文件钝侠,這些指令將hello目標(biāo)文件中的代碼和數(shù)據(jù)復(fù)制到主存。
? ? 3)處理器開始執(zhí)行hello程序的main程序中的機(jī)器語言指令酸舍,這些指令將輸出復(fù)制到寄存器文件帅韧,再從寄存器文件復(fù)制到顯示設(shè)備。
4 ? 高速緩存啃勉、存儲(chǔ)設(shè)備形成層次結(jié)構(gòu)
主要思想:上一層的存儲(chǔ)器作為低一層存儲(chǔ)器的高速緩存忽舟。
5? ?操作系統(tǒng)管理硬件
操作系統(tǒng):應(yīng)用程序和硬件之間插入的一層軟件。所有應(yīng)用程序?qū)τ布牟僮鲊L試都必須通過操作系統(tǒng)淮阐。
兩個(gè)基本功能:1)防止硬件被失控的應(yīng)用程序?yàn)E用叮阅。2)向應(yīng)用程序提供簡(jiǎn)單一致的機(jī)制來控制復(fù)雜而又通常大不相同的低級(jí)硬件設(shè)備。
6 ? 進(jìn)程與線程
·操作系統(tǒng)會(huì)提供一種假象:好像系統(tǒng)上只有這一個(gè)程序在運(yùn)行泣特。程序看上去是獨(dú)占地使用處理器浩姥、主存和I/O設(shè)備。這些假象是通過進(jìn)程的概念來實(shí)現(xiàn)的群扶。
·進(jìn)程是操作系統(tǒng)對(duì)一個(gè)正在運(yùn)行的程序的一種抽象及刻,在一個(gè)系統(tǒng)上可以同時(shí)運(yùn)行多個(gè)進(jìn)程镀裤,而每個(gè)進(jìn)程都好像在獨(dú)占地使用硬件竞阐。并發(fā)運(yùn)行:則是說,一個(gè)進(jìn)程的指令和另一個(gè)進(jìn)程的指令是交錯(cuò)執(zhí)行的暑劝。
·無論是在單核還是多核系統(tǒng)中骆莹,一個(gè)CPU看上去都像是在并發(fā)地執(zhí)行多個(gè)進(jìn)程,這是通過處理器在進(jìn)程間切換來實(shí)現(xiàn)的担猛。操作系統(tǒng)實(shí)現(xiàn)這種交錯(cuò)執(zhí)行的機(jī)制稱為上下文交換幕垦。
·操作系統(tǒng)跟蹤進(jìn)程運(yùn)行所需的所有狀態(tài)信息。這種狀態(tài)傅联,也就是上下文先改,包括許多信息,比如pc和寄存器文件的當(dāng)前值蒸走,以及主存的內(nèi)容仇奶。當(dāng)操作系統(tǒng)決定要把控制權(quán)從當(dāng)前進(jìn)程轉(zhuǎn)移到某個(gè)新進(jìn)程時(shí),就會(huì)進(jìn)行上下文切換比驻。
·從一個(gè)進(jìn)程到另一個(gè)進(jìn)程的切換是由操作系統(tǒng)內(nèi)核管理的该溯,內(nèi)核是操作系統(tǒng)常駐主存的部分岛抄。注:內(nèi)核不是一個(gè)獨(dú)立的進(jìn)程。相反狈茉,它是系統(tǒng)管理全部進(jìn)程所用代碼和數(shù)據(jù)結(jié)構(gòu)的集合夫椭。
·在現(xiàn)代操作系統(tǒng)中,一個(gè)進(jìn)程實(shí)際上可以由多個(gè)稱為線程的執(zhí)行單元組成氯庆。每個(gè)線程都運(yùn)行在進(jìn)程的上下文中蹭秋,并共享同樣的代碼和全局?jǐn)?shù)據(jù)。
·由于網(wǎng)絡(luò)服務(wù)器中對(duì)并行處理的需求点晴,線程成為越來越重要的編程模型感凤,因?yàn)槎嗑€程之間比多進(jìn)程之間更容易共享數(shù)據(jù)。
7 ? 虛擬內(nèi)存
? ? 為每個(gè)進(jìn)程提供假象粒督,即每個(gè)進(jìn)程都在獨(dú)占地使用主存陪竿,每個(gè)進(jìn)程看到的內(nèi)存都是一致的,稱為虛擬地址空間屠橄。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 內(nèi)核虛擬內(nèi)存 ? ? ? ? ?:用戶代碼不可見的內(nèi)存 ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 用戶棧(運(yùn)行時(shí)創(chuàng)建):函數(shù)調(diào)用返回
????????????????????????????????????????????????????????共享庫的內(nèi)存映射區(qū)域
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??????? 運(yùn)行時(shí)堆(在運(yùn)行時(shí)由malloc創(chuàng)建):動(dòng)態(tài)擴(kuò)展伸縮大小
????????????????????????????????????????????????????????? ? ? 讀/寫數(shù)據(jù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 只讀的代碼和數(shù)據(jù):全局變量
基本思想:把一個(gè)進(jìn)程虛擬內(nèi)存的內(nèi)容存儲(chǔ)在磁盤上族跛,然后用主存作為磁盤的高速緩存。
8 ? 文件
? ? 文件就是字節(jié)序列锐墙。每個(gè)I/O設(shè)備礁哄,包括磁盤,鍵盤溪北,顯示器桐绒,甚至網(wǎng)絡(luò),都可以看成是文件之拨。
9 ? Amdahl定律
? ? 主要思想:當(dāng)我們對(duì)系統(tǒng)的某個(gè)部分加速時(shí)茉继,其對(duì)系統(tǒng)整體性能的影響取決于該部分的重要性和加速度。
? ? 若系統(tǒng)執(zhí)行某應(yīng)用程序需要時(shí)間為Told蚀乔。假設(shè)系統(tǒng)某部分所需執(zhí)行時(shí)間與該時(shí)間的比例為a烁竭,而該部分的性能提升比例為k,即該部分初始所需時(shí)間為aTold吉挣,現(xiàn)在所需時(shí)間為(aTold)/k派撕。因此,總的執(zhí)行時(shí)間應(yīng)為
Tnew=(1-a)Told+(aTold)/k=Tol[(1-a)+a/k]
由此睬魂,可以計(jì)算加速比S=Told/Tnew為:
?? S=1/((1-a)+a/k)
若考慮有趣的特殊情況终吼,即k趨向于無窮時(shí)的效果,這就意味著氯哮,我們可以取系統(tǒng)的某一部分將其加速到一個(gè)點(diǎn)际跪。該定律描述了改善任何過程的一般原則。
10?? 并發(fā)和并行
并發(fā):指一個(gè)同時(shí)具有多個(gè)活動(dòng)的系統(tǒng)。
并行:用并發(fā)來使一個(gè)系統(tǒng)運(yùn)行得更快垫卤。
1)線程級(jí)并發(fā)
構(gòu)建在進(jìn)程這個(gè)抽象之上威彰,我們能夠設(shè)計(jì)出同時(shí)具有多個(gè)程序執(zhí)行的系統(tǒng),這就導(dǎo)致了并發(fā)穴肘。使用線程歇盼,我們能在一個(gè)進(jìn)程中,執(zhí)行多個(gè)控制流评抚。這種并發(fā)執(zhí)行只是模擬出來的豹缀,是通過使一臺(tái)計(jì)算機(jī)在它正在執(zhí)行的進(jìn)程間快速切換來實(shí)現(xiàn)的。這種并發(fā)形式允許多個(gè)用戶同時(shí)與系統(tǒng)交互慨代。
超線程:同時(shí)多線程邢笙,允許一個(gè)CPU執(zhí)行多個(gè)控制流的技術(shù)。比如侍匙,假設(shè)一個(gè)線程必須等到某些數(shù)據(jù)被加載到高速緩存中氮惯,那CPU就可以繼續(xù)去執(zhí)行另一個(gè)線程。
2)指令級(jí)并發(fā)
即現(xiàn)代處理器可以同時(shí)執(zhí)行多條指令的屬性想暗。(重點(diǎn)在于流水線的使用)
流水線:將執(zhí)行一條指令所需要的活動(dòng)劃分成不同的步驟妇汗,將處理器的硬件組織成一系列的階段,每個(gè)階段執(zhí)行一個(gè)步驟说莫。這些階段可以并行的操作杨箭,用來處理不同指令的不同部分。能夠達(dá)到接近于一個(gè)時(shí)鐘周期一條指令的執(zhí)行速率储狭。
3)單指令互婿,多數(shù)據(jù)并行
允許一條指令產(chǎn)生多個(gè)可以并行執(zhí)行的操作。
??????????????????? (第一章只是粗略講了一些基礎(chǔ)概念和框架辽狈,具體細(xì)節(jié)在后面章節(jié))
?????????????????????????????????????????????? (第一章??????? 完)