同步異步線程進程的一些思考

 同步與異步

    同步與異步在生活中隨處可見。同步和異步是描述不同事件發生的依賴關係,同步是指這兩個事件的發生有一定的時間順序,異步是指這兩個事件的發生是相互獨立的。

    比如去食堂吃飯,你需要先去那餐具(事件A),然後去某個窗口前打飯(事件B),接着找到一個座位(事件C),最後開始享受食物(事件D)。事件ABCD有一定的依賴關係,所以它們之間需要同步。處理器中的取指、譯碼、執行、寄存器回寫、存儲器回寫,各個子執行單元的動作也是同步的。在UnixShell下使用管道同時啓動多個進程,這些進程之間的執行也是同步的。用VHDL編寫一個簡單的可復位預置計數器,如果將復位信號開始後還要在判斷時鐘信號,那麼這個復位也是同步的。GCC編譯器在運行的時候調用不同的模塊(預處理、編譯、優化、鏈接)對代碼進行處理也是同步的。

    同步的事件之間需要通過信號來表示事件序列中的下一個動作可以開始了。對於上面的例子,餐具就是事件B的信號,飯就是事件C的信號等等。CPU中的取值模塊取到指令之後,會譯碼模塊發送一個信號,譯碼模塊執行完之後再給執行模塊發送信號等等。計算機中線程和進程之間的同步除了時間關係外,更側重於合作關係,因爲多個線程負責完成一個大的任務。

     異步是指事件之間是獨立發生的,比如編寫的帶復位預置功能的計數器,如果復位信號和時鐘信號沒有任何關係的話,那麼這麼復位各種就是異步的。因爲復位的操作是立即執行的,沒有任何等待。在shell下啓動命令的時候,在命令後面添加一個“&”符號,這個新啓動的程序就會在一個新的進程中執行,和當前進程時異步運行的。一個文字應用程序可以一邊排版一邊打印,每排版100頁,就送到打印機打印,然後接着排版。這時,處理器和打印機是異步運行的。

     再舉一個例子,比如在公交車上睡過了頭,發現已經過了目的地了。如果司機好心,立即停車讓你下去,這就是異步的。如果司機一定要等到下一站到了,你才能下車,這就是同步的。

     在單處理器上,使用異步編程是提高應用程序響應性和效率的關鍵手段之一。當然,每個異步的事件都要完整的保存自己運行所需要的所有狀態信息。在同步事件序列中,這些狀態信息,可能會從上一個事件或者下一個事件中得到。

     計算機的所有計算都是對現實世界的模擬,不管是發動機外形優化程序還是材料分析的有限元程序,或者是關係數據庫。同步異步也是對現實世界不斷運行的事物事件的相互關係的一種描述。同步因爲事物運動的因果關係,異步是因爲事物運動的獨立性。

線程和進程

     線程模型是對進程模型的改進,使用線程模型可以提高系統的吞吐量。這是因爲多個線程之間共享進程的所有資源。在配置了線程模型的系統中,獨立執行和調度的最小實體就不再是進程,而是線程了,進程僅僅成爲容納線程、地址空間、文件描述符、數據等等的容器了。

     線程的上下文切換速度要比進程快很多,線程本身也是一些狀態信息的容器,不過和進程這個框相比,線程也就是一個杯子而已。它要記錄堆棧信息,程序的執行位置,狀態寄存器信息,通用寄存器信息,線程標識、互斥量、信號量等信息。

     除了上下文切換速度以外,還有一個“切換後綜合徵問題”。進程切換後,需要執行一個完全不同的程序,會導致TLB失效,Cache失效,還有一些其他硬件級優化的寄存器的失效。這些會導致剛切換進來的進程在開始執行的一段時間比較慢。而線程在這個問題上,所受到的影響就要小得多。

     除此之外,還有通信問題。各個線程通信的帶寬比進程要大得多。因爲線程共享地址空間,一個線程使用malloc開闢的內存可以給另外一個線程直接使用(傳入指針)。而進程還要通過管道,隊列之類的系統級通信環境。這就有點類似局域網和廣域網的區別了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章