速讀《深入理解計算機系統(第三版)》問題及解決

2022-05-23 07:57:08 字數 2181 閱讀 7925

p13:使用者棧和執行時堆有什麼區別?資料結構中經常說堆疊,這裡的堆和棧一樣嗎?和作業系統的堆、棧有什麼區別?

參考:堆和棧的區別(記憶體和資料結構)

作業系統:

p31:c格式化指令「%.2x」表明整數必須用至少兩個數字的十六進製制格式輸出。之前學過「%7.2f」,點後的2指的是小數點後兩位,那麼「.2x」中的點代表什麼?

點號,用語分隔字段寬度和精度。所以2表示精度。對於字串,它指定列印的字元的最大個數;對於e、e或f轉換,它指定列印的小數點後的數字位數;對於g或g轉換,它指定列印的有效數字位數;對於整

型數,它指定列印的數字位數(必要時可填充位0以達到要求的寬度)。也就是如果是0x6,則輸出06。但"%2x"輸出仍是6,2是寬度,6的前面有乙個空格(c 格式化輸出問題 %2x與%x,有什麼區別)。

p117:之前學習系統呼叫時知道,系統呼叫傳入引數按順序賦值給ebx、ecx、edx、esi、edi、ebp,雖然這裡不是系統呼叫,但是為什麼x放在%rdi,y放在%rsi,dest放在%rdx?

參考64位和32位的暫存器和彙編的比較

p284:時刻240時鐘上公升之前,a中的i2已經到達第乙個流水線暫存器的輸入,i1在階段b中的值已經到達第二個流水線暫存器的輸入。a中的i2不是該到b中了嗎?怎麼會跑到第乙個流水線暫存器中?

首先得先知道流水線暫存器是什麼東西,看的比較粗,漏掉了前面的一句話「abc是三個階段,在各個階段之間放上流水線暫存器」。回看後知道了第乙個流水線暫存器在a和b之間,所以a中的i2準備到b,在240時鐘上公升之前到達a和b之間的第乙個流水線暫存器的輸入,時鐘一上公升,i2就跑到這個暫存器裡,成為它的輸出。

p392:小結中提到沒有任何編譯器能用乙個好的演算法或資料結構代替低效率的演算法或資料結構,那麼如何選擇好的演算法或資料結構,程式設計師怎麼才知道自己選擇的就是最優?

其實我想了想還是乙個經驗的問題,寫多了見多了自然就知道了。其次對各個演算法的時間空間複雜度還需了解。

p404:如果斷電,dram和sram會丟失他們的資訊,那我們在關閉電腦時,資料儲存到哪了呢?

經過搜尋我知道了外儲存器在斷電後能儲存資料,所以計算機電源關閉後,所有資料儲存在硬碟中。開機後,想用硬碟上的資訊,請裝入記憶體。

參考為什麼 __start 是處理器執行的第一條指令?--entry=__start 在鏈結時重新指定了程式入口點為 __start。

p504和p526:本章先講了中斷、陷阱、故障、終止,發生後找到異常表中的異常處理號,再找到異常處理程式。而在後面又講了訊號。這兩個地方都提到被零除,那發生此情況時到底是產生異常還是發出訊號?

首先訊號和中斷的比較 + 中斷和異常的比較給出了異常和函式產生訊號的方式以及程序的處理過程圖:

然後要把cpu和作業系統的行為分開。cpu一條指令一條指令地解碼執行,當它執行到被零除錯誤指令時,就跳轉到異常向量。作業系統負責管理所有使用者的程式,如果程式要求執行乙個除零錯,cpu跳到異常向量了,作業系統跳轉到訊號處理程式。

本章講的是虛擬記憶體,還有乙個概念是邏輯位址,虛擬位址和邏輯位址有什麼區別?

參考linux 邏輯位址、線性位址、實體地址和虛擬位址,文章說的非常詳細了,不再贅述。

p624:「open函式返回的描述符總是在程序中當前沒有開啟的最小描述符」,這句中的描述符是什麼?

檔案描述符是乙個整型的資料,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表,所有對檔案的操作都通過檔案描述符實現。程式剛啟動的時候,0是標準輸入,1是標準輸出,2是標準錯誤。如果此時開啟乙個新的檔案,它的檔案描述符會是3。返回檔案描述符fd,所以在關閉該檔案的時候就是close(fd)。file結構體裡包含乙個檔案描述符和乙個i/o緩衝區。

參考connect()函式處阻塞時間過長,如何解決?,裡面的**看的不太明白,大概意思就是設定非阻塞方式連線或另起執行緒。

本章12.5標題是「用訊號量同步執行緒」,下屬小標題為12.5.3「使用訊號量來實現互斥」。互斥和同步我覺得是乙個層次上的概念,互斥是一種特殊的同步,同步是一種更為複雜的互斥,二者沒有包含關係。而二級標題是一級標題的展開,在裡面有點包含意思,所以這樣安排標題是否不妥?

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

本週速讀了 深入理解計算機系統 這本書,這本書從程式設計師的角度介紹了計算機系統的內在運作,展示了一些本質概念是如何實際的影響應用程式的正確性 效能和實用性的。收穫如下 movw 傳送兩個位元組,當乙個運算元為暫存器時,必須為下圖中八個雙位元組暫存器元素中的乙個。movb 傳遞乙個位元組,當乙個運算...

《深入理解計算機系統(第三版)》第一章

1 計算機提供不同層次的抽象表示,來隱藏實際實現的複雜性 2 程式設計師必須知道編譯系統是如何工作的原因 3 執行hello程式 4 併發是乙個通用的概念,指乙個同時具有多個活動的系統 並行指的是用併發使乙個系統執行的更快 5 意識到快取記憶體的存在,可以利用快取記憶體將程式的效能提高乙個數量級。執...

深入理解計算機系統 第三版 讀書筆記三(函式呼叫)

假設函式p呼叫函式q,q執行後返回到p。這個呼叫包括下面乙個或多個機制 傳遞資料 p必須能夠向q提供乙個或多個引數,q必須能夠向p返回乙個值。分配和釋放記憶體 q可能需要為區域性變數分配空間,返回前又必須釋放這些空間。執行時棧的結構如下圖 其中x86 64的棧向低位址方向增長,而棧指標 rsp指向棧...