Fw: [問卦] 精通數位邏輯對Coding有什麼幫助?
※ [本文轉錄自 Gossiping 看板 #1UeX4k_6 ]
作者: jserv (松鼠) 看板: Gossiping
標題: Re: [問卦] 精通數位邏輯對Coding有什麼幫助?
時間: Fri Apr 24 06:05:27 2020
※ 引述《HankYang (密探X)》之銘言:
: 餓死抬頭
: 不是說二進位、布林代數、邏輯閘等等那些超超超超基礎的東東
: 那些東東其他科目也會教
: 而是指正反器、循序邏輯電路、狀態機等等鬼東西
: 那些對Coding有什麼幫助呀嘻嘻嘻
: 有沒有八卦?
外頭雨勢好大,趁著等著雨勢減小才能吃早餐的空擋,嘗試簡單回覆。先講結論,網頁
伺服器背後的運作,跟數位邏輯有關,而且原始程式碼裡頭就寫了 (!)
原提問的推文下方,skaterboy13 提到:
「在這邊問這個做啥? 一堆裝懂的人 什麼都會說很基本」
的確,人人都可說「很基本」,但這樣的「基本」到底體現在何處呢?應是原發問者所
在意。我教計算機結構 [1],會對著學員說,數位邏輯很「基本」,畢竟現行的電腦即是
架構在一系列的組合邏輯電路之上。可是對於通用的程式設計有何幫助呢?特別是原發問
者所提的正反器 (Flip-flop, FF)、序向邏輯電路 (sequential logic circuit),及
狀態機等等「鬼東西」。或許這樣的質疑在不少人心裡都有,尤其抱持著「開發偉大的
程式」心態到了資訊工程系就讀的同學,發現電子電路、數位邏輯、微處理器等課程都是
必修,不免感嘆「踩到地雷」了。
「如果我們一定非要那鬼量子躍遷不可,那我後悔參與量子理論。」 -- 在愛因斯坦
等人發表題為「量子力學能完整地解釋實在性嗎?」的論文、反駁量子世界觀之後,
薛丁格提出「薛丁格的貓」(Schrodinger's cat) 的論文。
倘若量子力學是原子中的幽靈,那麼數位邏輯就是程式設計裡頭的幽靈 -- 是否能窺見、
是否「基本」,又能否給予你啟發,完全取決於你對於微觀世界的態度。
且讓我跳到開發高效率的網頁伺服器 (web server, 也稱 HTTP server 或 HTTP daemon,
後者的 "daemon" 原為惡魔之意,在 UNIX 的世界中引申爲常駐程式) 開發工作來討論,
再細談和數位邏輯的關聯。網頁伺服器這應該就符合原發問者對於程式設計的「程式」
標的物吧?但你有沒有想過,當你閱讀 NGINX [2] 一類高效率網頁伺服器的原始程式碼
時,會看到 Level-triggered 和 edge-triggered 等術語 -- 後兩者就是數位邏輯裡頭
正反器的術語,不是巧合,就是同個意思。
一時之間很難接受吧?以下摘錄自 NGINX Development guide [3]:
> All such events operate in Edge-Triggered mode, meaning that they only
> trigger notifications when the state of the socket changes. For example,
> doing a partial read on a socket does not make nginx deliver a repeated read
> notification until more data arrives on the socket. Even when the underlying
> I/O notification mechanism is essentially Level-Triggered (poll, select etc),
> nginx converts the notifications to Edge-Triggered.
這裡談及兩種工作模式:
* Edge Triggered (ET, 邊緣觸發)
_______________________
/ (positive-edge trigger
___/
* Level Triggered (LT, 條件觸發)
____ (level trigger)
| |
____| |____
ET 表示在狀態改變時才通知(例如: 在邊緣上從低電位到高電位),LT 表示在這個狀態
才通知(例如: 只要處於低電位就通知)。對應到上述的 NGINX 的網路通訊處理 (例如
socket),ET 指一旦有新資料就通知(狀態的改變),而 LT 是「只要有新資料」就會
持續通知,直到緩衝區的資料全數取出。
詳細的議題可參見 Linux 開發手冊關於 epoll [4] 的描述,我們不難發現,儘管網頁
伺服器是貨真價實的軟體,但裡頭術語和概念的展現,逃脫不了硬體給予隱喻和影響
(implication),我們學習數位邏輯就可強化對術語的認識,從而能夠和世界各地的高手
交流。
開發高效率的網頁伺服器免不了探討 I/O 事件模型,例如 blocking I/O vs.
non-blocking I/O 和 synchronous I/O vs. asynchronous I/O,然後仔細觀察這些術語
和含義後,不難發現也都可對應到組合邏輯電路的概念,無論時序抑或訊號同步的議題。
再來是狀態機 (state machine)。由於在高效能伺服器開發中,我們引入 non-blocking
I/O 後,整體程式開發的難度陡然上升,遇到到 blocking read 不曾遇到的問題:資料
可能分批送達,於是在通訊協定解析到一半時,read 就回傳 -1,所以我們必須將已讀到
的資料保存下來,並維護其狀態,以表示是否仍需要資料。例如解析 HTTP Request
Header 時,讀到 GET /index.html HTT (注意:少一個 P) 就結束,在 blocking I/O
裡只要繼續 read 就可處理,但在 nonblocking I/O,我們必須維護這個狀態,下一次
必須讀到欠缺的 P 字元,否則 HTTP 通訊協定會遇上解析錯誤。為此,我們就需要維護
一套狀態機,對!就跟數位邏輯所探討的是同一個術語。
在「Linux 核心設計」課程 [5] 中,我們展示一個原始程式碼不到 C 語言一千行的小
程式,卻具備約有 NGINX 一半資料吞吐量的網頁伺服器 seHTTPd,恰好就是數位邏輯
概念在真實世界的應用案例,相關資訊可見:
https://hackmd.io/@sysprog/fast-web-server
當然,這僅是起點,在課程中,我要求學員針對 Linux 系統特性和思索 web 情境去
探索更多更深刻的改進空間,而這一切,最佳化來自對系統的充分認知。引用羅輯思維
第 85 集: 費馬大定理 [6] 的結語:
「我們當中的絕大多數人,花了人生的十二年時光,六年小學,六年中學,被數學
摧殘,我們只知道數學是敲開大學校門的一個敲門磚,自打上了大學之後,這個
東西就被我們當做人生當中最痛苦的經驗,被刪除了。」
「人類知識領域智力領域的任何豐碑,從來都不是用強烈的目的性建造出來的,它的
每一塊磚,每一塊瓦,都是由興趣堆積出來的,興趣不僅導致了最後的成功,而且
點亮了其中的每一塊磚,每一塊瓦,每一個人的生命。」
在資訊工程 (或說電腦科學) 課程中,充斥著大量數學和電子硬體課程,其實就是上面
所提到的一磚一瓦,堆積著今日我們所見的數位世界的風情萬種。倘若我們一開始就戴著
有色眼鏡去駁斥這些科目的學習,是否限制了自已可能的寬敞發展呢?
喔,我又來打廣告,歡迎關注「Linux 核心設計」[5] 和 "Computer Architecture" [1]
這兩門課程,都有完整的線上教材可參考,也有練習題可讓學員隨時檢測自己所學。
[1] Computer Architecture
http://wiki.csie.ncku.edu.tw/arch/schedule
[2] NGINX: https://nginx.org/
根據 W3Techs 的統計資料,世界上最繁忙的網站前一萬名裡頭 57% 採用 NGINX
[3] NGINX Development guide
https://nginx.org/en/docs/dev/development_guide.html
[4] epoll - I/O event notification facility
http://man7.org/linux/man-pages/man7/epoll.7.html
[5] Linux 核心設計課程
http://wiki.csie.ncku.edu.tw/linux/schedule
[6] 羅輯思維 85 集: 費馬大定理
影片: https://youtu.be/bHexlr4b_j8
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.246.163 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Gossiping/M.1587679534.A.FC6.html
推
04/24 06:07,
4年前
, 1F
04/24 06:07, 1F
推
04/24 06:08,
4年前
, 2F
04/24 06:08, 2F
推
04/24 06:10,
4年前
, 3F
04/24 06:10, 3F
※ 編輯: jserv (140.116.246.163 臺灣), 04/24/2020 06:12:30
推
04/24 06:11,
4年前
, 4F
04/24 06:11, 4F
推
04/24 06:13,
4年前
, 5F
04/24 06:13, 5F
→
04/24 06:13,
4年前
, 6F
04/24 06:13, 6F
→
04/24 06:14,
4年前
, 7F
04/24 06:14, 7F
→
04/24 06:14,
4年前
, 8F
04/24 06:14, 8F
推
04/24 06:14,
4年前
, 9F
04/24 06:14, 9F
推
04/24 06:15,
4年前
, 10F
04/24 06:15, 10F
推
04/24 06:15,
4年前
, 11F
04/24 06:15, 11F
→
04/24 06:16,
4年前
, 12F
04/24 06:16, 12F
噓
04/24 06:17,
4年前
, 13F
04/24 06:17, 13F
→
04/24 06:18,
4年前
, 14F
04/24 06:18, 14F
→
04/24 06:19,
4年前
, 15F
04/24 06:19, 15F
推
04/24 06:20,
4年前
, 16F
04/24 06:20, 16F
→
04/24 06:21,
4年前
, 17F
04/24 06:21, 17F
→
04/24 06:21,
4年前
, 18F
04/24 06:21, 18F
推
04/24 06:21,
4年前
, 19F
04/24 06:21, 19F
推
04/24 06:25,
4年前
, 20F
04/24 06:25, 20F
推
04/24 06:28,
4年前
, 21F
04/24 06:28, 21F
推
04/24 06:35,
4年前
, 22F
04/24 06:35, 22F
推
04/24 06:36,
4年前
, 23F
04/24 06:36, 23F
→
04/24 06:36,
4年前
, 24F
04/24 06:36, 24F
推
04/24 06:37,
4年前
, 25F
04/24 06:37, 25F
→
04/24 06:37,
4年前
, 26F
04/24 06:37, 26F
→
04/24 06:38,
4年前
, 27F
04/24 06:38, 27F
→
04/24 06:38,
4年前
, 28F
04/24 06:38, 28F
→
04/24 06:39,
4年前
, 29F
04/24 06:39, 29F
推
04/24 06:39,
4年前
, 30F
04/24 06:39, 30F
→
04/24 06:40,
4年前
, 31F
04/24 06:40, 31F
推
04/24 06:41,
4年前
, 32F
04/24 06:41, 32F
→
04/24 06:43,
4年前
, 33F
04/24 06:43, 33F
→
04/24 06:43,
4年前
, 34F
04/24 06:43, 34F
推
04/24 06:46,
4年前
, 35F
04/24 06:46, 35F
推
04/24 06:46,
4年前
, 36F
04/24 06:46, 36F
→
04/24 06:47,
4年前
, 37F
04/24 06:47, 37F
→
04/24 06:48,
4年前
, 38F
04/24 06:48, 38F
還有 116 則推文
還有 1 段內文
推
04/24 13:33,
4年前
, 155F
04/24 13:33, 155F
推
04/24 13:40,
4年前
, 156F
04/24 13:40, 156F
推
04/24 13:46,
4年前
, 157F
04/24 13:46, 157F
推
04/24 14:25,
4年前
, 158F
04/24 14:25, 158F
推
04/24 15:31,
4年前
, 159F
04/24 15:31, 159F
推
04/24 17:16,
4年前
, 160F
04/24 17:16, 160F
推
04/24 20:57,
4年前
, 161F
04/24 20:57, 161F
推
04/24 21:08,
4年前
, 162F
04/24 21:08, 162F
推
04/24 21:39,
4年前
, 163F
04/24 21:39, 163F
推
04/24 22:00,
4年前
, 164F
04/24 22:00, 164F
推
04/24 23:14,
4年前
, 165F
04/24 23:14, 165F
推
04/25 08:13,
4年前
, 166F
04/25 08:13, 166F
→
04/25 08:13,
4年前
, 167F
04/25 08:13, 167F
→
04/25 08:13,
4年前
, 168F
04/25 08:13, 168F
推
04/25 08:27,
4年前
, 169F
04/25 08:27, 169F
推
04/25 09:38,
4年前
, 170F
04/25 09:38, 170F
推
04/25 13:26,
4年前
, 171F
04/25 13:26, 171F
→
04/26 05:35,
4年前
, 172F
04/26 05:35, 172F
推
04/26 13:51,
4年前
, 173F
04/26 13:51, 173F
推
04/26 16:56,
4年前
, 174F
04/26 16:56, 174F
→
04/26 16:56,
4年前
, 175F
04/26 16:56, 175F
→
04/26 16:57,
4年前
, 176F
04/26 16:57, 176F
推
04/26 16:59,
4年前
, 177F
04/26 16:59, 177F
→
04/26 16:59,
4年前
, 178F
04/26 16:59, 178F
→
04/26 16:59,
4年前
, 179F
04/26 16:59, 179F
推
04/26 17:02,
4年前
, 180F
04/26 17:02, 180F
→
04/26 17:02,
4年前
, 181F
04/26 17:02, 181F
→
04/26 17:13,
4年前
, 182F
04/26 17:13, 182F
→
04/26 17:13,
4年前
, 183F
04/26 17:13, 183F
→
04/26 17:13,
4年前
, 184F
04/26 17:13, 184F
→
04/26 17:13,
4年前
, 185F
04/26 17:13, 185F
→
04/26 17:13,
4年前
, 186F
04/26 17:13, 186F
→
04/26 17:13,
4年前
, 187F
04/26 17:13, 187F
→
04/26 17:13,
4年前
, 188F
04/26 17:13, 188F
→
04/26 17:13,
4年前
, 189F
04/26 17:13, 189F
→
04/27 16:40,
4年前
, 190F
04/27 16:40, 190F
→
04/27 16:41,
4年前
, 191F
04/27 16:41, 191F
→
04/27 16:42,
4年前
, 192F
04/27 16:42, 192F
→
04/27 16:42,
4年前
, 193F
04/27 16:42, 193F
推
04/28 20:21,
4年前
, 194F
04/28 20:21, 194F