Mutex與火車排班
在我心中,一直有個小心願,能以自己微弱的力量為這個社會多作些事情,包含免費的技術訓練,然而時間、精力是投入了,但不見得有效果,為此,我常常在反省。拜讀對岸高手Pengcheng Zou的blog - 「Linux地鐵」一文,我終於知道為什麼,畢竟技術或理論本身被提出,就是要克服現實問題,所以若能讓訓練本身更貼近現實,這樣才會發揮其價值。以下摘錄「Linux地鐵」一文的部份內容:
今天早上上班,快到地鐵就發現外面站了不少人,有做打車狀,有做打電話狀,隱約聽到有人說地鐵壞了。下到地鐵站台,果然看到兩列車停在那裡,站台上站滿了人。
後來在北京市地鐵運營有限公司網站上看到了事故原因:何謂「閉塞」?寶貝爹地是鐵路的,正好請教。講 了半天,不甚了了。只好再從網上查,得知由車站向區間發車時必須確定區間內無車,還要防止兩個車站在同一線路上向同區間發車。這種按照一定的方法組織列車 在區間內的運行,稱為行車閉塞,用來聯絡的設備稱為閉塞設備。常用的閉塞設備有自動閉塞、半自動閉塞及電氣路籤閉塞等。地鐵採用自動閉塞設備。11日早晨7點55分左右,地鐵2號線宣武門變電站瞬間過載跳閘,造成長椿街信號系統無法正常使用,列車運行方式被迫由自動閉塞改為電話閉塞,通過能力下降,運營間隔加大,造成長椿街臨近的復興門等重點站短時間乘客滯留。8點19分故障排除,地鐵運營方式隨後按自動閉塞方式運營,運營秩序逐步恢復正常。其間,2號線內外環西直門至宣武門早高峰列車間隔加大,列車最小間隔由原來3分半被迫延長到8至10分鐘,由於故障發生時正處於早高峰階段,客流本就較大,所以部分車站出現乘客短時滯留現象,地鐵1號線受此故影響有6列車在復興門站通過。13號線、八通線未受故障影響,運營正常。
這 下懂了,地鐵就是作業系統,所謂區間就是臨界區,閉塞裝置是各種同步機制,自動閉塞相當於spinlock,電話閉塞相當於semaphore。今天早上 效率比較高的spinlock失靈了,只好用效率較低而且不能用於中斷上下文的semaphore。所以導致系統性能下降,進程吞吐量明顯降低,客戶滿意 度下降。不少用戶轉而使用其他作業系統。
很多唸電腦科學的學生,往往在畢業後還不能理解那些同步理論的重要性,如今,火車排班就是最好的案例。Linux kernel中有兩種mutex (互斥)機制:
- semaphore
- spinlock
spinlock的本質是busy-waiting,聽起來很沒效率,但為何說在SMP很重要呢?最主要的原因是,沒有context-switch的負擔,沒有牽涉到process的狀態變化,在多處理器的環境下,spinlock相當有效率,而在單處理器上,卻只是disable/enable isr一類的操作。換過來想火車的案例,似乎就簡單多了,用電話通知本身涉及人與人的通訊內容、線路使用量,以及現實因素,可視為單處理器狀態,但如果是自動化,個別單元的協調時間是相當短的,所以可想成SMP架構,自然這兩者的mutex機制也有使用上的落差了。
當然,真的要探討Linux semaphore/spinlock的機制,其實複雜許多,特別在2.6 kernel還添入big kernel lock等新的機制,不過這些都出自典型作業系統理論 (命名可能有出入),只要稍微變化一下,或許也能對應到現實。
1 則留言:
讀完這篇翻翻幾本 OS 看 process 那邊,感覺就來了 :D
張貼留言