1. 程式人生 > >《深入理解計算機系統》速讀提問

《深入理解計算機系統》速讀提問

64位 概述 經歷 實現 故障 相關 不能 提升 轉換

一、計算機系統漫遊

本章通過運行一個hello程序為例,概述了計算機操作系統的運行過程,講述了組成計算機系統的硬件和系統軟件,講到了處理器處理一個程序的過程。
這一章中出現了一個我首次聽說到的詞匯Amdahl定律,該定律的主要思想是,當我們對系統的某個部分加速時,其對整體性能的影響取決於該部分的重要性和加速程度。也就是說要加速整個系統,必須提升系統中大部分的速度。

問題:這個提速是指的硬件性能上的提升,還是操作系統算法上的優化,或是兩個都能影響,誰起到的影響作用更大呢?

二、信息的表示和處理

本章重點講述了計算機中信息的位表示形式,介紹了無符號數,補碼這些信息在計算機中的不同存放方式。同時向我們介紹了32位於64位計算機的區別。最後像我們介紹了計算機中的位級運算和算術運算的方法,計算時會出現溢出的原因和其相對應的實例,讓我們感受到不同定義類型的不同存儲區間和計算時出現溢出計算機的顯示情況。

問題:本章讓我看到了平時使用的強制類型轉換和計算溢出的弊端,會造成很大的誤差,那麽我們在大型程序編寫時可能很難考慮清每一個變量應當定義怎樣的數據類型,也不能全都往大了定義,會造成嚴重的資源浪費,那麽我們該怎麽正確解決這個呢,想好變量在程序中未來會不會溢出嗎?還是定義動態大小呢?

三、程序的機器級表示

本章主要向我們介紹了匯編語言,介紹了計算機系統中的各種寄存器以及每一個寄存器的作用。本章通過一個個我們熟悉的C語言的代碼,如賦值,指針,循環,算術運算等常用的C語言指令向我們講述當它工作在底層,作為和機器直接交流的匯編語言的時候應當是怎麽書寫的,以此來讓我們更加清晰的了解到計算機系統中指令執行的過程以及各個寄存器的不同功能。

問題1:加載有效地址的leaq命令這是首次用到,不過按書中介紹的看來這個命令主要用來進行公式的運算,不過它在使用時是不是真的與地址的計算無關呢?

問題2:上周的測試中在查看sum.o的匯編書寫時發現了cltq這樣一條匯編語句,查詢之後沒有找到合理的解釋,書中也沒介紹這條語句,不知怎麽使用?

四、處理器體系結構

本章主要介紹了ISA,講解了Y86-64指令集,分析了一下它與我們常見的X86-64的不同,然後向我們講解了處理器的流水線操作以及其中的一些異常處理機制,本章最主要介紹的還是一些匯編語言的書寫,在閱讀匯編語句的方面還需要一定的功底,了解指令執行的模式也是這一章需要掌握的重點內容。

問題1:對於本章中出現的一些硬件結構的圖沒有特別看懂?

問題2:流水線冒險的原理分析和處理還需要深入了解,之前沒有學習?

五、優化程序性能

本章主要講解了代碼的優化,講述了編譯器如何能生成高效的代碼,首先指出了編程的時候的一些不好的習慣造成的內存資源的浪費,加大系統的開銷和執行的時間。接著從底層的硬件架構講起,了解處理器,寄存器,內存的性能以此來講解怎麽進行高效的編程,消除不必要的工作。

問題:本章重要講述了優化程序性能,展開循環等等,運用優秀的算法降低開銷,那麽這與Amdahl定律是否相關呢?

六、存儲器層次結構

本章介紹基本的存儲技術RAM、ROM等,並且講解了其價格、讀寫速度等等的一系列差異,告訴了我們計算機系統中對這些存儲器的使用,例如CPU高速緩存區主要使用SRAM,硬盤主要采用ROM制作。那麽不同的存儲技術的使用就會造成整臺計算機各個部件之間的讀寫速度差異,因此本章還像我們介紹了計算機系統平衡速度差異的辦法比如映射,組相聯高速緩存等方式

問題:第一次接觸存儲器山的概念依據書中講述主要是為了記錄程序的相應的讀吞吐量的,但是還是不大了解其使用的方法,對於其生成的函數圖象看不明白?

七、鏈接

本章主要講解了程序執行過程中必須經歷的重要的一步鏈接過程,;鏈接是將各種代碼和數據片段收集並組成一個單一文件的過程。鏈接器處理目標文件時有三種不同的形式:可重定位,可執行,共享。接著介紹了動態鏈接和靜態鏈接的兩種不同的鏈接方式,鏈接器的兩個主要任務是符號解析和重定位。

問題1:動態鏈接和靜態鏈接使用上的區別?我們寫好程序需要鏈接時應當如何選擇?操作系統中更多的使用哪種方式?為什麽?

問題2:對書中介紹的打樁機制不太了解?

八、異常控制流

本章主要講解的是操作系統出現的異常,以及對應異常的處理方法。異常是異常控制流的一種形式,一部分由硬件實現,一部分由操作系統實現,因此處理異常需要硬件和軟件緊密合作,而異常並不是簡單的出錯,而是包含中斷、故障、終止和陷阱四種不同類型的異常。在操作系統層內核用ECF提供進程的基本概念,在操作系統與應用程序之間的接口通過進程的發射的信號來進行不同的操作。

問題:書中介紹了30種Linux支持的30種不同類型的信號,這是不是一般說的全部的中斷處理信號,還是這是不同的信號,不同的操作系統之間有相似之處嗎?

九、虛擬內存

本章介紹了操作系統當中的虛擬內存,它是對主存的一個抽象,主存的空間較小,為了實現不同的進程並行,可以都分配相應大小的內存因此引入虛擬內存概念。書中主要講解了通過分頁的方式管理虛擬內存,並且詳細的講解了頁表的映射方式,以及當缺頁中斷來臨時如何進行調度的一些算法。

問題:除了分頁還有分段,以及段頁式的方法,單單使用分頁管理不是會造成尋找浪費時間嗎?為何不介紹其他的管理方式呢?還是Linux操作系統就是只使用了分頁管理的方式?

十、系統級I/O

本章講述了主存和外部設備之間復制數據的過程,介紹了一些基於Unix I/O模型的系統級函數,它們允許應用程序打開、關閉、讀和寫文件。Linux內核使用三個相關的數據結構表示打開的文件。通過一些編程的例子,以及具體的函數使用方法向我們展示相應的I/O操作是如何進行的。

問題:我發現C應用程序中包含著標準的I/O函數和RIO函數,而Unix I/O函數單成一類,那麽我在C語言文件中可以使用相應的函數嗎?

十一、網絡編程

本章簡單的介紹了網絡編程的大體結構,基於客戶端和服務器模型進行編程,並且給出了大量的實例來告訴我們如何進行網絡編程,介紹了一些網絡編程中才會用到的C語言函數,如connect、bind函數等。

問題:網絡編程接觸的較少,僅僅接觸C#,不過我了解到網絡編程中為了安全考慮不去使用指針,為何我在書中的程序中依然看到了指針的調用?

十二、並發編程

並發是操作系統非常重要的一個實現方式,它是在時間上重疊的一組邏輯流組成的,通過進程、I/O多路復用和線程構建的並發程序的機制,在本章中主要介紹了進程、線程的並發操作,以及並發中引發的一些問題,比如死鎖的產生。

問題:在我看來並發是操作系統中應當重點了解的內容,為何書中一筆帶過?就連銀行家算法,讀寫者問題等經典的並發算法都未提及?

《深入理解計算機系統》速讀提問