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

第一章 計算機漫遊

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

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

操做系統:算法

  • 棧:由操做系統自動分配釋放 ,存放函數的參數值,局部變量的值等。操做方式相似於數據結構中的棧。
  • 堆:通常由程序員分配釋放,若程序員不釋放,程序結束時可能由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「使用信號量來實現互斥」。互斥和同步我以爲是一個層次上的概念,互斥是一種特殊的同步,同步是一種更爲複雜的互斥,兩者沒有包含關係。而二級標題是一級標題的展開,在裏面有點包含意思,因此這樣安排標題是否不妥?

相關文章
相關標籤/搜索