返回課程
AI031 Professional

電腦系統:程式設計師觀點(全球版)

深入探討電腦系統如何執行程式與儲存資訊。本課程彌補高階程式設計與底層硬體之間的差距,涵蓋機器級表示、處理器架構、記憶體層次結構以及並行程式設計。

5.0
36.0h
955 學習者
0 讚好
人工智能
開始學習

課程總覽

📚 內容摘要

深入探討電腦系統如何執行程式與儲存資訊。本課程彌補高階程式設計與底層硬體之間的差距,涵蓋機器級表示、處理器架構、記憶體層次結構以及平行程式設計。

透過理解硬體與軟體介面,掌握系統程式設計的藝術。

作者: Randal E. Bryant, David R. O'Hallaron

致謝: 由卡內基梅隆大學 15-213 課程的學生與教師提供支援。致謝內容包括 Manasa S. 與 Mohit Tahiliani 的貢獻。

🎯 學習目標

  1. 識別資訊如何以位元及系統中的上下文來表示。
  2. 追蹤編譯系統從原始碼到可執行檔的四個階段。
  3. 描述硬體的組織結構以及儲存裝置的層次性。
  4. 在十進制、二進制與十六進制之間進行轉換,並解釋機器級位址(大小端)。
  5. 在 C 語言中執行位元級與邏輯運算,並預測算術右移的結果。
  6. 分析整數編碼,以辨識潛在的溢位漏洞與型別轉換錯誤。
  7. 分析 C 程式語言結構(迴圈、分支、函式)與 x86-64 匯流排指令之間的對應關係。
  8. 解構 執行時堆疊,說明參數傳遞、區域變數儲存與遞迴呼叫的管理方式。
  9. 評估 異質資料結構的記憶體配置,並應用對齊規則計算總儲存需求。
  10. 定義 Y86-64 程式員可見狀態,並將指令編碼/解碼為字節序列。

🔹 第一課:電腦系統導覽

概述: 本課提供電腦系統如何表示資訊、翻譯程式與透過複雜的硬體與軟體互動執行指令的全面概觀。探討程式從原始碼到執行的旅程、記憶體層次結構在克服處理器與記憶體間差距中的關鍵角色、作業系統提供的抽象化,以及系統效能與平行運算背後的數學法則。

學習成果:

  • 識別資訊如何以位元及系統中的上下文來表示。
  • 追蹤編譯系統從原始碼到可執行檔的四個階段。
  • 描述硬體的組織結構以及儲存裝置的層次性。

🔹 第二課:資訊的表示與操作

概述: 本課探討數位電腦如何在位元層級表示與操作資訊。內容涵蓋從十六進位符號與機器級字長過渡至複雜的整數編碼(無符號與二補數)與浮點數(IEEE 754)。學生將分析電腦算術的數學特性,包括溢位的資安影響,以及有限精度系統中捨入的細微差異。

學習成果:

  • 在十進制、二進制與十六進制之間進行轉換,並解釋機器級位址(大小端)。
  • 在 C 語言中執行位元級與邏輯運算,並預測算術右移的結果。
  • 分析整數編碼,以辨識潛在的溢位漏洞與型別轉換錯誤。

🔹 第三課:程式的機器級表示

概述: 本課深入探討高階 C 程式如何轉換為 x86-64 機器碼。內容涵蓋處理器的基本架構,包括暫存器與堆疊、控制流程(條件判斷、迴圈與開關)的實作、函式呼叫與遞迴的機制,以及陣列、結構與聯合等複雜資料結構的機器級表示。最後,探討透過緩衝區溢位分析提升系統安全,以及用於浮點運算的特殊指令。

學習成果:

  • 分析 C 程式語言結構(迴圈、分支、函式)與 x86-64 匯流排指令之間的對應關係。
  • 解構 執行時堆疊,說明參數傳遞、區域變數儲存與遞迴呼叫的管理方式。
  • 評估 異質資料結構的記憶體配置,並應用對齊規則計算總儲存需求。

🔹 第四課:處理器架構

概述: 本課探討處理器的基本架構,專注於從序列式實作(SEQ)過渡至高效率的流水線式實作(PIPE),使用 Y86-64 指令集架構(ISA)。學生將分析指令如何被編碼、經由各個階段(取指、解碼、執行、記憶體存取、寫回)處理,以及如何利用控制邏輯、停頓與前遞技術管理硬體危害,以最大化吞吐量。

學習成果:

  • 定義 Y86-64 程式員可見狀態,並將指令編碼/解碼為字節序列。
  • 使用 HCL(硬體控制語言)實現組合與時序電路的硬體控制邏輯。
  • 追蹤指令在序列式處理器六個階段中的流動,並識別時鐘週期的影響。

🔹 第五課:優化程式效能

概述: 本課探討系統性方法,透過理解高階程式碼、最佳化編譯器與現代微處理器架構之間的互動,來提升程式效能。學生將學習識別「優化阻礙」,例如記憶體別名問題,應用低階轉換技巧如迴圈展開與重關聯,並使用剖析工具(如 GPROF)有效定位效能瓶頸。

學習成果:

  • 識別並消除優化阻礙,包括記憶體別名與函式呼叫的額外負擔。
  • 使用每元素週期數(CPE)量化程式效能。
  • 應用迴圈展開、多累加器與重關聯轉換,以發揮指令級平行性。

🔹 第六課:記憶體層次結構

概述: 本課探討記憶體層次結構的結構與功能設計,專注於儲存速度、成本與容量之間的權衡。詳細說明現代系統所使用的技術——從 SRAM、DRAM 到磁碟與 SSD,並解釋「局部性原理」(時間與空間局部性)如何使小型快速的快取記憶體顯著提升程式效能。學生將學習分析快取映射方式(直接對映、組相聯、全相聯),並應用迴圈重新排序與分塊等優化技術,撰寫符合快取特性的程式碼。

學習成果:

  • 辨識 SRAM、DRAM、ROM 與快閃記憶體技術的差異及其在層次結構中的角色。
  • 根據幾何與運作元件計算磁碟儲存容量與總存取時間。
  • 分析記憶體位址,以確定不同映射策略下的快取組索引、標籤與區塊偏移。

🔹 第七課:連結

概述: 本課探討連結這一關鍵系統層級程序,將程式碼與資料整合成單一檔案,使其能載入記憶體並執行。學生將從原始碼逐步轉換為可執行二進位檔,理解連結器如何解析符號參考、透過重定位合併段落,並管理靜態與動態函式庫。課程最後介紹先進技術,如函式庫取代與位置無關程式碼(PIC),這些技術廣泛應用於現代共用函式庫中。

學習成果:

  • 追蹤原始碼經由編譯器驅動程式轉換為最終可執行檔的過程。
  • 分析 ELF 物件檔,識別符號類型與段落組織。
  • 應用符號解析規則來管理重複名稱與連結時期依賴。

🔹 第八課:例外控制流程

概述: 本課探討例外控制流程(ECF),即電腦系統對系統狀態變化作出反應的機制。我們將檢視 ECF 如何在系統各層級實作,從硬體觸發的 例外、作業系統層級的 上下文切換程序控制(fork、wait、execve),到軟體層級的 訊號非本地跳轉。學生將學習管理併發、處理系統錯誤,並撰寫穩健且訊號安全的程式碼。

學習成果:

  • 辨識四種硬體層級例外(中斷、陷阱、故障、中止)及其處理機制。
  • 使用系統呼叫管理程序生命週期,包括建立(fork)、回收(waitpid)與執行(execve)。
  • 實作安全的訊號處理常式,考慮併發、非佇列訊號與非同步訊號安全性。

🔹 第九課:虛擬記憶體

概述: 本課探討虛擬記憶體(VM)作為基本抽象,為每個程序提供大容量、連續且私有的地址空間。我們將探討其三大主要功能:作為 DRAM 中高效快取的工具、記憶體管理與保護的機制,以及記憶體映射的基礎。此外,課程深入探討位址轉換(TLB)機制、動態記憶體配置(堆管理),以及自動垃圾回收的原則,並總結 C 程式設計中常見的記憶體相關陷阱。

學習成果:

  • 辨識物理位址與虛擬位址的差異,並描述記憶體管理單元(MMU)的角色。
  • 使用頁表與轉譯看查緩衝(TLB)進行虛擬到物理位址的轉換。
  • 分析並實作動態記憶體配置策略,包括隱含/顯式鏈結與合併。

🔹 第十課:系統級 I/O

概述: 本課探討 Linux 作業系統與應用程式之間的基本輸入/輸出介面。內容涵蓋基本的 Unix I/O 系統呼叫、Linux 檔案系統中遇到的各種檔案類型,以及用於管理它們的核心層級資料結構。此外,介紹強健 I/O(RIO)套件以處理「短計數」問題,並提供在不同程式設計情境(如網路程式設計)中選擇標準 I/O 與系統級 I/O 的指南。

學習成果:

  • 實作 使用 Unix I/O 介面的基本檔案操作(openclosereadwrite)。
  • 區分 普通檔案、目錄與連結,並使用 stat 查詢檔案的元資料。
  • 運用 RIO 套件執行強健、緩衝與非緩衝的 I/O 操作。

🔹 第十一課:網路程式設計

概述: 本課探討基於網路的應用程式的基本架構,以客戶端-伺服器程式模型與全球 IP 網際網路為核心。學生將學習如何操作套接字介面——系統級網路通訊的主要 API,並逐步實現一個功能完整的網頁伺服器(TINY),能夠透過通用網關介面(CGI)提供靜態檔案與動態內容。

學習成果:

  • 理解客戶端-伺服器模型的請求-回應週期,以及全球 IP 網際網路的硬體/軟體層級架構。
  • 使用協定無關函式(如 getaddrinfo)操作與轉換 IP 位址、域名與插座結構。
  • 實作穩定的迭代式網頁伺服器與 CGI 程式,利用程序控制與 I/O 重定向提供動態內容。

🔹 第十二課:併發程式設計

概述: 本課探討併發的基本模型:程序、I/O 多工與執行緒。深入探討使用信號量解決競爭條件的同步技術,常見的架構模式如生產者-消費者與預先執行緒伺服器,以及用以評估平行效能的指標。最後,探討關鍵的可靠性問題,包括執行緒安全、可重入性與死結防範。

學習成果:

  • 辨識程序式、I/O 多工式與執行緒式併發模型的差異。
  • 應用信號量操作(P 與 V)確保互斥,並解決同步模式。
  • 在不同擴展定律下,計算平行效能指標,如加速比與效率。