看板 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 語言」系列講座 - HackMD
[圖]
回歸第一手資料,透過反思 C 語言程式設計的細節,重新學習電腦原理 ...

 

在大學教了幾年嵌入式系統後,我深深體會到這個事實:與其說學生對嵌入式系統掌握度
不足,不如說為數眾多的人根本只是學 C 程式語言的語法,而從未想過背後的原理、
語言設計者的思維和理念,以及在真實環境中的關聯。

古希臘 Delphi 神殿前,有一則神諭寫道 "Know Thyself",也就是「誠實面對自己」,
我們程式設計師就該從技術、團隊合作、理性思考,以及培養堅忍不拔精神等方面, 找
到自我,從而建立自信。於是,從 2015 年秋季開始,我做了一系列的調整,重新探討 C
語言程式設計,安排了「你所不知道的 C 語言」系列講座,透過實體和線上直播課程,
整理這二十年來程式設計經驗,帶著學員參考第一手的資料 (例如 ISO/IEC 9899 C 語言
規格),並善用系統開發工具 (如 GNU Debugger),屏棄過往臆測為主的學習方式,探究
實際 C 程式的行為並反思箇中原理,讓人得以正視自己的盲點,從而打下穩固的基礎。

[1] 關於紀錄片《Revolution OS》的導讀點評和資訊補充,可參見共筆:

    https://hackmd.io/@sysprog/revolution-os-note
從 _Revolution OS_ 看作業系統生態變化 - HackMD
[圖]
這部紀錄片《==_Revolution OS_==》在 21 世紀的第一年發布,是刻畫自由軟體和開發原始碼的經典,為了教學需求,我們透過共筆,選錄部份內容作資訊更新和補充 ...

 
[2] 線上存取: http://pages.cs.wisc.edu/~remzi/OSTEP/
    該書有簡體中文、日本語,及韓語的翻譯:
    https://github.com/remzi-arpacidusseau/ostep-translations
GitHub - remzi-arpacidusseau/ostep-translations: Various translations of OSTEP can be found here. Help the cause and contribute!
[圖]
Various translations of OSTEP can be found here. Help the cause and contribute! - 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
libchewing/src/porting_layer at master ·  chewing/libchewing ·  GitHub
[圖]
libchewing - The intelligent phonetic input method library - chewing/libchewing ...

 
[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
longman: 拜1F 04/24 03:03
wuyiulin: 宅瑟夫2F 04/24 03:04
xxoooxx34567: 推3F 04/24 03:04
frouscy: 拜4F 04/24 03:04
Ponimp: 文組 寫那麼長 好啦 我認輸5F 04/24 03:05
jerry10127: 神6F 04/24 03:05
johnhmj: 快來推,不然別人會以為我看不懂。7F 04/24 03:05
sleepylife: 卡前排8F 04/24 03:05
Kawasumi: 看ID先拜9F 04/24 03:06
DarkerDuck: 朝聖10F 04/24 03:07
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
hdotistyle: 先推 免得別人說我看不懂15F 04/24 03:09
HowLeeHi: jserv大神!!!16F 04/24 03:09
jserv: 其實我本來要寫「跟著羅志祥學習作業系統排程」17F 04/24 03:09
michellehot: 哇 輸入法本人耶 跪啦18F 04/24 03:09
nikewang: 文獻回顧我也會19F 04/24 03:10
Blumenkranz: 神串留名20F 04/24 03:10
wuyiulin: 跟羅志祥學習作業系統,笑死21F 04/24 03:10
jserv: @nikewang, 我文組,請不要嘲笑我 > <22F 04/24 03:10
NickXiang: 只能推了23F 04/24 03:11
nthulibrary: 百推留名24F 04/24 03:11
eric21489: 我就知道會釣到 老師好25F 04/24 03:12
Behind4: 好文給推26F 04/24 03:13
rogerxhi: 太神了27F 04/24 03:14
upeo: 老師你還沒睡喔!?28F 04/24 03:14
messi5566: 朝聖29F 04/24 03:14
sad0soul: 有神快拜30F 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
bmpss92196: 朝聖39F 04/24 03:19
imba8591: 看開庭就知道是j大了 先跪再說
*開頭40F 04/24 03:19
hiimlive: 你是新酷音作者?42F 04/24 03:20
nckuhenry: 神43F 04/24 03:20
st9061204: 百推內快推44F 04/24 03:20
ohsuoh: 先推45F 04/24 03:21
jserv: @hiimlive, 閣下多多提交程式碼,也可以變成共同作者呀46F 04/24 03:21
hiimlive: 謝謝你無私分享,新酷音是我這輩子用過最棒的輸入法47F 04/24 03:23
aether982: 留名48F 04/24 03:23
CrazyBug: 大神49F 04/24 03:23
y35246357468: 你他馬的可不可以不要那麼專業50F 04/24 03:23
juju123: 推了看了安心了51F 04/24 03:24
jserv: @y35246357468, 我還在跟羅志祥學習,用身體排程才是王道文組如我只能貼廢文,嘆氣52F 04/24 03:25
ufap: 拜54F 04/24 03:25
lovespre: 這跟很多developer tcp ip中的Socket不懂但用工具還是會55F 04/24 03:26
ericrobin: 推OSTEP 上學期才上Andrea的課56F 04/24 03:27
SydLrio: 看不完啦幹!57F 04/24 03:27
atpx: 靠妖 竟然看到大神. 半夜不睡覺是在coding逆58F 04/24 03:27
crazytim: 深夜推一個,睡醒了再看59F 04/24 03:28
over117: 半夜還沒睡看大神,跟原po有一樣OS問題的說明,好文推薦60F 04/24 03:28
wei115: 先搶推 再看61F 04/24 03:28
sheep531531: 老師早安62F 04/24 03:29
Ahhhhaaaa: 所以作業系統就等於使用者介面嗎?63F 04/24 03:30
bill4051326: 朝聖64F 04/24 03:30
hank61204: 推65F 04/24 03:31
redumbrella: 好的 廣告時間66F 04/24 03:32
atpx: 用注音輸入法搭訕真變態, 但也真有笑67F 04/24 03:32
lwrwang: 大神半夜不睡覺呀!68F 04/24 03:32
breezeying: 拜69F 04/24 03:32
jaid: 前排70F 04/24 03:32
upeo: 補推71F 04/24 03:33
aromaraz: 推大神72F 04/24 03:34
※ 編輯: jserv (140.116.246.163 臺灣), 04/24/2020 03:35:48
selfhu: 所以是松鼠拐人家還是被拐啊?73F 04/24 03:34
legendmtg: <(_ _)>74F 04/24 03:35
DrOGC: = =太神75F 04/24 03:36
jojoStar: 宅76F 04/24 03:36
cscscsxdd: 開拜 身為一個考研仔 看到這長篇大論 只能跪著膜拜77F 04/24 03:36
hdjj: 推大神,真正的專家78F 04/24 03:36
SamuelLuo:  推神79F 04/24 03:37
NciscalA: 拜80F 04/24 03:37
ATND: 推81F 04/24 03:39
staylong: 推82F 04/24 03:41
Higana: 推83F 04/24 03:43
a58524andy: push84F 04/24 03:43
hank850503: 大神 剛好在修 OS 的開放式課程 覺得轉來這門好了85F 04/24 03:44
globeMIX: 拜86F 04/24 03:44
rickphyman42: 推大師87F 04/24 03:45
b90022790: 推88F 04/24 03:46
hank850503: 那我可以許願 精通 OS 對 CA 有什麼幫助嗎89F 04/24 03:47
dearjohn: www90F 04/24 03:49
jserv: @hank850503, 以虛擬化技術來說,是作業系統驅使處理器架構91F 04/24 03:49
DLHZ: 釣到啦 推文有助於趕工作業嗎92F 04/24 03:50
jserv: 的演化,像是 Intel VT-x/VT-d 都直接來自作業系統的影響93F 04/24 03:51
oioppp: 推94F 04/24 03:52
TaoKappa: 想問老師對於 container 這種技術應用在嵌入式裝置的看95F 04/24 03:59
Adiakyan: 有神快拜97F 04/24 03:59
jserv: @TaoKappa, 我沒啥看法,container早就被嵌入式裝置所用
例如 NVIDIA 的 Jetson AGX Xavier/TX2/TX1/Nano 等系列都有對應的 container 支援,請見 nvidia-docker98F 04/24 04:01
jixiang: 朝聖!381F 04/24 17:50
MattOwl: 有趣382F 04/24 19:57
fish1919: 推383F 04/24 22:35
yungyuan: 好猛 推384F 04/25 00:28
Artemisl: 有神快推385F 04/25 01:02

--
--
(jserv.): Re: [問卦] 精通作業系統對Coding有什麼幫助? - Gossiping板