看板 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
推 TakiDog: 這麼晚還能拜神XD101F 04/24 04:04
推 donkilu: 推jserv大神102F 04/24 04:04
推 paladada: 用簡單說法作業系統為平台 , 程式為工具 硬體決定平台執行工具效率104F 04/24 04:06
推 Anth: 推107F 04/24 04:14
推 justhit666: 我真的要直接收藏這篇,還是老師要找個地方放一下你寫109F 04/24 04:15
推 a2470abc: 松鼠推 恐龍書要靜下心 無旁騖才能看下去117F 04/24 04:21
推 hella: 拜118F 04/24 04:22
→ jserv: @ILoveSoyMilk, 我不想因為教課而登上靠北成大123F 04/24 04:26
→ jserv: @MorikonHase, 早餐也可以自幹呀,Hack!125F 04/24 04:27
→ jserv: @ILoveSoyMilk, 以前我教過資訊系必修課,但心好累,後來就131F 04/24 04:31
→ jserv: 只開涼課(高達八成退選率,教室很涼)和甜課(指給分)133F 04/24 04:32
→ jserv: @a2470abc, 上面提到的OSTEP線上教科書比恐龍書闡述更清晰137F 04/24 04:34
推 Zein: 神人拜138F 04/24 04:35
推 JMLee: 使用新酷音十餘年,來拜神了 OTL140F 04/24 04:39
推 HKuo: 哇 身為外校生的我想去您的課堂上旁聽XD141F 04/24 04:41
推 romber: 宅色夫神人!142F 04/24 04:43
→ jserv: @HKuo, 可先參考線上教材和解說錄影
現在用線上授課,無法當面罵^H看學生,有點失落143F 04/24 04:43
推 salkuo: 哇 看起來就很強XD149F 04/24 04:47
→ jserv: @scotch77642, 提供三個程式設計的小秘訣,簡稱「供三小」151F 04/24 04:58
推 loveqn: 只能推了152F 04/24 05:01
推 charF: 每次都這時間發文,還讓不讓人安心就寢!157F 04/24 05:18
推 VVay: 有神快拜
我中斷好久了 謝謝老師提供課程,真的感謝158F 04/24 05:23
推 piece1: 快推!不然會被笑看不懂165F 04/24 05:57
推 genty: 這位大哥真的很酷167F 04/24 06:09
→ jserv: 相關討論: #1UeX4k_6 (數位邏輯和程式設計的關聯)169F 04/24 06:10
推 xinghh: 你是在寫論文是不是啦!172F 04/24 06:14
→ jserv: @xinghh, 爆卦: 大學教授在 Ptt 進行論文同儕審查 (?)173F 04/24 06:18
推 Perona: 神串留名174F 04/24 06:18
推 airyptt: 原來是新酷音開發之一...猛176F 04/24 06:21
推 airyptt: 請問有個人學習筆記或是wiki之類的網站可以學習嗎? 謝謝179F 04/24 06:25
推 jjlee: 專業用心推181F 04/24 06:27
推 hhand: 厲害187F 04/24 06:45
推 fox1375: 謝謝,新酷音真的超好用192F 04/24 06:54
推 pakls: 保重身體194F 04/24 06:56
推 doom3: 這一篇文章值 648 Ptt幣197F 04/24 07:02
推 otspc: 拜206F 04/24 07:15
推 cons: 推207F 04/24 07:16
→ marc47: 酷音好用,現在都還在用208F 04/24 07:17
推 BDrip: 只可惜有些遊戲的反駭客程式會對新酷音視為非正常軟體..211F 04/24 07:19
推 Pictor: 原來新酷音背後有這樣的故事,推217F 04/24 07:32
推 ptta: 這個文組越看越不對勁222F 04/24 07:44
噓 zo6al: 太長225F 04/24 07:52
推 lionet: 這個文組來的讓我甘拜下風231F 04/24 08:00
推 tom50512: 新酷音作者?跪惹 感謝您的開發讓輸入注音也能客製化234F 04/24 08:06
推 foxher: 這樣你跟我講文組,我都跪著看了239F 04/24 08:10
推 foxher: 再推一下新酷音,可說沒有新酷音就沒有新注音248F 04/24 08:15
→ reemir: 只能推
推252F 04/24 08:19
推 OGC218: 看不懂@@257F 04/24 08:26
推 gggaaammm: 恐龍書把hard-RT寫得一副很難用的樣子 沒想到安卓就含有硬軟即時整合 太神啦259F 04/24 08:30
推 acolam: 太屌推 看完262F 04/24 08:38
推 rXIN: 推268F 04/24 08:44
推 erre: 掰陳行動說明書,都直接AI機器人了,誰跟你作業系統269F 04/24 08:48
推 ddoy7: 推276F 04/24 08:51
推 marsai: 你說你文組??賣鬧啊280F 04/24 08:58
推 loxic: 推284F 04/24 09:03
推 yuetsu: 學語言的 文組無誤286F 04/24 09:14
推 esprade: 新酷音好用,可是WIN10常常一堆狀況....Q_Q291F 04/24 09:26
推 wetor: 神292F 04/24 09:28
推 ukfa: 娘子快出來看,有神,快拜295F 04/24 09:33
→ foxey: 其實對中文輸入最大不滿就詞彙轉換正確度有夠低
另外就是用久了常用字因為溢位?跑到選單最後面,使用經驗差298F 04/24 09:35
→ foxey: UI是很不錯了但是轉換正確度和bug好像都沒進步301F 04/24 09:36
推 lopas: 有神快拜302F 04/24 09:38
推 evencycu: 太強了 身為文組 受小弟一拜303F 04/24 09:39
推 anstt: 膜拜307F 04/24 09:45
推 iamOsaka: 請問宅瑟夫大 做為一個跨考仔是不是該把傳說中的CMU神308F 04/24 09:46
推 hizuki: audio的議題非常有意思311F 04/24 09:46
→ denyy555: 好煩,文組都這麼強了,理組低薪也是正常的,人生難啊!312F 04/24 09:47
推 ATOLI: 來拜神了(跪316F 04/24 09:57
推 ssisters: 拜~ 完全不懂資工 但喜歡研究電腦 感激科普版的說明323F 04/24 10:08
推 nfsong: 大家快來跪334F 04/24 10:45
推 gugugaga: 超討厭案子在不同平台之間porting來porting去QQ336F 04/24 10:52
推 iamOsaka: 感謝宅瑟夫指引,趕在研所開學前把您的課跟CSAPP好好看一看337F 04/24 10:57
推 fruitmin: 崇拜 m ( _ _ )m340F 04/24 10:59
推 bigpon: 有看有推341F 04/24 10:59
推 HTH88: 朝聖350F 04/24 11:30
推 asidy: 專業推353F 04/24 11:55
推 asurada: 老師好 先奉上學生的膝蓋XD354F 04/24 11:56
推 rltc: 這個也要cue羅志祥XD355F 04/24 12:13
推 prokofieff: 可以請教怎麼入門Android底層嗎? 好少課本在講這個360F 04/24 12:34
推 pig0038: 有神快拜,我還以為我來錯版361F 04/24 12:35
→ prokofieff: 感覺AOSP官網資料也講的零零散散的 苦腦中...362F 04/24 12:36
推 eric2057: 你文組 全台灣大概沒幾個理組了363F 04/24 12:51
推 Chifung: 先拜再說。老師好364F 04/24 13:00
推 LJP2: 推365F 04/24 13:00
推 saedn: 有公開課程真好367F 04/24 13:10
→ jserv: @prokofieff, 以前只能啃 AOSP 原始程式碼,現在有零散文件375F 04/24 14:39
推 prokofieff: @jserv 好吧 只能慢慢啃ASOP文件 感恩!376F 04/24 15:34
推 Sunofgod: 推學長 這才是八卦該有的文章水準379F 04/24 16:49
--