程序、執行緒、同步、非同步
程式設計師小齊在一次午睡的時候做了個有趣的夢,夢裡的他穿越到了異世界裡...
這是一個具有魔法的世界,小齊來到這裡已經半天了,從剛開始的興奮不已試圖使用魔法,結果什麼反應都沒有,到現在已經飢腸轆轆。小齊決定去找一家飯店去吃飯,在街上找到了一家名叫“程序”的飯店,走進門後小齊找到一個角落坐著,然後服務員走過來招呼,小齊隨便點了一碗飯坐等美味。夢裡的自己擁有這個世界的貨幣還會說一樣的語言,雖然神奇但想到這是夢,一切都很正常了。
等待的時間很是煎熬,小齊決定四處看看分散注意力。小齊觀察到這裡的服務員工牌上都寫著“執行緒1號、執行緒2號”等標識,看起來還挺專業的。小齊在一個轉角遇到了飯店的店長,他正在和身旁的人討論服務員的效率問題。小齊在旁邊聽了一會,大概明白了什麼問題。這家飯店的服務員不多,因為是小飯店也請不起更多的服務員。服務員的工作大致就三件事:1. 引導顧客並記錄點菜情況;2. 廚房做好後送菜;3. 顧客走後收拾桌子;
店長分析道“服務員的送菜和收拾的工作沒啥問題,問題出在記錄顧客點菜環節上了,如果點菜很快倒也沒事,但有時候一桌人點菜需要選很久,而服務員也在那乾等著顧客點菜完畢,效率很低。”
小齊聽著聽著出於職業敏感脫口而出“可以用非同步來解決”,這句話被店長聽到了,詢問何為非同步?
小齊想著反正等待很無聊,便向店長解釋道“服務員在顧客點菜時乾等著,這叫同步。而非同步則是服務員將選單給顧客,並留下一個響鈴。服務員不再等待顧客點菜完畢,而是去服務別人。當有顧客點完菜按下響鈴,則最近空閒的服務員過去繼續服務。”
店長聽後直呼精妙,雖然單個服務員的能力沒變,但通過此套管理方式,便可提高同一時間可服務的顧客量。
最後店長不但為小齊免了單,還想聘請小齊為特別顧問,小齊心想只是一場夢便拒絕了。
=======================
總結
夢裡的顧客相當於一個個需要處理的任務,當一個任務耗費大量的時間則被稱為阻塞,而阻塞又分為CPU密集型和IO密集型
CPU密集型阻塞相當於服務員一直在忙,根本停不下來
IO密集型阻塞相當於等待顧客點菜,啥也不幹的等著
對於IO密集型阻塞會影響系統吞吐量,因為服務員(執行緒)一直在乾等著,效率不高。
執行緒是作業系統的最小排程單位,是真正執行程式碼的單位。(服務員在做各種事情)
程序是作業系統管理資源的單位,夢裡的服務員、桌子、食材等各種資源都屬於此飯店(一個程序)
同步與非同步則是一種程式設計思想,並不是具體的技術實現。
夢裡的響鈴則是回撥方法,當事件發生時(顧客選菜完畢),服務員再去做後續事情。
非同步程式設計能夠提高系統效率,但會加重程式設計師心智負擔。所以現在的解決方案則是用同步的方式寫非同步程式碼。
在不同的程式語言裡有不同的實現,例如C#的async/await,Go語言的協程等。