行程與執行緒

      在〈行程與執行緒〉中尚無留言

多工 Multi Task

在單核CPU時代, 就有多工的功能了. 一顆CPU如何同時作那麼多件事呢. 答案很簡單, 但實作起來很複雜. 就是把時間切割, 0.01秒執行A程式, 0.02秒作B程式, 然後就這樣一直切來切去的. 讓人類誤以為是同是在執行.

到了多核時代, 才有可能有真正並存多工的能力. 但我們還是要把這麼多顆CPU合併起來看成一顆, 因為這種實体並存多工非常複雜, 只能交給作業系統處理. 我們只要把它看成是一顆更快的CPU即可.

Process

Process在台灣翻譯成 “行程”, 大陸譯成 “進程”. Process是由作業系統控制的, 每開啟一支應用程式, 就會產生一個Process, 然後會給予一個pid. 此時作業系統會配發 4G 的Ram給這個Process. 若又再開啟另一支app, 也同樣是 4G.

但如果實体的Ram, 只有6G的話, 那麼第二支app不就開不成了. 其實作業系統並不是真正的配發 4G , 而是預設最大可用為 4G. 所以可以一直開啟新的app, 因為並不是每支app都需要用4G.

Process有個特性, 就是獨立擁有自已的資源, 如CPU的獨佔時間, 自已可用的Ram空間. 每個Process不會亦不可能互相干擾.

Thread 執行緒

在每個Process裏, 比如Word, 可以一直打字, 一邊進行錯字檢查, 又可以一邊列印. 這是怎麼達成的呢.
每個Process, 又可以產生致少一個以上的執行緒, 負責不同的工作, 執行緒是把Process 所擁有的CPU時間, 再進行切割, 然後也是在不同的工作中一直切換.
那這樣執行緒不就跟Process 一樣了嗎? 原理是一樣, 但其實有大大的不同. 每個執行緒擁有共通的資源, 互想搶奪Process所擁有的時間, 並共用相同的記憶体, 且會相互干擾, 更會形成共競.

多工模式

經上面描述, 要多工的話, 可採用三種方式
多行程模式 : 同時開啟不同的應用程式
單進程多執行緒 : 最常用的模式
多進程多執行緒 : 過於複雜, 較少用

行程與執行緒優缺點

執行多工, 通常採用 Master-Worker模式. Master負責分配任務, Worker就是要執行的任務. 如果使用行程方式, 父行程就是Master, 其他子行程都是Worker. 如果使用執行緒, 則主執行緒就是Master, 其他新的執行緒都是Worker.

使用行程完成多工任務, 最大的好處就是穩定. 因為子行程掛了, 其他子行程照樣跑.但開啟一個新的子行程所耗費的資源相當龐大, Linux採用 fork(), 而在Windows更加繁雜且耗費更多資源.

使用執行緒, 好處就是切換較快速, 資源消耗比較少. 但缺點是一個子執行緒掛了, 全部跟著掛.

Apache Web Server就是採用多行程模式. 而IIS則採用多執行緒模式. 這就是為什麼IIS爛到爆, 一直被Apache電到死的原因.

執行緒切換

執行緒一多, 效能勢必會降下來. 每次要切換到別的執行緒時, 就必需把目前執行到那一行的行數push到stack, 當然還有其他工作要處理. 然後切回本執行緒時, 就必需把上一次完成的行數pop回來. 然後還有閉鎖沒key無功而返的問題. 因此執行緒的效能當然會比較差.

異步IO

當CPU必需等待IO處理後的結果, 才進行後續的工作, 稱為同步IO, 此時CPU會停下來等待. 因此整個畫面包含滑鼠都不會動了.

但若CPU不等了, 先去處理其他的事, 等IO完成後再通知CPU回來處理, 那就稱為異步IO. 因此畫面滑鼠都可以很順的滑動. 但異步IO技術非常的高. 先如何通知CPU回來處理, 就是一大學問的.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *