九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
《深入理解計算機(jī)系統(tǒng)》閱讀總結(jié)與摘要

前言

《深入理解計算機(jī)系統(tǒng)》值得每位程序員一讀,看完之后將會對整個計算機(jī)體系有一個直觀的認(rèn)識。

第一章計算機(jī)系統(tǒng)漫游

  • 只有ascii字符構(gòu)成的文件稱為文本文件,所有其它文件都稱為二進(jìn)制文件。
  • c語言是古怪的,有缺陷的,但同時也是一個巨大的成功,為什么會成功呢
  • c語言與unix操作系統(tǒng)關(guān)系密切
  • c語言小而簡單
  • c語言是為實踐目的設(shè)計的

有一些重要的原因促使程序員必須知道編譯系統(tǒng)是如何工作的

  • 優(yōu)化程序性能
  • 理解鏈接時出現(xiàn)的錯誤
  • 避免安全漏洞
  • shell是一個命令行解釋器,它提出一個提示符,等待輸入一個命令行,然后執(zhí)行這個命令。如果該命令行的第一個單詞不是一個內(nèi)置的shell命令,那么shell就會假設(shè)這是一個可執(zhí)行文件的名字,它將加載并運(yùn)行這個文件。
  • 貫穿整個系統(tǒng)的是一組電子管道,稱作總線。
  • io設(shè)備是系統(tǒng)與外部世界的聯(lián)系通道。
  • 主存是一個臨時存儲設(shè)備,在處理器執(zhí)行程序時,用來存放程序和程序處理的數(shù)據(jù)。
    處理器,是解釋或執(zhí)行存儲在主存中指令的引擎。
  • 利用直接存儲器存取,數(shù)據(jù)可以不通過處理器而直接從磁盤到達(dá)主存。
  • 通過讓高速緩存里存放可能經(jīng)常訪問的數(shù)據(jù),大部分的內(nèi)存操作都能在快速地高速緩存中完成
  • 每個計算機(jī)系統(tǒng)中的存儲設(shè)備都被組織成了一個存儲器層次結(jié)構(gòu)。
  • 操作系統(tǒng)有兩個基本功能
    防止硬件被失控的應(yīng)用程序濫用,向應(yīng)用程序提供簡單一致的機(jī)制來控制復(fù)雜而又通常大不相同的低級硬件設(shè)備。操作系統(tǒng)通過基本的抽象概念(進(jìn)程,虛擬內(nèi)存和文件)來實現(xiàn)這兩個功能。
  • 文件是對i/o設(shè)備的抽象表示,虛擬內(nèi)存是對主存和磁盤i/o設(shè)備的抽象表示,進(jìn)程則是對處理器,主存和i/o設(shè)備的抽象表示。
  • 進(jìn)程是對操作系統(tǒng)對一個正在運(yùn)行的程序的一種抽象。
  • 進(jìn)程并發(fā)運(yùn)行,則是說一個進(jìn)程的指令和另一個進(jìn)程的指令是交錯執(zhí)行的。操作系統(tǒng)實現(xiàn)這種交錯執(zhí)行的機(jī)制稱為上下文切換。
  • 操作系統(tǒng)保持跟蹤進(jìn)程運(yùn)行所需的所有狀態(tài)信息。這種狀態(tài),也就是上下文。
  • 當(dāng)操作系統(tǒng)決定要把控制權(quán)從當(dāng)前進(jìn)程轉(zhuǎn)移到某個新進(jìn)程時,就會進(jìn)行上下文切換,即保存當(dāng)前進(jìn)程的上下文,恢復(fù)新進(jìn)程的上下文,然后將控制權(quán)傳遞到新進(jìn)程。新進(jìn)程就會從它上次停止的地方開始。
  • 雖然我們對系統(tǒng)的一個主要部分做出了重大改進(jìn),但是獲得的系統(tǒng)加速卻明顯小于這部分的加速比。這就是amdahl定律的主要觀點——想要顯著加速整個系統(tǒng)。必須提升全系統(tǒng)中相當(dāng)大的部分的速度。

第二章信息的表示處理

  • 每臺計算機(jī)都有一個字長,指明指針數(shù)據(jù)的標(biāo)稱大小。因為虛擬地址是以這樣的一個字來編碼的。所以字長決定的最重要的系統(tǒng)參數(shù)就是虛擬地址空間的最大大小。
  • 32位字長限制虛擬地址空間為4GB
  • 最低有效字節(jié)在最前面的方式,稱為小端法,最高有效字節(jié)在最前面的方式,稱為大端法。
  • 邏輯右移是在左端補(bǔ)k個0,而算術(shù)右移是在左端補(bǔ)k個最高有效位的值
  • java中,正常的右移運(yùn)算符>>被定義為執(zhí)行算術(shù)右移,特別的運(yùn)算符>>>被指定為執(zhí)行邏輯右移
  • 幾乎所有的編譯器/機(jī)器組合都對有符號數(shù)使用算術(shù)右移,且許多程序員也都假設(shè)機(jī)器會使用這種右移,另一方面,對于無符號數(shù),右移必須是邏輯的。
  • 整型數(shù)據(jù)類型中,唯一一個與機(jī)器相關(guān)的取值范圍是大小指示符long的
  • 取值范圍不是對稱的,負(fù)數(shù)的范圍正數(shù)的范圍大1。
  • c和c++都支持有符號和無符號數(shù),java只支持有符號數(shù)。
  • c語言標(biāo)準(zhǔn)并沒有要求用補(bǔ)碼形式來表示有符號整數(shù),但是幾乎所有的機(jī)器都是這么做的。
  • 有符號數(shù)還可以通過反碼和原碼的方式表示。
  • 要將一個無符號數(shù)轉(zhuǎn)換為一個更大的數(shù)據(jù)類型,我們只要簡單地在表示的開頭添加零,這種運(yùn)算稱為零擴(kuò)展。
  • 要將一個補(bǔ)碼數(shù)字轉(zhuǎn)換為一個更大的數(shù)據(jù)類型,可以執(zhí)行一個符號擴(kuò)展,在表示中添加最高有效位的值。例如sx=-12345 cf c7,擴(kuò)展后x=-12345 ff ff cf c7
  • 算術(shù)運(yùn)算溢出,是指完整的整數(shù)結(jié)果不能放到數(shù)據(jù)類型的字長限制中去。
  • 整數(shù)乘法指定相當(dāng)慢,因此,編譯器使用了一項重要的優(yōu)化,試著用移位和加法運(yùn)算的組合來代替乘以常數(shù)因子的乘法。
  • 整數(shù)除法比整數(shù)乘法更慢。
  • ieee浮點標(biāo)準(zhǔn)用V=(-1)^s×M×2^E
    符號(sign)s決定這數(shù)是負(fù)數(shù)(s=1)還是正數(shù)(s=0),而對于數(shù)值0的符號位解釋作為特殊情況處理。
  • 尾數(shù)(signficand)M是一個二進(jìn)制小數(shù),它的范圍是1~2-ξ或者是0~1-ξ
  • 階碼(exponent)E的作用是對浮點數(shù)加權(quán),這個權(quán)重是2的E次冪(可能是負(fù)數(shù))
  • 將浮點數(shù)的位表示劃分為三個字段
    一個單獨的符號位,直接編碼符號s
    k位的階段字段exp=ek-1e0編碼階碼E
    n位小數(shù)字段frac=fn-1…f0編碼尾數(shù)M,但是編碼出來的值也依賴于階碼字段的值是否等于0
  • 在單精度浮點格式(c語言中的float)中,s,exp和frac字段分別為1位,8位和23位,……分別為1位,11位和52位
  • 階碼的值決定了這個數(shù)是格式化的,非格式化的或特殊值。
  • ieee浮點格式定義了四種不同的舍入方式。向偶數(shù)舍入,向零舍入,向下舍入,向上舍入。
  • 為什么有向偶數(shù)舍入呢?計算平均值的情況。如果總是把兩個可表示值中間的數(shù)字向下舍入,那么舍入后的一組數(shù)的平均值將比這些數(shù)本身的平均值略低一些。向偶數(shù)舍入的大多數(shù)現(xiàn)實情況中避免了這種統(tǒng)計偏差。
  • 從float或者double轉(zhuǎn)換成int,值將會向零舍入。

第三章 程序的機(jī)器級表示

  • 相對于c代碼表示的計算操作,優(yōu)化編譯器能夠重新排列執(zhí)行順序,消除不必要的計算,用快速操作代替慢速操作。
  • 超線程,可以在一個處理器上同時運(yùn)行兩個程序。2004年,pentium 4E開始支持。
  • c語言中的聚合類型,例如數(shù)組和結(jié)構(gòu),在機(jī)器代碼中用一組連續(xù)的字節(jié)來表示。即使是對標(biāo)量數(shù)據(jù)類型,匯編代碼也不區(qū)分有符號或無符號,不區(qū)分各種類型的指針,甚至于不區(qū)分指針和整數(shù)。
  • 程序內(nèi)存包含程序可執(zhí)行機(jī)器代碼,操作系統(tǒng)需要的一些信息,用來管理過程調(diào)用和返回的運(yùn)行時棧,以及用戶分配的內(nèi)存塊。
  • 一條機(jī)器指令只執(zhí)行一個非?;镜牟僮鳌?/span>
  • 反匯編目標(biāo)文件objdump -d output.o

+x86-64的指令長度從1到15個字節(jié)不等。常用以及操作數(shù)較少的指令所需字節(jié)數(shù)少,而不是常用或操作數(shù)較多的指令所需字節(jié)數(shù)較多?

+反匯編器只是基于機(jī)器代碼文件中的字節(jié)序列來確定匯編代碼,它不需要訪問該程序的源代碼或匯編代碼。

  • 指令結(jié)尾的“q”是大小指示符,用來表明操作數(shù)的大小。例如,callq表明其操作數(shù)為4字。
    1+ 6位為一字(word)。
  • b一字節(jié) 1字節(jié)
  • w一字 2字節(jié)
  • l一雙字 或雙精度4字節(jié)或8字節(jié)(整型操作和浮點數(shù)操作指令和寄存器不同,不會產(chǎn)生歧義。)
  • q一四字 8字節(jié)
  • s一單精度 4字節(jié)
  • 指令的操作數(shù)分為三種類型。
    第一種是立即數(shù)。用來表示常數(shù)值。在att格式的匯編代碼中,立即數(shù)的書寫方式是“$”后面跟一個用標(biāo)準(zhǔn)c表示法表示的整數(shù)。比如$0x1C
    第二種類型是寄存器。表示寄存器的內(nèi)容。
    第三種是內(nèi)存引用,它根據(jù)計算出來的地址訪問某個內(nèi)存位置。而尋址方式有多種。
  • 最頻繁使用的指令是將數(shù)據(jù)從一個位置復(fù)制到另一個位置的指令。
  • 訪問寄存器比訪問內(nèi)存要快得多。
  • 棧向下增長,棧頂元素是所有棧中元素地址中最低的。
  • 機(jī)器代碼對于有符號和無符號兩種情況都是用一樣的指令,這是因為許多算術(shù)運(yùn)算對無符號和補(bǔ)碼算術(shù)都有一樣的位級行為。有些情況需要使用不同的指令來處理有符號和無符號操作,例如,使用不同版本的右移,除法,和乘法指令。
  • 跳轉(zhuǎn)指令有幾種不同的編碼,但是常用的都是PC相對的。
  • 實現(xiàn)條件操作的傳統(tǒng)控制方法是通過使用控制的條件轉(zhuǎn)移,當(dāng)條件滿足時,程序沿著執(zhí)行路徑執(zhí)行,而當(dāng)條件不滿足時,就右另一條路徑。這種機(jī)制簡單而通用,但是在現(xiàn)代處理器上,它可能會非常低效。
  • 一種替代的策略是使用數(shù)據(jù)的條件轉(zhuǎn)移。這種方法計算一個條件操作的兩種結(jié)果,然后再根據(jù)條件是否滿足,從中選擇選取一個。
  • 條件傳送指令更符合現(xiàn)代處理器的性能特性。
  • 處理器采用非常精密的分支預(yù)測邏輯來猜測每條跳轉(zhuǎn)指令是否會執(zhí)行,只要它的猜測還比較可靠,指令流水線充滿著指令。另外一方面,錯誤預(yù)測一個跳轉(zhuǎn),要求處理器丟掉它為該跳轉(zhuǎn)指令后所有指令已做的工作,然后再開始用從正確的位置處起始的指令去填充流水線。這樣一個錯誤預(yù)測會招致很嚴(yán)重的懲罰,浪費(fèi)大約15~30個時鐘周期,導(dǎo)致程序性能嚴(yán)重下降。
  • 只有當(dāng)兩個表達(dá)式都很容易計算時,它才會使用條件傳送。
  • 理解產(chǎn)生的匯編代碼與原始源代碼之間的關(guān)系,環(huán)境是找到程序值和寄存器之間的映射關(guān)系。
  • switch開關(guān)語句可以根據(jù)一個整數(shù)索引值進(jìn)行多重分值。它通過使用跳轉(zhuǎn)表這種數(shù)據(jù)結(jié)構(gòu)使得實現(xiàn)更加高效。跳轉(zhuǎn)表示一個數(shù)組,表項i示一個代碼段的地址,這個代碼段實現(xiàn)當(dāng)開關(guān)索引值等于i時程序應(yīng)該采取的動作。與使用if else語句相比,使用跳轉(zhuǎn)表的優(yōu)點是執(zhí)行開關(guān)語句的時間與開關(guān)情況的數(shù)量無關(guān)。
  • c語言的struct聲明創(chuàng)建一個數(shù)據(jù)類型,將可能不同的類型的對象聚合到一個對象中,用名字來引用結(jié)構(gòu)的各個組成部分。類似于數(shù)組的實現(xiàn),結(jié)構(gòu)的所有組成都存放在內(nèi)存中的一段連續(xù)的區(qū)域內(nèi),而指向結(jié)構(gòu)的指針就是結(jié)構(gòu)第一個字節(jié)的地址。
  • 結(jié)構(gòu)的各個字段的選取完全是在編譯時處理的。機(jī)器代碼不包含關(guān)于字段聲明或字段名字的信息。
  • 無論數(shù)據(jù)是否對齊,x86-64硬件都能正確工作,不過,intel還是建議要對齊數(shù)據(jù)以提高內(nèi)存系統(tǒng)的性能。
  • 對齊原則是任何k字節(jié)的基本對象的地址必須是k的倍數(shù)。
  • 許多計算機(jī)對基本數(shù)據(jù)類型的合法地址做了一些限制,要求某種類型對象的地址必須是某個值通常是2,4,或8()的倍數(shù)。
  • 對于大多數(shù)x86-64指令來說,保持?jǐn)?shù)據(jù)對其能夠提高效率,但它不會影響程序的行為

將指針從一種類型強(qiáng)制轉(zhuǎn)換成另一種類型,只改變他的類型,而不改變它的值

函數(shù)指針的值是該函數(shù)機(jī)器代碼表示中第一條指令的地址

*操作符用于間接引用指針

  • 蠕蟲和病毒都試圖在計算機(jī)中傳播它們自己的代碼段。蠕蟲可以自己運(yùn)行,并且能夠?qū)⒆约旱牡刃Ц北緜鞑サ狡渌鼨C(jī)器。病毒能夠?qū)⒆约禾砑拥桨ú僮飨到y(tǒng)在內(nèi)的其它程序中,但它不能獨立運(yùn)行?
  • 緩沖區(qū)一個更加致命的使用就是讓程序執(zhí)行它本來不愿意執(zhí)行的函數(shù)。
  • 對抗緩沖區(qū)溢出攻擊
  • 1.棧隨機(jī)化,地址空間布局隨機(jī)化,198頁,使得棧的位置在程序每次運(yùn)行時都有變化
  • 棧破壞檢測,插入金絲雀值
  • 限制可執(zhí)行代碼區(qū)域
  • 變長數(shù)組意味著在編譯時無法確定棧幀的大小
  • c對于數(shù)組引用不進(jìn)行任何邊界檢查,而且局部變量和狀態(tài)信息都存放在棧中。這兩種情況結(jié)合到一起就能導(dǎo)致嚴(yán)重的程序錯誤,對越界的數(shù)組元素的寫操作會破壞存儲在棧中的狀態(tài)信息。
  • 把浮點數(shù)轉(zhuǎn)換成整數(shù)時,指令會進(jìn)行截斷,把值向0進(jìn)行舍入,這是c和大多數(shù)其他編程語言的要求。

第5章

  • 程序優(yōu)化的第一步就是消除不必要的工作,讓代碼盡可能有效地執(zhí)行所期望任務(wù)。這包括消除不必要的函數(shù)調(diào)用,條件測試和內(nèi)存引用。
  • 了解處理器的運(yùn)作,我們就可以進(jìn)行程序優(yōu)化的第二步,利用處理器提供的指令級并行能力,同時執(zhí)行多條指令。
  • gcc優(yōu)化級別越高,使用的優(yōu)化量也更大,這樣做可以進(jìn)一步提高程序的性能,但是也能增加程序的規(guī)模,也可能使標(biāo)準(zhǔn)的調(diào)試工具更難對程序調(diào)試。
  • 我們會發(fā)現(xiàn)可以寫出的c代碼,即使用-o1選項編譯得到的性能,也比用可能的最高優(yōu)化等級編譯一個原始的版本得到的性能好。
  • 簡單的使用命令行選項-O1,就會進(jìn)行一些基本的優(yōu)化。
  • 邊界檢查降低了程序出錯的機(jī)會,但是它也會減緩程序的執(zhí)行。
  • 對于會改變在哪里調(diào)用函數(shù)或調(diào)用多少次的變換,編譯器通常會非常小心。他們不能可靠地發(fā)現(xiàn)一個函數(shù)是否會有副作用,因而假設(shè)函數(shù)會有副作用。
  • 消除循環(huán)的低效率。
    優(yōu)化類型,代碼移動。
    這類優(yōu)化包括識別要多次執(zhí)行(例如在循環(huán)里)但是計算結(jié)果不會改變的計算。因而可以將計算代碼移動到代碼前面不會被多次求值的部分。(strlen)
  • 減少過程調(diào)用
  • 消除不必要的內(nèi)存引用
    把結(jié)果累積在臨時變量中。臨時變量可能會保存在寄存器中

在實際的處理器中,是同時對多條指令求值的,這個現(xiàn)象稱為指令級并行。

第六章

在程序中利用局部性

第七章

目標(biāo)文件有三種格式:

  • 可重定位目標(biāo)文件
  • 可執(zhí)行目標(biāo)文件
  • 共享目標(biāo)文件
  • 每個可重定位目標(biāo)文件在.symtab中都有用一張符號表(不需要-g編譯選項,除非strip掉才會沒有符號表)
    .debug -g選項編譯時才會有這張表
    .line -g選項編譯時會有有行號和.text節(jié)中機(jī)器指令之間的映射。
    .symtab中的符號表不包含對應(yīng)于本地非靜態(tài)程序變量的任何符號

函數(shù)和已經(jīng)初始化的全局變量是強(qiáng)符號,未初始化的全局變量是弱符號。

  • Linux鏈接器使用下面的規(guī)則來處理多重定義的符號名:
    規(guī)則1;不允許有多個同名的強(qiáng)符號。
    規(guī)則2:如果一個強(qiáng)符號和多個弱符號同名,那么選擇強(qiáng)符號
    規(guī)則3:如果有多個弱符號同名,那么從這些弱符號中任意選擇一個。
    靜態(tài)庫,在鏈接時,鏈接器將只復(fù)制被程序引用的目標(biāo)模塊,這就減少了可執(zhí)行文件在磁盤和內(nèi)存中的大小。
  • 生成靜態(tài)庫 ar rcs lib.a .o
    gcc -static參數(shù)告訴編譯器驅(qū)動程序,鏈接器應(yīng)該構(gòu)造一個完全鏈接的可執(zhí)行目標(biāo)文件,它可以加載到內(nèi)存并運(yùn)行,在加載時無需更進(jìn)一步的鏈接。
  • 在符號解析階段,鏈接器從左到右按照它們在編譯器驅(qū)動程序命令行上出現(xiàn)的順序來掃描可重定位目標(biāo)文件和存檔文件,但是,如果一個符號的庫出現(xiàn)在引用這個符號的目標(biāo)文件之前,那么引用就不能被解析,鏈接就會失敗。
  • 關(guān)于庫的一般準(zhǔn)則是將它們放在命令行的結(jié)尾。如果各個庫的成員是相互獨立的,那么這些庫就可以任務(wù)順序放置在命令行的結(jié)尾處。

3.3 重定位

重定位由兩步組成,重定位節(jié)和符號定位,重定位節(jié)中的符號引用

第八章異??刂屏?/span>

異常的類別

  • 中斷 來自io設(shè)備的信號
  • 陷阱 有意的異常
  • 故障 潛在可恢復(fù)的錯誤
  • 終止 不可恢復(fù)的錯誤
  • 每個系統(tǒng)調(diào)用都有一個唯一的整數(shù)號,對應(yīng)于一個到內(nèi)核中跳轉(zhuǎn)表的偏移量。

所有到linux系統(tǒng)調(diào)用的參數(shù)都是通過通用寄存器而不是棧傳遞的。

進(jìn)程會因為三種原因終止

  • 收到一個信號,該信號的默認(rèn)行為是終止
  • 從主程序返回
  • 調(diào)用exit函數(shù)

第九章 虛擬內(nèi)存

  • bss內(nèi)存位置總是被加載器初始化為0,但堆中的數(shù)據(jù)不是這樣的,需要自己將其初始化
  • 虛擬頁面包括未分配的,緩存的,未緩存的
  • DRAM緩存不命中稱為缺頁
  • 如果工作集的大小超出了物理內(nèi)存的大小,那么將會產(chǎn)生抖動
  • 虛擬內(nèi)存大大簡化了內(nèi)存管理,并提供了一種自然的保護(hù)內(nèi)存的方法
  • vm簡化了鏈接,加載,和共享
  • 分配的目標(biāo),1最大化吞吐率,最大化內(nèi)存利用率
  • 內(nèi)部碎片:已分配塊大小和它們的有效載荷大小之差的和。內(nèi)部碎片的數(shù)量只取決于以前請求的模式和分配器的實現(xiàn)方式
  • 外部碎片是當(dāng)空閑內(nèi)存合計起來足夠滿足一個分配請求,但是沒有一個單獨的空閑快足夠大來處理這個請求時發(fā)生的。第十章 系統(tǒng)級IO
  • 無緩沖的輸入輸出函數(shù)。對于從網(wǎng)絡(luò)讀寫二進(jìn)制數(shù)據(jù)尤其有用
  • 帶緩沖的輸入函數(shù),從文件中讀取文本行和二進(jìn)制數(shù)據(jù)。
  • 首次適配,從頭開始搜索,找到第一個合適的空閑塊
  • 第十二章 并發(fā)編程1.基于進(jìn)程的并發(fā)編程
    2.基于I/O多路復(fù)用的并發(fā)編程
    3.基于線程的并發(fā)編程

終止線程
1.頂層線程例程返回時,線程會隱式的終止
2.調(diào)用pthread_exit函數(shù),線程會顯式的終止
3.某個對等線程調(diào)用Linux的exit函數(shù)
4.pthread_cancel

  • 一個分離線程是不能被其他線程回收或插死的。它的內(nèi)存在它終止時由系統(tǒng)自動釋放。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
漫談從編譯器到運(yùn)行時
程序員的自我修養(yǎng)
C++內(nèi)聯(lián)函數(shù)詳解
S7-1200 1500 指令說明示例CREATE 函數(shù)的編程示例
LINUX匯編(匯編語言程序設(shè)計讀書筆記)
軟件漏洞自動利用研究進(jìn)展
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服