1. 程式人生 > >速讀《深入理解計算機系統(第三版)》問題及解決

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

情況 csdn 第六章 填充 以及 函數 順序 時鐘 管理所

第一章 計算機漫遊

P13:用戶棧和運行時堆有什麽區別?數據結構中經常說堆棧,這裏的堆和棧一樣嗎?和操作系統的堆、棧有什麽區別?

技術分享圖片

參考:堆和棧的區別(內存和數據結構)

操作系統:

  • 棧:由操作系統自動分配釋放 ,存放函數的參數值,局部變量的值等。操作方式類似於數據結構中的棧。
  • 堆:一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收,與數據結構中的堆是兩回事,分配方式類似於鏈表
    數據結構:
  • 堆:一棵倒過來的樹
  • 棧:一種先進後出的數據結構。

第二章 信息的表示和處理

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位的寄存器和匯編的比較

  • 32位使用棧幀來作為傳遞的參數的保存位置,64位用rdi,rsi,rdx,rcx,r8,r9作為第1-6個參數。
  • 64位沒有棧幀的指針,32位用ebp作為棧幀指針,64位的rbp作為通用寄存器使用

第四章 處理器體系結構

P284:時刻240時鐘上升之前,A中的I2已經到達第一個流水線寄存器的輸入,I1在階段B中的值已經到達第二個流水線寄存器的輸入。A中的I2不是該到B中了嗎?怎麽會跑到第一個流水線寄存器中?

技術分享圖片

首先得先知道流水線寄存器是什麽東西,看的比較粗,漏掉了前面的一句話“ABC是三個階段,在各個階段之間放上流水線寄存器”。回看後知道了第一個流水線寄存器在A和B之間,所以A中的I2準備到B,在240時鐘上升之前到達A和B之間的第一個流水線寄存器的輸入,時鐘一上升,I2就跑到這個寄存器裏,成為它的輸出。

第五章 優化程序性能

P392:小結中提到沒有任何編譯器能用一個好的算法或數據結構代替低效率的算法或數據結構,那麽如何選擇好的算法或數據結構,程序員怎麽才知道自己選擇的就是最優?

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

第六章 存儲器層次結構

P404:如果斷電,DRAM和SRAM會丟失他們的信息,那我們在關閉電腦時,數據保存到哪了呢?

經過搜索我知道了外存儲器在斷電後能保存數據,所以計算機電源關閉後,所有數據保存在硬盤中。開機後,想用硬盤上的信息,請裝入內存。

第七章 鏈接

P485:這裏提到程序的入口點是_start函數的地址,我們學的入口點不是Entry point address嗎?二者有什麽聯系?

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

第八章 異常控制流

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

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

技術分享圖片

然後要把CPU和操作系統的行為分開。CPU一條指令一條指令地譯碼執行,當它執行到被零除錯誤指令時,就跳轉到異常向量。操作系統負責管理所有用戶的程序,如果程序要求執行一個除零錯,CPU跳到異常向量了,操作系統跳轉到信號處理程序。

第九章 虛擬內存

本章講的是虛擬內存,還有一個概念是邏輯地址,虛擬地址和邏輯地址有什麽區別?

參考LINUX 邏輯地址、線性地址、物理地址和虛擬地址,文章說的非常詳細了,不再贅述。

第十章 系統級I/O

P624:“open函數返回的描述符總是在進程中當前沒有打開的最小描述符”,這句中的描述符是什麽?

文件描述符是一個整型的數據,它是一個索引值,指向內核為每一個進程所維護的該進程打開文件的記錄表,所有對文件的操作都通過文件描述符實現。程序剛啟動的時候,0是標準輸入,1是標準輸出,2是標準錯誤。如果此時打開一個新的文件,它的文件描述符會是3。返回文件描述符fd,所以在關閉該文件的時候就是close(fd)。FILE結構體裏包含一個文件描述符和一個I/O緩沖區。

第十一章 網絡編程

P654:在介紹connect函數時知道了客戶端通過調用connect函數來建立和服務器的鏈接,在這之間,connect函數會阻塞,那麽如何解決阻塞問題?

參考connect()函數處阻塞時間過長,如何解決?,裏面的代碼看的不太明白,大概意思就是設置非阻塞方式連接或另起線程。

第十二章 並發編程

本章12.5標題是“用信號量同步線程”,下屬小標題為12.5.3“使用信號量來實現互斥”。互斥和同步我覺得是一個層次上的概念,互斥是一種特殊的同步,同步是一種更為復雜的互斥,二者沒有包含關系。而二級標題是一級標題的展開,在裏面有點包含意思,所以這樣安排標題是否不妥?

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