sysprog

@sysprog

System Software Programming

Private team

Joined on Sep 2, 2018

  • 簡介 在對程式進行最佳化之前,必須先測量其執行狀況,才能有針對性地解決效能問題。Perf 的全名為 Performance Event,是一款自 Linux v2.6.31 起內建於系統中的效能分析工具,並隨核心一同釋出。透過 Perf,使用者可藉由 PMU (Performance Monitoring Unit)、tracepoint,以及核心內部的特殊計數器 (counter) 來收集效能資料,並能同時分析運行中的核心程式碼,從而全面掌握應用程式的效能瓶頸。 與 OProfile 和 GProf 相比,Perf 的優勢在於其與 Linux 核心的緊密結合,並且能充分利用核心中的最新功能特性。Perf 的運作原理是透過對目標進行取樣,記錄在特定條件下事件的發生與發生次數。例如,Perf 可根據 tick 中斷進行取樣,在每次 tick 中斷時觸發取樣點,並記錄行程 (process) 在該時間點的執行上下文 (context)。如果一個行程 90% 的時間花費在函式 foo() 上,那麼大約 90% 的取樣點便會集中在函式 foo() 的執行上下文中。 Perf 支援多種事件的取樣,包括硬體事件 (Hardware events),如 cpu-cycles, instructions, cache-misses, branch-misses 等;軟體事件 (Software events),如 page-faults, context-switches 等;及 Tracepoint 事件。藉由這些資料,我們可深入分析程式效能問題。例如,藉由 cpu-cycles 和 instructions,可計算每個 cycle 執行的指令數 (instruction per cycle),進一步判斷程式碼是否充分利用 CPU 資源。cache-misses 可以揭示程式是否妥善利用了 Locality of reference;而 branch-misses 過多則可能導致嚴重的 pipeline hazard。此外,Perf 還能針對特定函式進行取樣,精確定位效能瓶頸所在的程式碼位置,為問題的解決提供關鍵依據。 使用 perf_events 分析程式效能 修改自羅根學習筆記
     Like 3 Bookmark
  • N01: lab0 :::warning 2025 年 2 月 25 日 16:00 會開放 Google 表單讓學員登記,也會公布作業區供學員觀摩及討論 ::: 主講人: jserv / 課程討論區: 2025 年系統軟體課程 :mega: 返回「Linux 核心設計」課程進度表 :penguin: 作業要求 在 GitHub 上 fork lab0-c參閱 Git 教學和 GitHub 設定指引 ^附教學影片^
     Like 2 Bookmark
  • N01: lab0 :::warning :warning: 請務必詳閱作業描述 (一), (二), (三), (四), (五) 及 (六) ::: 主講人: jserv / 課程討論區: 2025 年系統軟體課程 :mega: 返回「Linux 核心設計」課程進度表 ==解說影片== ==作業檢討 (2023 年)==
     Like 10 Bookmark
  • N02: ideas :::warning 2025 年 2 月 25 日 16:00 會開放 Google 表單讓學員登記,也會公布作業區供學員觀摩及討論 ::: 主講人: jserv / 課程討論區: 2025 年系統軟體課程 :mega: 返回「Linux 核心設計」課程進度表 :penguin: 作業要求 研讀 2024 年課程期末展示* 及完整期末專題列表,搭配 2024 年課程回顧影片,從去年的期末專題中選出至少 7 項題目,紀錄過程中的認知、遇到的疑惑,以及你認為如何改進不要說「看不太懂」(這和「看不懂」有何差異?),不懂就記下來並嘗試從你的認知和掌握的第一手材料去拆解,授課教師會斟酌在課堂討論
     Like 3 Bookmark
  • Copyright (慣C) 2018, 2022 宅色夫 ==直播錄影== 前言 「你所不知道的 C 語言」講座致力於引導學員思索專業的程式開發議題,「linked list 和非連續記憶體操作」探討以下: 檢驗學員對於 C 語言指標操作的熟悉程度 linked list (鏈結串列) 本質上就是對非連續記憶體的操作,乍看僅是一種單純的資料結構,但對應的演算法變化多端,像是「如何偵測 linked list 是否存在環狀結構?」和「如何對 linked list 排序並確保空間複雜度為 $O(1)$ 呢?」 linked list 的操作,例如走訪 (traverse) 所有節點,反映出 Locality of reference (cache 用語) 的表現和記憶體階層架構 (memory hierarchy) 高度相關,學員很容易從實驗得知系統的行為,從而思考其衝擊和效能改進方案
     Like 123 Bookmark
  • 「指標」扮演「記憶體」和「物件」之間的橋樑 Copyright (慣C) 2015, 2016, 2018 宅色夫 ==直播錄影(上)== ==直播錄影(下)== <img style="display:block; margin:auto;" src="https://i.imgur.com/9BQBIG9.png"></img> 即便你對指標毫無掌握,你還是能寫程式 Ólafur Waage 在 CppCon 2018 有個 5 分鐘的演講 "Let's learn programming by inventing it" 提及,學習 C 語言的過程,以 K&R 一書為例,許多人聞風喪膽的「指標」一直到第 5 章,約全書一半才提到,可解讀為「你可以在不懂指標是什麼之前,仍可掌握多數的 C 語言功能」。
     Like 84 Bookmark
  • 資料整理: jserv 為何該重視資訊科技詞彙的翻譯? 延續文化仰賴你我!這不是「反中」或對「支那語」的蔑視,而是考慮到科技文化延續議題,我們尊重台灣資訊科技前輩的篳路藍縷、理解詞彙背後的考量因素,和使用精準詞彙,其實也是工程素養的一環,只是很多人忽略,一如〈為什麼不該在台灣用「視頻」一詞?〉一文所說: 「了解詞源、語境,謹慎選擇用詞,是一種必要的態度」 比較文學 (comparative literature) 領域中,有一門學問叫「譯介學」(translation studies),指原作 (在電腦科學的領域中,常見以英語發表的技術文件和規格書一類的第一手材料) 經過譯者的翻譯,得以在一個更廣闊的平台上交流和傳播。中國作家和文學評論家茅盾 (原名沈德鴻) 將翻譯的目的概括為「把原作的藝術意境傳達出來,使讀者在讀譯文的時候能夠像讀原作時一樣得到啟發」。 電腦科學中若干詞彙向數學、物理、生物、金融等等發展成熟的學科借用,取其衍生意義,例如軟體工程的 "library" 一詞就借用「圖書館」的原始意義:
     Like 64 Bookmark
  • 函式呼叫和計算機結構的高度關聯 Copyright (慣C) 2015-2017, 2022 宅色夫 ==直播錄影== 簡介 在 C 語言中,“function” 其實是特化的形式,並非數學意義上的函數,而隱含一個狀態到另一個狀態的關聯,因此,我們將一般的 C function 翻譯為「函式」,以區別數學意義上的函數 (如 abs, cos, exp)。貌似直觀的函式呼叫背後隱含著各式深奧的議題,諸如 calling convention, application binary interface (ABI), stack 和 heap 等等。倘若你對資訊安全有一定的認識,會知道 stack(-based) buffer overflow,但真正讓攻擊者得逞的機制尚有前述的函式呼叫,至於 Return-oriented programming (ROP) 型態的攻擊則修改函式的回傳地址,這也是 calling convention 的範疇。 本講座將帶著學員重新探索函式呼叫背後的原理,從程式語言和計算機結構的發展簡史談起,讓學員自電腦軟硬體演化過程去掌握 calling convention 的考量,伴隨著 stack 和 heap 的操作,再探討 C 程式如何處理函式呼叫、跨越函式間的跳躍 (如 setjmp 和 longjmp),再來思索資訊安全和執行效率的議題。
     Like 35 Bookmark
  • :::info 目的: 檢驗學員對 linked list 的認知 ::: ==作答表單: 測驗 1 和測驗 2== ==作答表單: 測驗 3== 測驗 1 以下程式碼運用〈你所不知道的 C 語言: linked list 和非連續記憶體〉提及的 "a pointer to a pointer" 技巧,撰寫鏈結串列的經典操作。 image
     Like 2 Bookmark
  • N01: lab0 主講人: jserv / 課程討論區: 2025 年系統軟體課程 :mega: 返回「Linux 核心設計」課程進度表 研讀 Linux 核心原始程式碼的 lib/list_sort.c 用 bottom up 實作 merge sort 對 cache 較友善,因為過程中就是一直合併,cache 被參照到的機會更大。 而 top down 是會先做 partition 再來 merge,但 partition 本身對 cache 不友善,在 cache 移進移出(內容不斷更新,導致 cache thrashing。 合併方式 合併方式是當有 $3 \times 2^k$ 個節點時,合併前兩個 $2^k$ 變成 $2^{k + 1}$,並留下一個 $2^k$ 不動,維持著合併:不合併為 2 : 1 的比例,因為只要 $3 \times 2^k$ 可以放得進 L1 cache,可以避免 cache thrashing。
     Like  Bookmark
  • N01: lab0 主講人: jserv / 課程討論區: 2025 年系統軟體課程 :mega: 返回「Linux 核心設計」課程進度表 在 qtest 提供新的命令 shuffle 利用 Fisher–Yates shuffle 演算法來實作洗牌(shuffle) 先用 q_size 取得 queue 的大小 len。 隨機從 0 ~ (len - 1) 中抽出一個數字 random,然後 old 將指向從前面數來第 random 個節點,new 會指向最後一個未被抽到的節點,將 old 和 new 指向的節點的值交換,再將 len - 1。 隨著 len 大小變小,已經被抽到過,並交換值到 queue 後面的會愈來愈多,直到所有的節點都已經被抽到過,shuffle 就結束。
     Like  Bookmark
  • N01: lab0 主講人: jserv / 課程討論區: 2025 年系統軟體課程 :mega: 返回「Linux 核心設計」課程進度表 整合 tiny-web-server 接下來,我們思考同時處理命令列輸入與網頁伺服器,先找出程式等待輸入時的主要迴圈,位於 linenoise()->linenoiseRaw()->linenoiseEdit() 內的 while(1)。但 linenoise 是用 read 等待使用者輸入,當 read 阻塞時,便無法接收 web 傳來的資訊。 嘗試用 select() 同時處理 stdin 及 socket:在 linenoiseEdit 中加入以下程式碼: ​​​​while (1) {
     Like  Bookmark
  • N01: lab0 主講人: jserv / 課程討論區: 2025 年系統軟體課程 :mega: 返回「Linux 核心設計」課程進度表 以 Valgrind 分析記憶體問題 Valgrind 是個在使用者層級 (user space) 對程式在執行時期的行為提供動態分析的系統軟體框架,具備多種工具,可以用來追蹤及分析程式效能,最為人們所熟知的特性就是幫助使用者偵測記憶體錯誤,諸如使用未初始化的記憶體、不當的記憶體配置、或取消配置記憶體,並加以分析。所有工具都包含在 valgrind 套件中,可以透過以下命令執行: $ valgrind --tool=<toolname> <program> 以記憶體追蹤工具來說,上述 toolname 可以是 memcheck, massif, 或 cachegrind。請注意,使用 Valgrind 時,會讓程式執行速度比平常更慢。
     Like  Bookmark
  • 2025 年 Linux 核心設計課程作業 —— lab0 :warning: 預期目標 + 開發環境設定 :accept: Valgrind + 自動測試程式 :spider_web: 整合網頁伺服器 :newspaper: 亂數 + 論文閱讀 :loudspeaker: Linux 核心的鏈結串列排序 :balloon: 作業要求
     Like  Bookmark
  • 資料整理: jserv 在 藉由 spinlock 的調整,改善多核處理器建立 TCP 連線效能 一文,spinlock 被拆解為 percpu 並予以分析,但未涵蓋 spinlock 本身的效能和可擴展能力 (scalability) 議題,本文繼續探討。 本文啟發自 dog250 的文章 術語和背景知識 開始探討主題前,先說明本文的術語: core (核): 最基本的運算處理單元。為區隔作業系統「核心」(kernel) 一詞,本文一律將中央處理器的 core 翻譯為「核」,對應到 Linux 核心程式碼就是 cpu0 和 cpu1 一類的寫法;
     Like 14 Bookmark
  • 資料整理: 林靜儀 email: jennifer710846@gmail.com blog: https://raagi0w0.wordpress.com 目標 藉由研讀漏洞程式碼及 C 語言標準,討論系統程式的安全議題 透過除錯器追蹤程式碼實際運行的狀況,了解其運作原理; 取材自 dangling pointer, CWE-416 Use After Free, CVE-2017-16943 以及 integer overflow 的議題; 研究目的
     Like 7 Bookmark
  • GNU/Linux 開發工具 本共筆整理在 GNU/Linux 開發程式的資訊 為什麼該接觸 GNU/Linux 開發工具 :bell: 輕鬆學會 Windows / Ubuntu 雙系統安裝 :bell: 從無到有學習 HackMDHackMD – LaTeX 語法與示範 Markdown 文件標記語言簡介 :bell: 熟悉 Git 和 GitHub 操作
     Like 3 Bookmark
  • Copyright (慣C) 2018 宅色夫 ==直播錄影== What every systems programmer should know about concurrency 自我檢查清單 點題 / 小處做起 Linux 的 spinlock 出現在裝置驅動程式之際,有以下形式: (只列出常見者)
     Like 13 Bookmark
  • Copyright (慣C) 2018 宅色夫 ==直播錄影== 背景知識 指標篇C99/C11 規格書 6.2.5 (28) 提到: A pointer to void shall have the same representation and alignment requirements as a pointer to a character type. 在 6.3.2.3 (1) 提到:
     Like 49 Bookmark
  • 看漫畫學 Linux 導讀: jserv Daniel Stori 經營的網站 {turnoff.us} 提供一系列關於資訊技術的漫畫,其中 inside the linux kernel 生動地展現 Linux 核心的部分機制和相關的套件。本文嘗試解說這幅漫畫,全貌如下: (原網站提供解析度更高的圖片) image 漫畫以房屋的側面剖面視角,以房屋為載體,小企鵝、小狗、小精靈等成員組為大家庭,各自分工,藉此展現 Linux。由於漫畫針對 Linux 核心的比重不算高,本文標題變更為通用的 Linux 系統,即核心加上關鍵應用程式的組合,並搭配 Daniel Stori 相關的漫畫進行解說。 小企鵝的名字是 Tux - (T)orvalds (U)ni(X),它是 Linux 的吉祥物。會選小企鵝當作 Linux 核心的吉祥物,只是因為 Linus Torvalds 喜歡企鵝,而非企鵝具有特殊或象徵其他意義。
     Like 140 Bookmark