1. 程式人生 > 其它 >程序、執行緒、同步、非同步

程序、執行緒、同步、非同步

程式設計師小齊在一次午睡的時候做了個有趣的夢,夢裡的他穿越到了異世界裡...

 

這是一個具有魔法的世界,小齊來到這裡已經半天了,從剛開始的興奮不已試圖使用魔法,結果什麼反應都沒有,到現在已經飢腸轆轆。小齊決定去找一家飯店去吃飯,在街上找到了一家名叫“程序”的飯店,走進門後小齊找到一個角落坐著,然後服務員走過來招呼,小齊隨便點了一碗飯坐等美味。夢裡的自己擁有這個世界的貨幣還會說一樣的語言,雖然神奇但想到這是夢,一切都很正常了。

 

等待的時間很是煎熬,小齊決定四處看看分散注意力。小齊觀察到這裡的服務員工牌上都寫著“執行緒1號、執行緒2號”等標識,看起來還挺專業的。小齊在一個轉角遇到了飯店的店長,他正在和身旁的人討論服務員的效率問題。小齊在旁邊聽了一會,大概明白了什麼問題。這家飯店的服務員不多,因為是小飯店也請不起更多的服務員。服務員的工作大致就三件事:1. 引導顧客並記錄點菜情況;2. 廚房做好後送菜;3. 顧客走後收拾桌子;

 

店長分析道“服務員的送菜和收拾的工作沒啥問題,問題出在記錄顧客點菜環節上了,如果點菜很快倒也沒事,但有時候一桌人點菜需要選很久,而服務員也在那乾等著顧客點菜完畢,效率很低。”

小齊聽著聽著出於職業敏感脫口而出“可以用非同步來解決”,這句話被店長聽到了,詢問何為非同步?

 

小齊想著反正等待很無聊,便向店長解釋道“服務員在顧客點菜時乾等著,這叫同步。而非同步則是服務員將選單給顧客,並留下一個響鈴。服務員不再等待顧客點菜完畢,而是去服務別人。當有顧客點完菜按下響鈴,則最近空閒的服務員過去繼續服務。”

 

店長聽後直呼精妙,雖然單個服務員的能力沒變,但通過此套管理方式,便可提高同一時間可服務的顧客量。

 

最後店長不但為小齊免了單,還想聘請小齊為特別顧問,小齊心想只是一場夢便拒絕了。

=======================

總結

夢裡的顧客相當於一個個需要處理的任務,當一個任務耗費大量的時間則被稱為阻塞,而阻塞又分為CPU密集型IO密集型

CPU密集型阻塞相當於服務員一直在忙,根本停不下來

IO密集型阻塞相當於等待顧客點菜,啥也不幹的等著

對於IO密集型阻塞會影響系統吞吐量,因為服務員(執行緒)一直在乾等著,效率不高。

 

執行緒是作業系統的最小排程單位,是真正執行程式碼的單位。(服務員在做各種事情)

程序是作業系統管理資源的單位,夢裡的服務員、桌子、食材等各種資源都屬於此飯店(一個程序)

 

同步非同步則是一種程式設計思想,並不是具體的技術實現。

夢裡的響鈴則是回撥方法,當事件發生時(顧客選菜完畢),服務員再去做後續事情。

 

非同步程式設計能夠提高系統效率,但會加重程式設計師心智負擔。所以現在的解決方案則是用同步的方式寫非同步程式碼

在不同的程式語言裡有不同的實現,例如C#的async/await,Go語言的協程等。