Re: [問卦] 精通作業系統對Coding有什麼幫助?
※ 引述《bencert (根本ㄏㄏ)》之銘言:
: 我資管的
: 作業系統這門科目的內容有
: io運作、Process、Thread、Deadlock、Process communication、記憶體管理、磁碟管理、檔案系統等內容
: 想問精通這些內容跟Coding有什麼關係?
: 有沒有八卦?
我文組 (工作任務之一是撰寫論文和各式報告,沒辦法提槍上戰場,文組無誤) 的,論文
繳交的截止日受到 COVID-19 衝擊而延後,上來跟大家抬槓。
Linux 核心的開創者 Linus Torvalds 在紀錄片《Revolution OS》[1] 提到:
「作業系統就是你永遠不會看到的東西,因為沒有人直接使用作業系統,人們使用的是
(應用) 程式。在他們的電腦上,作業系統唯一的使命就是,幫助其它程式執行,
所以作業系統從未獨立運行,而僅是默默等待程式,來向它要求現有資源、某個存在
硬碟上的檔案或要求其它程式將這個程式連接到外面去,然後作業系統再一步步地,
試著讓人們寫程式容易一些」
通俗來說,作業系統讓絕大多數的人免於需要理解硬體及各式電腦原理,得以使用各式
電腦程式,從而讓軟體自起初電腦硬體的附屬品 (說「附贈」也不為過),迅速在上世紀
建立完整的生態系統及奠定今日資訊科技工業。原提問者的訴求是
: 「精通作業系統跟程式設計有何關係?」
實在是很好的問題,待我娓娓道來。
美國威斯康辛大學教授 Remzi H. Arpaci-Dusseau 賢伉儷撰寫的開放存取式教科書
《Operating Systems: Three Easy Pieces》[2],在〈The Abstraction: The Process〉
一章提到:
: HOW TO PROVIDE THE ILLUSION OF MANY CPUS?
: Although there are only a few physical CPUs available, how can the OS
: provide the illusion of a nearly-endless supply of said CPUs?
作業系統藉由虛擬化 (virtualize) CPU 資源,達到在單一處理器實作出 (概念上) 猶如
同時多個程式執行於各自的處理器之上的假象 -- 其中關鍵的手法就是分時多工
(time-sharing),而 Unix 的第一篇論文《The UNIX Time Sharing System》[3],由
Ken Thompson 和 Dennis Ritchie 在 1973 年 10 月 ACM Symposium on Operating
Systems Principles (SOSP) 中提出,該論文在 1974 年 7 月的 Communications of
the ACM 發表,正是採用分時多工作為主題。
當然,今日的作業系統不限於上述分時多工,充分發揮現代硬體的特性,彷彿應用程式的
開發者只要會運用現有 API 及各式應用程式開發框架 (application framework) 即可,
不用去理會作業系統的內部原理?
我會說,對!多數情況下,應用程式開發者真的不用理會太多作業系統的內部運作機制,
一如不懂資料庫管理系統的運作,也可運用 SQL 語法存取資料庫,甚至連不學習 SQL
語法也可。但倘若遇到效能、擴充性,或者各式來自底層系統問題時,應用程式開發者
往往不得不正視作業系統的設計及實作。
以新酷音輸入法 [4] 來說,在 2004 年我嘗試導入 TaBE [5] 和相容於自由軟體授權的
詞彙用語後,將單字詞列入,字詞總量就達數十萬之譜,但中文輸入法往往是視窗系統
(window system) 及桌面環境 (desktop environment) 啟動不久就會載入的工具程式,
於是使用者很快就面臨一個嚴酷的問題:新酷音輸入法載入的時間越來越長,當然使用者
體驗就差,但華文經典和各式新潮用語又不能隨意捨棄,該怎麼辦?
順帶一提,上個世紀末,我發展中文輸入法最初的動機是,讓前女友在 GNU/Linux 環境
中得以順暢地處理中英文輸入,儘管我不是語文專家,但無形中投入中文資訊系統發展,
用程式碼寫日記 (改寫自經典廣告台詞:「有人用筆寫日記,有人用歲月寫日記,而我,
用柯尼卡寫日記。」)。不算很認真開發,但有空就順手改進。
針對上述輸入法啟動時間太長的疑慮,我和熱血的開發者同儕在 2005 年用泛 UNIX 家族
(即 UNIX-like 作業系統) 的 mmap 系統呼叫 [6] 和 Microsoft Windows API 的
CreateFileA 或 CreateFileForMappingA (針對 WinCE,冷知識: 新酷音輸入法曾經移植
到 Windows Mobile,不過由於程式碼參雜著和自由軟體授權不相容的工具函式庫,所以
我無法公開釋出。隨著離職程序中,繳回前公司配給的 Windows Mobile 裝置後,我就
不再開發過 Windows 平台軟體了,有點可惜 [7]),使得新酷音輸入法的啟動時間大幅
縮短,因為原本是透過 C 標準函式庫的 fopen, fread, fwrite, fclose 等操作進行
stream I/O 再逐步建立輸入法所需要的樹狀結構,現在透過 mmap 一類的系統呼叫,讓
作業系統建立檔案和虛擬記憶體的映射關係,只要預先將樹狀結構予以適度的保存 (即
serialization),即可快速地進行資料操作。(在過去,現在我不清楚) 在 Microsoft
Windows 平台,新酷音輸入法啟動的時間比自然輸入法來得迅速,有部分是上述機制 [8]
的運用。
再舉一個我參與開發過的案例。
2019 年 Linux 核心正式收錄發展超過十年的 PREEMPT_RT [9],成為 Linux 5.3 版的
特徵之一,這意味著 Linux 核心已具備 hard realtime (硬即時) 和 soft realtime
(軟即時,也寫作 soft-RT) 能力的作業系統基礎。soft-RT 應用情境絕對不限於工業
自動化一類,而是跟你我生活息息相關,怎麼說呢?
Android 的音效處理很複雜,首先要處理混音 (mixer),也就是,不管前景應用程式是
什麼,一旦有多個音訊要合成,系統就該在夠低的延遲達成 (注意: 音訊可能有不同的
取樣頻率),這點就仰賴 Linux 核心的 CONFIG_PREEMPT 組態 [10]。另外,你一定有遇
過在 Android 手機上全螢幕播放 YouTube 影片,享受聲音和影像流暢展現時,突然
LINE 跳出新的訊息,這時 YouTube 的音量會隨之降低,不過 LINE 的提示聲音卻一如
平常,這樣的訊號合成相當自然,但作為系統規劃,卻格外困難,試想以下問題:
「Android 環境下的 YouTube 應用程式事先知道 LINE 的存在嗎?」
「LINE 要觸發新訊息的新視窗和聲響,會知道前景應用程式是 YouTube 嗎?」
這背後的運作機制透過名為 AudioFlinger 的 Android 系統元件,後者仰賴著 Linux
核心的 soft-RT 能力。這過程中還涉及到即時系統的經典議題 -- Priority inversion
[11],並在 Android 手機中,還需要正視 SMP 和 futex 實作,有意思吧!請參閱
Android 官方文件的精彩討論:
https://source.android.com/devices/audio/avoiding_pi
寫程式要不要懂作業系統核心呢?取決於你對程式行為的要求、人們對你的期許,還有
是否有機會持續精進下去。
(咦?你不小心讀到這裡了嗎?進入廣告時間)
歡迎關注全台灣唯一探討 Linux 最新技術的正式大學課程「Linux 核心設計」,大部分
的教材和講講錄影都可線上免費存取,請見:
http://wiki.csie.ncku.edu.tw/linux/schedule
我們從電腦原理 (像是二進位數值系統) 開始探討起,逐步帶領學員「誠實面對自己」,
掌握相關背景知識後,嘗試跟原始程式碼近於兩千八百萬行的 Linux 核心去互動。姐妹
課程包含「你所不知道的 C 語言」:
https://hackmd.io/@sysprog/c-prog/
在大學教了幾年嵌入式系統後,我深深體會到這個事實:與其說學生對嵌入式系統掌握度
不足,不如說為數眾多的人根本只是學 C 程式語言的語法,而從未想過背後的原理、
語言設計者的思維和理念,以及在真實環境中的關聯。
古希臘 Delphi 神殿前,有一則神諭寫道 "Know Thyself",也就是「誠實面對自己」,
我們程式設計師就該從技術、團隊合作、理性思考,以及培養堅忍不拔精神等方面, 找
到自我,從而建立自信。於是,從 2015 年秋季開始,我做了一系列的調整,重新探討 C
語言程式設計,安排了「你所不知道的 C 語言」系列講座,透過實體和線上直播課程,
整理這二十年來程式設計經驗,帶著學員參考第一手的資料 (例如 ISO/IEC 9899 C 語言
規格),並善用系統開發工具 (如 GNU Debugger),屏棄過往臆測為主的學習方式,探究
實際 C 程式的行為並反思箇中原理,讓人得以正視自己的盲點,從而打下穩固的基礎。
[1] 關於紀錄片《Revolution OS》的導讀點評和資訊補充,可參見共筆:
https://hackmd.io/@sysprog/revolution-os-note
[2] 線上存取: http://pages.cs.wisc.edu/~remzi/OSTEP/
該書有簡體中文、日本語,及韓語的翻譯:
https://github.com/remzi-arpacidusseau/ostep-translations
至於《Operating Systems: Three Easy Pieces》(可簡稱為 OSTEP) 的
"Three Easy Piece" 也有典故,是向已故物理學家費曼致敬,後者著有
《Six Easy Pieces: Essentials Of Physics Explained By Its Most Brilliant
Teacher》。用 OSTEP 作者的話說,作業系統只有物理學一半難度,那就折半為
《Three Easy Pieces》,該書的三大主軸:
- 虛擬化 (Virtualization);
- 並行 (Concurrency);
- 持續保存 (Persistence): 主要探討檔案系統;
[3] 《The UNIX Time Sharing System》
http://www.cs.berkeley.edu/~brewer/cs262/unix.pdf
[4] 新酷音輸入法: http://chewing.im/
[5] TaBE 計畫和相關 CLE (Chinese Linux Extension) 時代的自由軟體:
https://www.debian.org/international/Chinese/software.zh-tw.html
libTaBE 是 X11 輸入法 xcin 所用的詞庫函式庫. 這個函式庫採用 Berkelay DB
作為資料庫,以 Big5 編碼為主,但該函式庫所用的斷詞演算法跟基本字詞的資料
結構框架仍是自由軟體世界的開創性作品。
[6] mmap, munmap - map or unmap files or devices into memory
http://man7.org/linux/man-pages/man2/mmap.2.html
[7] 以前我跟公司女同事或客戶公司女性職員搭訕,會說「你現在用的中文輸入法是我
投入開發的」,後來就改說 Android 系統了。這招實在老套,不過竟然結識現在的
老婆,開發自由軟體可引導人走向幸福喔 (*笑*)
[8] 相關程式碼:
https://github.com/chewing/libchewing/tree/master/src/porting_layer
[9] PREEMPT_RT: https://rt.wiki.kernel.org/
[10] 該核心組態決定 kernel preemption (核心搶佔) 的能力,對於作業系統內部有
可觀的變動:
https://en.wikipedia.org/wiki/Kernel_preemption
[11] Priority inversion
https://en.wikipedia.org/wiki/Priority_inversion
可搭配拙作〈Priority Inversion on Mars〉閱讀:
http://wiki.csie.ncku.edu.tw/embedded/priority-inversion-on-Mars.pdf
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.246.163 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Gossiping/M.1587668580.A.099.html
推
04/24 03:03,
4年前
, 1F
04/24 03:03, 1F
推
04/24 03:04,
4年前
, 2F
04/24 03:04, 2F
推
04/24 03:04,
4年前
, 3F
04/24 03:04, 3F
推
04/24 03:04,
4年前
, 4F
04/24 03:04, 4F
推
04/24 03:05,
4年前
, 5F
04/24 03:05, 5F
推
04/24 03:05,
4年前
, 6F
04/24 03:05, 6F
推
04/24 03:05,
4年前
, 7F
04/24 03:05, 7F
推
04/24 03:05,
4年前
, 8F
04/24 03:05, 8F
推
04/24 03:06,
4年前
, 9F
04/24 03:06, 9F
推
04/24 03:07,
4年前
, 10F
04/24 03:07, 10F
推
04/24 03:08,
4年前
, 11F
04/24 03:08, 11F
→
04/24 03:08,
4年前
, 12F
04/24 03:08, 12F
推
04/24 03:08,
4年前
, 13F
04/24 03:08, 13F
→
04/24 03:09,
4年前
, 14F
04/24 03:09, 14F
推
04/24 03:09,
4年前
, 15F
04/24 03:09, 15F
推
04/24 03:09,
4年前
, 16F
04/24 03:09, 16F
→
04/24 03:09,
4年前
, 17F
04/24 03:09, 17F
推
04/24 03:09,
4年前
, 18F
04/24 03:09, 18F
→
04/24 03:10,
4年前
, 19F
04/24 03:10, 19F
推
04/24 03:10,
4年前
, 20F
04/24 03:10, 20F
推
04/24 03:10,
4年前
, 21F
04/24 03:10, 21F
→
04/24 03:10,
4年前
, 22F
04/24 03:10, 22F
推
04/24 03:11,
4年前
, 23F
04/24 03:11, 23F
推
04/24 03:11,
4年前
, 24F
04/24 03:11, 24F
推
04/24 03:12,
4年前
, 25F
04/24 03:12, 25F
推
04/24 03:13,
4年前
, 26F
04/24 03:13, 26F
推
04/24 03:14,
4年前
, 27F
04/24 03:14, 27F
→
04/24 03:14,
4年前
, 28F
04/24 03:14, 28F
推
04/24 03:14,
4年前
, 29F
04/24 03:14, 29F
推
04/24 03:14,
4年前
, 30F
04/24 03:14, 30F
推
04/24 03:15,
4年前
, 31F
04/24 03:15, 31F
→
04/24 03:15,
4年前
, 32F
04/24 03:15, 32F
→
04/24 03:15,
4年前
, 33F
04/24 03:15, 33F
→
04/24 03:15,
4年前
, 34F
04/24 03:15, 34F
推
04/24 03:15,
4年前
, 35F
04/24 03:15, 35F
→
04/24 03:16,
4年前
, 36F
04/24 03:16, 36F
→
04/24 03:17,
4年前
, 37F
04/24 03:17, 37F
→
04/24 03:18,
4年前
, 38F
04/24 03:18, 38F
推
04/24 03:19,
4年前
, 39F
04/24 03:19, 39F
還有 313 則推文
還有 1 段內文
推
04/24 11:55,
4年前
, 353F
04/24 11:55, 353F
推
04/24 11:56,
4年前
, 354F
04/24 11:56, 354F
推
04/24 12:13,
4年前
, 355F
04/24 12:13, 355F
推
04/24 12:17,
4年前
, 356F
04/24 12:17, 356F
推
04/24 12:24,
4年前
, 357F
04/24 12:24, 357F
推
04/24 12:29,
4年前
, 358F
04/24 12:29, 358F
推
04/24 12:29,
4年前
, 359F
04/24 12:29, 359F
推
04/24 12:34,
4年前
, 360F
04/24 12:34, 360F
推
04/24 12:35,
4年前
, 361F
04/24 12:35, 361F
→
04/24 12:36,
4年前
, 362F
04/24 12:36, 362F
推
04/24 12:51,
4年前
, 363F
04/24 12:51, 363F
推
04/24 13:00,
4年前
, 364F
04/24 13:00, 364F
推
04/24 13:00,
4年前
, 365F
04/24 13:00, 365F
推
04/24 13:06,
4年前
, 366F
04/24 13:06, 366F
推
04/24 13:10,
4年前
, 367F
04/24 13:10, 367F
推
04/24 13:32,
4年前
, 368F
04/24 13:32, 368F
推
04/24 13:34,
4年前
, 369F
04/24 13:34, 369F
推
04/24 13:35,
4年前
, 370F
04/24 13:35, 370F
推
04/24 13:38,
4年前
, 371F
04/24 13:38, 371F
推
04/24 13:48,
4年前
, 372F
04/24 13:48, 372F
推
04/24 14:19,
4年前
, 373F
04/24 14:19, 373F
推
04/24 14:35,
4年前
, 374F
04/24 14:35, 374F
→
04/24 14:39,
4年前
, 375F
04/24 14:39, 375F
推
04/24 15:34,
4年前
, 376F
04/24 15:34, 376F
推
04/24 15:38,
4年前
, 377F
04/24 15:38, 377F
推
04/24 16:33,
4年前
, 378F
04/24 16:33, 378F
推
04/24 16:49,
4年前
, 379F
04/24 16:49, 379F
推
04/24 16:57,
4年前
, 380F
04/24 16:57, 380F
推
04/24 17:50,
4年前
, 381F
04/24 17:50, 381F
推
04/24 19:57,
4年前
, 382F
04/24 19:57, 382F
推
04/24 22:35,
4年前
, 383F
04/24 22:35, 383F
推
04/25 00:28,
4年前
, 384F
04/25 00:28, 384F
推
04/25 01:02,
4年前
, 385F
04/25 01:02, 385F
推
04/25 14:11,
4年前
, 386F
04/25 14:11, 386F
推
04/25 15:02,
4年前
, 387F
04/25 15:02, 387F
推
04/25 16:22,
4年前
, 388F
04/25 16:22, 388F
推
04/26 09:19,
4年前
, 389F
04/26 09:19, 389F
推
04/26 14:34,
4年前
, 390F
04/26 14:34, 390F
推
04/28 00:39,
4年前
, 391F
04/28 00:39, 391F
推
05/20 21:56,
4年前
, 392F
05/20 21:56, 392F
討論串 (同標題文章)
完整討論串 (本文為第 3 之 3 篇):