顯示廣告
隱藏 ✕
※ 本文為 MindOcean 轉寄自 ptt.cc 更新時間: 2020-04-25 09:31:44
看板 Gossiping
作者 jserv (松鼠)
標題 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
高效能 Web 伺服器開發 - HackMD
[圖]
# 高效能 Web 伺服器開發 :::info 本文探討 ==[seHTTPd]( 的設計和實作議題,涵蓋並行處理、I/ ...

 

當然,這僅是起點,在課程中,我要求學員針對 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 (臺灣)
※ 文章代碼(AID): #1UeX4k_6 (Gossiping)
※ 文章網址: https://www.ptt.cc/bbs/Gossiping/M.1587679534.A.FC6.html
Behind4: 又來 好文 推1F 04/24 06:07
mikemagic88: 前十2F 04/24 06:08
gorilla823: 推3F 04/24 06:10
※ 編輯: jserv (140.116.246.163 臺灣), 04/24/2020 06:12:30
KevinR: push4F 04/24 06:11
Behind4: 問個小問題 跑 PHP server 效能X86 ARM 真的會像有些 文5F 04/24 06:13
Behind4: 章說的 效能差到千倍嗎?
jserv: @Behind4, Arm 伺服器的調教很繁瑣,若沒有特別調整,效能7F 04/24 06:14
jserv: 的確會是問題。不過這件事在 AWS 的 Arm 伺服器陸續有解法
dostey 
dostey: 只是對應  a,b <-> 0,1 <-> 高,低9F 04/24 06:14
SydLrio: 老師不要這樣,你上一篇我還沒看完,我想下課10F 04/24 06:15
robin10205: 推推11F 04/24 06:15
jserv: @SydLrio, 我只是等早餐店開門,順手發廢文,你不用認真12F 04/24 06:16
renna038766: 116哪間 蛤13F 04/24 06:17
jserv: @renna038766, 116 是台灣最好的學店,你有意見嗎?14F 04/24 06:18
renna038766: 你把118放哪 蛤15F 04/24 06:19
wario2014: 深深覺得,coding是智商高的人在玩的16F 04/24 06:20
wario2014: 光靠下苦功的話效率還是遠遠不及,大腦反應時間差太多
jserv: @wario2014, 所以更要多利用討論區交流,教學相長18F 04/24 06:21
corel: 神人快拜19F 04/24 06:21
freeblizzard: 推這篇20F 04/24 06:25
DanGong5566: 原來是Jserv,好,先跪下去再說21F 04/24 06:28
yyyyyyyv: 推推22F 04/24 06:35
Behind4: Amazon Web Services這個?? 他用ARM架構的CPU? 為了節能23F 04/24 06:36
Behind4: 嗎?其實我本來要問的只是用手機架站的實用性XDDD
lice0225: 請收下我的膝蓋25F 04/24 06:37
jserv: @Behind4, 請查詢 AWS Graviton2 處理器26F 04/24 06:37
Behind4: coding 應該不用那麼嚴肅吧 =__= 這應該是件好玩的事27F 04/24 06:38
Behind4: 謝謝
jserv: @Behind4, 手機裡頭執行網頁伺服器的案例不算少,不過...29F 04/24 06:39
chaosJames: 推30F 04/24 06:39
jserv: 有時候是手機製造商或晶片設計商提供的「後門」(但我不能說31F 04/24 06:40
riker729: 連名字都是 有多熱愛啊32F 04/24 06:41
jserv: @riker729, 小時聽到「人生以服務為目的」,長大就開發33F 04/24 06:43
jserv: server 了 (咦?)
riker729: 這兩年寫設備的web 深深覺得太混亂了 還得考慮相容性35F 04/24 06:46
bobohorn: 好猛的等早餐廢文36F 04/24 06:46
moonshade: 簡單來說都不用懂,那些問題kernel都解決了37F 04/24 06:47
moonshade: 這些東西老早在posix裡面都有東西包起來了
jserv: @moonshade, 但要會用呀,特別是 OS-specific39F 04/24 06:48
Behind4: 好靠北哦 後門的只想到中國………40F 04/24 06:48
moonshade: 剪貼那麼多廢話看起來可怕而已...41F 04/24 06:49
jserv: @moonshade, 人在 116 就要發廢文,鄉民認證42F 04/24 06:49
gorilla823: Verilog好難43F 04/24 06:50
jserv: @gorilla823, 人生更難44F 04/24 06:50
moonshade: 再說back-end 工程師不值錢,別人把你當小精靈兒已45F 04/24 06:51
ts05593818: 老師早46F 04/24 06:53
moonshade: 不過話說,做ARM上的linux就是另一回事了47F 04/24 06:57
angerD: 未看先推48F 04/24 06:57
moonshade: 不是所有的廠商都符合spec...49F 04/24 06:58
jserv: 還是當大學教授好,沒人對大學教授有程式設計的期待 (無誤)50F 04/24 07:00
l7th: 早餐店老板用interrupt要你拿早餐啦...51F 04/24 07:02
Behind4: 雖然覺得有趣 但感覺不是同一個世界的東西52F 04/24 07:03
angerD: 原來daemon有惡魔的意思53F 04/24 07:03
jserv: @angerD, http://catb.org/jargon/html/D/daemon.html #54F 04/24 07:04
jserv: 在早期的分時多工作業系統 CTSS (1961) 就有 "daemon" 一詞55F 04/24 07:05
sugoi5566: 百推內56F 04/24 07:08
Merkle: 連jserv都不知道的井蛙還好意思大小聲 嘖嘖57F 04/24 07:12
Behind4: 我就不知道欸 我只是看內文推的58F 04/24 07:15
vovovolibear: 我怎麼沒聽到雷聲? 我們在同一個116?59F 04/24 07:16
Xiphity: 推jserv60F 04/24 07:16
jaid: 一口氣兩篇辛苦了61F 04/24 07:17
ERT312: 推推62F 04/24 07:21
spector66: 快推63F 04/24 07:24
angerD: 謝謝老師,想請問老師如果要找樹狀結構與輸入法的關係 該64F 04/24 07:27
angerD: 下什麼關鍵字
xeriof95092: 老師 別鬧 哪家早餐店這麼晚開66F 04/24 07:31
seeya08: push67F 04/24 07:32
g5637128: 推68F 04/24 07:32
s0914714: 早餐店被blocking了69F 04/24 07:33
OBST5566: 我這個人很多簡單 有瑟夫就推70F 04/24 07:38
wbreeze: 推推71F 04/24 07:42
a4786033: 推72F 04/24 07:49
sn0w: 推!73F 04/24 07:50
frappe: 這家早餐店讓人拖這麼久,太誇張了吧?XD74F 04/24 07:51
HYDE1986: 竟然已經有人不認識jserv惹....75F 04/24 07:54
amethystboy: 真 人機合一76F 04/24 07:55
snow10725: 一直看到熱門 推推77F 04/24 08:02
thinkfun: 推 好文78F 04/24 08:07
ohsuoh: 太誇張了 發兩篇79F 04/24 08:13
flyvegetable: 好文共賞80F 04/24 08:15
yuiweq1999: 原來是神81F 04/24 08:18
huangmin9487: push82F 04/24 08:19
Colitas: 搶推83F 04/24 08:19
uohZemllac: 好文給推84F 04/24 08:20
ashs92223: 讚!85F 04/24 08:21
yeh628: 老師好帥!!!!86F 04/24 08:24
hakosaki: 推jserv87F 04/24 08:28
cool9203: 推88F 04/24 08:30
MidoBanA: 推89F 04/24 08:30
sses60802: 100推內90F 04/24 08:30
emptie: 謝謝你91F 04/24 08:34
ku399999: 膝蓋送出92F 04/24 08:36
Agdanpanda: 推93F 04/24 08:37
jeremylouee: 推個94F 04/24 08:39
erre: 那麼複雜還是掰陳改參數call svm做ai的cp值高95F 04/24 08:40
yee999: 推96F 04/24 08:40
charF: 下一篇 Re:精通ptt廢文對Coding有什麼幫助?97F 04/24 08:42
da21510: 百推內 先跪98F 04/24 08:43
da21510: 慚愧 老師的課程一直沒看完
apple123773: 快跪100F 04/24 08:44
x077155203: 有神快拜101F 04/24 08:48
LeafLu: 推jserv!!102F 04/24 08:49
randy061: 朝聖 但太深了…103F 04/24 08:50
dangerousair: 幹軟體的都看不懂只看得懂邏設那些詞而已104F 04/24 08:53
herculus6502: 神串留名105F 04/24 08:58
sniper2824: 跟鬼一樣先推再看106F 04/24 08:59
DWR: 原來是jserv 還在想說那個鄉民這麼強又跑出來了107F 04/24 09:02
qppqqp: 正 老師 出現了 拜108F 04/24 09:04
fine325011: 推109F 04/24 09:06
dingbebbie: 老師推推110F 04/24 09:07
shorty696820: 推宅瑟夫111F 04/24 09:09
loveyanzi03: 先推112F 04/24 09:14
Gold740716: 推113F 04/24 09:15
GitHub - chewing/chewing.github.com: Chewing Project Website
[圖]
Chewing Project Website. Contribute to chewing/chewing.github.com development by creating an account on GitHub. ...

 
jserv: 的 doc/ 目錄,可見到酷音輸入法的技術報告 (2001 年)115F 04/24 09:17
jserv: (筆誤,應為 2002 年)
tpegioe:117F 04/24 09:18
jserv: @da21510, 期待你的作業 :-)118F 04/24 09:18
adsop: 推119F 04/24 09:19
vi000246: 推120F 04/24 09:19
Morris1028: 推老師121F 04/24 09:20
ki59920: 推122F 04/24 09:23
as920909: 推大大123F 04/24 09:32
abb123456: 推124F 04/24 09:34
ila9970: 神人帳號必推125F 04/24 09:35
donation12: 這篇真好!126F 04/24 09:36
kero0331: 怎麼覺得唐鳳會來留言127F 04/24 09:38
gR7P4zXH: 傻眼貓咪128F 04/24 09:38
Lbj1101: 只能推了129F 04/24 09:42
albert0525: 推推130F 04/24 09:58
jserv: @kero0331, 快來許願:從開發口罩預購系統看電腦科學131F 04/24 10:03
shinXIII: 看到這篇我都不敢說我會寫程式了..132F 04/24 10:04
mooto: 呃,我真懷疑有多少人是看懂才推,哥是豬屎屋的,怎麼覺得133F 04/24 10:05
mooto: 被你講的很複雜,難怪資工的跑來寫電路設計,總是很難讀。
mooto: 簡而言之,邏輯設計的根本是硬體,用這個概念coding,跟程
mooto: 式底的不一樣
bewritten: 先推137F 04/24 10:07
route22: 邏輯設計就寫積木 然後一個控制叫它們動起來138F 04/24 10:08
kqalea:轉錄至看板 Soft_Job                                      04/24 10:11
route22: 寫EDA tool的我真的覺得是天才139F 04/24 10:15
bbo6uis122: 推140F 04/24 10:15
kersihi: 朝聖141F 04/24 10:26
wheateardoll: 再拜142F 04/24 10:42
ai030821: 推143F 04/24 10:45
bluejrl: 你說的我完全不懂,肯定是高高在上天上人144F 04/24 10:46
gelungeching: 推!145F 04/24 10:55
vvrr: edge/level trigger那個不用懂數位邏輯,當成純名詞定義146F 04/24 11:02
vvrr: 也很好理解吧
km101km: 先推再慢慢啃內文148F 04/24 11:03
jserv: @vvrr, 那就會陷入背誦名詞,而不知曉術語的由來149F 04/24 11:05
jserv: 更麻煩的是,由於缺乏背景知識,無法用精準術語和國際的
jserv: 開發者溝通,就很難延展思維的廣度和深度
vvrr: 狀態有變(因為有了個edge)就trigger <-- 這樣子算背誦名詞嗎152F 04/24 11:09
jserv: 比方說,為何稱為 "trigger"? 時間的測量計算又怎麼做?153F 04/24 11:11
fallen01: 神154F 04/24 11:11
vvrr: 稱為trigger就,有了個觸動,引發了事件?155F 04/24 11:20
vvrr: 有些名詞的確是數位邏輯裡先有的,懂了的確能比較快在第一時
vvrr: 間聽懂對方的意思。但現在google方便,不懂的去查一下理解一
vvrr: 下也很快。像開發時遇到HTTPS可能要懂憑證的工作原理
vvrr: 但不用真的學完密碼學…
webberhan: 推160F 04/24 11:42
qwefghzxc: 推161F 04/24 12:01
LJP2: 推推162F 04/24 12:21
HankYang: 推,感謝老師回覆m(_ _)m,我只是想發發廢文而已(#163F 04/24 12:38
felix1017: 有神快拜164F 04/24 12:45
jserv: @bluejrl, 「上人」不能亂說 #我剛吃完雞排165F 04/24 13:02
holishing: 推166F 04/24 13:07
zeta56321: 請不要擅自把廢文的標準提高!167F 04/24 13:21
zzxx080954: 媽 我在這168F 04/24 13:24
nullife: 推,好猛169F 04/24 13:42
clark3530: jserv  我媽說看到這幾個字先跪再說170F 04/24 14:07
henry1915: 推推171F 04/24 14:07
jserv: @vvrr, 的確,先不要壞了對新事物的胃口,再開拓心胸接受172F 04/24 14:38
compuworld: 推jserv大173F 04/24 17:06
prokofieff: 推174F 04/24 17:36
domon0525: 推一個,雖然我看不董QQ175F 04/24 18:18
KhePri: 推176F 04/24 19:35
fddd: 太神啦!!!177F 04/24 21:11
oxlittle: 奇怪,這篇反而看得懂,看來我不用重修數位電路實驗和微178F 04/24 22:31
oxlittle: 處理器了哈哈哈哈。
Rudycran: 請問這篇是日文嗎?為什麼有漢字可是我都看不懂180F 04/25 00:23
y995526: 推推181F 04/25 00:36
silver00: 跪著看182F 04/25 00:49

--
※ 看板: FW 文章推薦值: 0 目前人氣: 0 累積人氣: 41 
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇