看板 Gossiping作者 jserv (松鼠)標題 Re: [問卦] 精通作業系統對Coding有什麼幫助?時間 Fri Apr 24 03:02:49 2020
※ 引述《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 (臺灣)
※ 文章代碼(AID): #1UeUPa2P (Gossiping)
※ 文章網址: https://www.ptt.cc/bbs/Gossiping/M.1587668580.A.099.html
推 Ponimp: 文組 寫那麼長 好啦 我認輸5F 04/24 03:05
推 johnhmj: 快來推,不然別人會以為我看不懂。7F 04/24 03:05
推 lice0225: 看到一半覺得太神 回去看id跪了11F 04/24 03:08
→ jserv: 網路盛傳的羅志祥「時間管理高端課程」,也能用作業系統的12F 04/24 03:08
推 hy456: 未看先推13F 04/24 03:08
→ jserv: scheduling policy 來解釋,甚至設計實驗來量化14F 04/24 03:09
→ jserv: 其實我本來要寫「跟著羅志祥學習作業系統排程」17F 04/24 03:09
推 wuyiulin: 跟羅志祥學習作業系統,笑死21F 04/24 03:10
→ jserv: @nikewang, 我文組,請不要嘲笑我 > <22F 04/24 03:10
→ upeo: 老師你還沒睡喔!?28F 04/24 03:14
推 oxlittle: 完蛋,一半看不懂,看來要重修OS了31F 04/24 03:15
→ jserv: @upeo, 天氣冷不好睡,跟鄉民取暖 (?)32F 04/24 03:15
→ upeo: 可以寫羅志祥約跑AI嗎?33F 04/24 03:15
→ jserv: @oxlittle, 坊間補習班不就先讓你感到焦慮,再推課程嗎?34F 04/24 03:15
推 wahaha99: jserv自稱文組那我們都變成武組了35F 04/24 03:15
→ jserv: @upeo, 等我消化完羅志祥的新聞,再來探討事件驅動+排程
甚至是資訊安全的議題,這太有趣啦
@michellehot, 自爆開發輸入法是為了把妹 (咦?)36F 04/24 03:16
推 imba8591: 看開庭就知道是j大了 先跪再說
*開頭40F 04/24 03:19
→ jserv: @hiimlive, 閣下多多提交程式碼,也可以變成共同作者呀46F 04/24 03:21
推 hiimlive: 謝謝你無私分享,新酷音是我這輩子用過最棒的輸入法47F 04/24 03:23
→ jserv: @y35246357468, 我還在跟羅志祥學習,用身體排程才是王道文組如我只能貼廢文,嘆氣52F 04/24 03:25
推 lovespre: 這跟很多developer tcp ip中的Socket不懂但用工具還是會55F 04/24 03:26
推 ericrobin: 推OSTEP 上學期才上Andrea的課56F 04/24 03:27
推 atpx: 靠妖 竟然看到大神. 半夜不睡覺是在coding逆58F 04/24 03:27
推 over117: 半夜還沒睡看大神,跟原po有一樣OS問題的說明,好文推薦60F 04/24 03:28
推 wei115: 先搶推 再看61F 04/24 03:28
推 atpx: 用注音輸入法搭訕真變態, 但也真有笑67F 04/24 03:32
推 lwrwang: 大神半夜不睡覺呀!68F 04/24 03:32
推 jaid: 前排70F 04/24 03:32
推 upeo: 補推71F 04/24 03:33
※ 編輯: jserv (140.116.246.163 臺灣), 04/24/2020 03:35:48
推 selfhu: 所以是松鼠拐人家還是被拐啊?73F 04/24 03:34
推 DrOGC: = =太神75F 04/24 03:36
推 cscscsxdd: 開拜 身為一個考研仔 看到這長篇大論 只能跪著膜拜77F 04/24 03:36
推 hdjj: 推大神,真正的專家78F 04/24 03:36
推 hank850503: 大神 剛好在修 OS 的開放式課程 覺得轉來這門好了85F 04/24 03:44
推 hank850503: 那我可以許願 精通 OS 對 CA 有什麼幫助嗎89F 04/24 03:47
→ jserv: @hank850503, 以虛擬化技術來說,是作業系統驅使處理器架構91F 04/24 03:49
推 DLHZ: 釣到啦 推文有助於趕工作業嗎92F 04/24 03:50
→ jserv: 的演化,像是 Intel VT-x/VT-d 都直接來自作業系統的影響93F 04/24 03:51
推 TaoKappa: 想問老師對於 container 這種技術應用在嵌入式裝置的看法95F 04/24 03:59
→ jserv: @TaoKappa, 我沒啥看法,container早就被嵌入式裝置所用
例如 NVIDIA 的 Jetson AGX Xavier/TX2/TX1/Nano 等系列都有對應的 container 支援,請見 nvidia-docker98F 04/24 04:01
--