Contents
本課程旨在為建立 Linux 可程式設計程式庫、Makefiles、記憶體管理、編譯與連結、C語言程式設計的開發者提供14.5小時的課程,學習進階的程式設計概念、C/C++程式庫的開發與整合、Makefile自動建構流程、函式指標作為 Callbacks、靜態和動態程式庫及連結 GCC 編譯器的編譯流程、將程式碼組織到標頭檔和原始檔中、與計時器一起工作、理解記憶體配置、Heap 記憶體管理、記憶洩漏、堆疊記憶體、堆疊溢位、堆疊損壞、堆疊暫存器、分頁概念和分頁表、TLV 的概念,要求基本的 C/C++ 程式設計知識、對學習和提高技能的狂熱和熱情,以及良好的作業系統基礎知識。
從這 14.5 小時的課程,你會學到
- 使用 C/C++ 中學習進階的程式設計概念
- C/C++ 程式庫的開發與整合
- 使用 Makefile 自動建構流程
- 使用函式指標作為 Callbacks
- 靜態和動態程式庫及連結GCC 編譯器的編譯流程
- 將程式碼組織到標頭檔( Header )和原始檔中
- 與計時器一起工作
- 理解記憶體配置,Heap 記憶體管理,記憶體洩漏( Memory Leaks )
- 堆疊記憶體,堆疊溢位,堆疊損壞,堆疊暫存器
- 分頁概念和分頁表( Page Tables )
- TLV 的概念
要求
- 基本的 C/C++ 程式設計知識
- 對學習和提高技能的狂熱和熱情
- 良好的作業系統基礎知識,但不是必須的
課程說明
本課程不適合 *絕對初學者*
網際網路上已經有數不清的課程/教學,幾乎教授 C 語言的所有方面。 所有這些課程聽起來都一樣,說起話來都一樣,傳授的知識也差不多一樣。 這門課程與其他課程有什麼不同?
本課程的目的是使您準備系統程式設計技術面試,面試水平-從初級到中級。 本課程適用於(未來的)開發人員,不適用於測試人員或系統管理者。
我選擇建立這個課程來填補新手/初學者和中級/高階程式設計師之間的空白。 本課程假設你至少在程式設計(任何程式語言中,但使用 C/C++ 更好)方面高於平均水平,理解記憶體分配、各種迴圈、函式呼叫、指標等。 在本課程中,我不會教授 C/C++ ( udemy 上已經有很多關於它的課程) ,而是教授程式設計技術和關於 C 語言程式背後運作的底層細節——從面試的角度來看,所有的主題都非常重要。 我的目標是把這門課程發展成 Linux/C 聖經。
然而,我總是覺得,在這個激烈競爭的時代,你需要比你的同事更聰明,因此,我嘗試著向你展示智慧和知識,這對於一個程式設計師來說是至關重要的。 我已經看到儘管學生們可以編寫出好的 C/C++ 程式,但是他們缺乏清晰的理解應該如何以程式庫的形式編寫出更好的組織、可管理、可擴充套件和可程式設計的程式碼( programmable codes )。 例如,學生太擅長程式設計競賽,卻不知道如何寫一個簡單的 Makefile 檔案,原因是,學者不教,學生不愛學。
在本課程中,我將用高階語言無關的程式設計概念(第2版)討論與建立 Linux 系統程式庫(第1版)有關的主題,如果你明天碰巧成為其它語言的程式設計師,這些概念可以很好地應用。
多執行緒、執行緒同步、Socket 程式設計、 IPC 等概念要求每個主題都有單獨的課程。 目前,我有一個關於 IPC 的課程,請檢視。 這些主題超出了本課程的範圍。
課程分為兩個部分:
Release 1 建構和管理一個程式庫: 這涵蓋了關於如何建立和組織程式碼作為一個程式庫的基礎知識。
Release 2進階程式設計概念: 本課程將增加更多章節。 這涵蓋了 Linux 和 C 的進階概念,請檢視目錄以獲得更多資訊。
本課程的進一步內容正在快速發展之中。 每星期最少增加一節。
為什麼你不應該參加這個課程?
- 如果你是 C 語言程式設計的初學者,請不要參加這門課程! !
- 如果你不喜歡敲擊鍵盤,而且懶得只看 VDOs 講座,那麼學習這門課程毫無意義
- 如果你只想把所有的現成東西都塞在你的盤子裡。
課程先決條件:
- C/C++ 程式設計初學者以上水平
- 良好的作業系統基礎知識
- 追求卓越和程式設計的熱情
- 不需要第三方程式庫
無論您實現什麼邏輯,您都需要從頭開始實現它。 像我所有的其它課程一樣,這門課程並不建議你去尋求任何第三方程式庫的幫助來完成這些工作。 使用外部程式庫完全違背了課程的目的。
警告: 本課程有自動系統生成的字幕,可能並不完美。 請根據您的斟酌使用字幕。
課程:
**********************************************
Release 1 程式庫的建立和管理
**********************************************
第1部分: 程式庫簡介
- 什麼是程式庫
- 程式庫與應用程式之間的關係
- 例如: 雙向連結串列(Doubly linked list)作為一個程式庫
- 快速編譯步驟
- 摘要
第2部分: 標頭檔案
- 原始檔和標頭檔案之間的關係
- 文字替換方法
- 文字替換方法——範例與展示
第3部分: 預處理指令
- Hdr 檔案重複包含問題
- 預處理指令
- 重複包含 Hdr 檔案的解決方案
第4部分: 正確使用結構和函式
- 結構-定義和使用 thumb 規則
- 函式-宣告和使用 thumb 規則
- 遞迴相依問題
- 遞迴相依關係的解決方案
第5部分: 靜態和動態程式庫的建立
- 雙向連結串列程式庫恢復執行
- 靜態和動態程式庫的快速建立
- 與靜態程式庫的連結
- 與動態程式庫的連結
第6部分: 使用 Makefile 建構
- 什麼是 Makefile,我們為什麼需要它
- Makefile 的功能
- Make 檔案相依樹
- 編寫 Makefile 的步驟
- 關於 Makefile 的賦值
第7部分: 執行時期( Run-time )可程式設計程式庫
- 什麼是可程式設計程式庫( Programmable Libraries )?
- 編寫程式庫的步驟
- 向程式庫註冊回呼函式( callbacks )
- key_match 回呼函式
- comparison_fn 回呼函式
- 將特定於應用程式的操作委託給程式庫
第8部分: 使用巨集編寫迭代器( Iterators )
- 什麼是迭代巨集?
- 為什麼我們需要迭代巨集?
- 如何寫迭代巨集 – 針對 Tree 和 Linked List
- 練習
第9部分:Glue 為基礎的程式庫和資料結構
- 什麼是 Glue 為基礎的程式庫?
- 介紹 Glthreads – 一個 Glued Linkedlist
- Glthreads 與傳統的 Linked List 比較
- Structure field offset
- GL Thread 操作
- 程式碼走訪
- GLThread 的好處
************************************************
Release 2 進階程式設計概念
************************************************
第10部分:Linux 行程的記憶體佈局
- 虛擬記憶體基礎
- Linux 行程的記憶體佈局
- 範例:Linux 行程的記憶體佈局
- siz 命令的練習
第 11 部分:堆疊記憶體管理
- 堆疊記憶體基礎和內容
- 堆疊溢位和保護
- 堆疊記憶體損毀
- 一般的 CPU 暫存器
- 程序呼叫機制 – 一步一步
- 基底指標暫存器( ebp )的用途
- 程序回傳的機制 – 一步一步
Lab session
第 12 部分:Heap 記憶體管理
- 介紹與目標
- Malloc 如何運作
- Heap 記憶體區域的頂端 – break 指標
- Heap 記憶體管理系統呼叫 – brk 和 sbrk
- Meta 和資料區塊
- free() 是如何運作
- 區塊分割
- 區塊合併
- 記憶體出錯 – 碎片的問題
第 13 部分:分頁的概念
- 分頁( Paging ) 介紹
- 位元可位址化記憶體
- 32 位元和 64 位元機器架構
- 位址通道和資料通道
- 實體和虛擬位址比較
- 實體位址 Frames
- 虛擬位址合成
- 分頁表
- 分頁的動作
- 分享的實體記憶體
第 14 部分:多重層級的分頁
第 15 部分 : 分頁要求
第 16 部分 多執行緒行程的記憶體管理
第 17 部分:設計計時器
- 概念和設計
- 事件註冊
- 定期的事件觸發
- 計時器到期後的事件觸發器
- 將計時器寫成程式庫
- 計時器的指定
**主題還會再增加**
第 18 部分 理解編譯的 4 個階段
- C/C++ 編譯的 4 個階段
- 動態程式庫是如何運作的?
- 動態連結:與動態程式庫連結
- 比較 – 靜態連結和動態連結
第 19 部分:C 語言中的 Structure Padding
- 什麼是 Structure Padding?
- 為什麼 Padding 被完成?
- 取消 Padding
第 20 部分:C 語言中的隱藏結構
- 什麼是隱藏結構?
- 存取隱藏結構
- Opaque 指標
第 21 部分:位元組順序
- Big-endian 和 Little Endian 機制
- 主機的位元順序
- 網路的位元順序
- htonl() 與變種
*******
本課程的目的是讓你準備好系統程式設計技術面試,從初學者到有 8-9 年的經驗。
問:。 當你在自己的履歷中註明有使用 C/C++ 系統程式語言時,面試官常問的問題是什麼?
答: 如果我是面試官,我會問什麼樣的問題取決於他是否有多年的 C語言方面的經驗。
1-3年的經驗ー我會問:
- Double pointers
- 設計一個巨集返回結構的大小
- 二維陣列,從一個函式傳入和回傳陣列
- C 語言程式編譯的不同階段
- Fork ()是如何工作的
- 除錯記憶體損壞的各種方法有哪些。
- 各種 IPCs
- 基於 Heap 和堆疊記憶體的問題
4-6年的經驗——我會問:
- 作業系統如何分配記憶體
- 內部和外部的碎片( fragmentation ),可以做什麼來避免它
- 系統呼叫,strace ()
- 一個 IPC 相對於其它 IPC 的取捨
- 與核心和比較的各種通訊方式
- C 語言中的資料(反)序列化
- C 語言中的 RPC
- callbacks 進階應用程式
- typedef 與 #define 比較
- 在 C 語言中使用巨集泛型
- 執行緒同步
- 基於 Heap 和堆疊記憶體的問題
7年以上的經驗-我會問
- 你有沒有設計任何系統模組來解決任何問題
- 從頭開始設計執行緒程式庫你會加入哪些功能,如何加入?
- 寫一個健壯和靈活的程式庫什麼是要做的和不要的?
- 如何使用 C 語言編寫泛型程式碼
- 在 C 語言中實現計時器的各種方法,以及各種方法的比較
- 中斷是如何運作的?
- 不同的 IPCs和比較
- 如何將 C 程式碼轉換為 C++ ,反之亦然
- 如何編寫檢測記憶體洩漏或垃圾收集的工具
- 設計自己的記憶體配置工具。 為什麼要編寫自己的記憶體配置方案呢?
- 何時進行多行程設計而不是多執行緒設計,反之亦然
- ValGrind 工具是如何運作的
- 在生產程式碼中,你喜歡簡單的遞迴邏輯,還是複雜的非遞迴邏輯,為什麼?
如果你分析這個模式
有1-3年經驗的候選人,我會選擇問更直接和單刀直入的問題。
具有4-6年經驗的候選人,我會選擇問更高階的技術 C 語言問題加上一些比較的方法為基礎的問題
有7年以上經驗的候選人,我會選擇問更多的設計和分析為基礎的問題。
注意,因為問題涉及 C 和系統程式設計,所以我沒有提到資料結構和演算法。
目標受眾
- 具有 C/C++ 程式設計基礎知識的學生
- 警告: 不適合程式設計初學者
- 想把自己的程式設計技能從初學者提高到專業水平
- 最後一年的學生希望破解關於作業系統,C語言程式設計的面試問題
講師簡介
Abhishek Sagar 在 Juniper 擔任網路通訊協定開發者 ( 更多講師主講課程介紹 )
你好,我是孟買理工學院的畢業生,目前在網路跨國公司從事網路通訊協定開發。
我有6年以上的業界經驗,從事網路程式設計和開發已超過8年的經驗。
我曾經在的跨國網路公司- Brocade 通訊公司工作,現在在 Juniper Networks 工作。
我精通 Linux 開發環境,我藉此機會通過 Udemy 在 Linux 網路開發領域培訓世界各地的人。 我熱愛並鼓勵知識共享。
Shiwani Nigam 數位行銷主管
嗨,我是市場行銷學博士 Shivani Nigam。 我擅長研究消費者在網上購買產品時的行為。 我負責在這個平台上銷售線上內容(Udemy 課程)。
我還確保課程由技術指導員以完美的音訊 / 視訊質量授課,並確保學生的疑問和問題並由技術指導員優先處理。
英文字幕:有
- 想要了解如何將英文字幕自動翻譯成中文? 請參考這篇 How-To
- 點選這個✨優惠連結✨ 課程特價 | Udemy 永久擁有課程 NT390 起( 在電腦瀏覽器登入,點選“優惠連結”後再回想要的課程介紹中點選“報名參加課程”即可取得 )
- Udemy 現在越來越多課程有中文字幕,請參考 Soft & Share 中文線上課程
- 手機上點選優惠連結看到的價格比電腦上看到的貴
- $代表當地貨幣, 如在台灣為 NT
- 點選”報名參加課程”有可能因瀏覽器 cookies 轉久一點或回報錯誤而無法連上,請稍等刷新或重新點選就會出現
報名參加課程
也許你會有興趣
- C 語言程式設計初學者課程 – 精通 C 語言
- ★英語學習地圖 – 練好英文是最大的學習槓桿
- 如何找工作學習地圖 – 找工作不要靠運氣!