2013年2月13日 星期三

fork() or pthread

pthread已經是很久以前碰過的東西(十年以前了),當然這是一個歷久不衰,甚至愈來愈興盛的library,然則有許多人把他當成效能改進方案,是否完全正確!?說到效能,就不得不提到最近崛起的方式則是asynchronous IO,當然兩者不是完全競爭性的存在,但是卻是效能提升的選擇

如richard stevens在unix network programming提到的,fork()需要配大量資源,有其包袱,如果要溝通parent/child則必須透過IPC機制,thread則沒有這些問題,但是相對應的thread有同步的問題

我想介紹兩點使用thread但是不使用fork() process所可能帶來的問題,藉此想說明,不要過度依賴thread
  • thread遇上system call可能block所有threads,這可能是一個programmer意想不到的
  • thread在CPU分配上有先天的問題,因為linux本身是以process為單位分配,也就是如果一個programmer希望他的program有較高的效能,可能用fork()比較好
有上面的問題(issue)也不表示捨棄thread,個人認為應該更加精細的控制thread與process才能達到更好的效能,比方說將批次的工作做一process,每個process在分成若干threads,當然這些方式往往必須programmer付出更多的精力來達成,但是在目前追求效能的風氣下,這是一種解決的方案

以第一點舉例來說,參考之前雲端投影機,當client提出一個投影片的需求的時候,server必須將slides轉換為images,這是一個耗用大量CPU以及block IO的工作(或許可以將這個過程使用asynchronous IO來處理,但表示連libpng之類的lib或者使用到任何tool都必須支援或者轉換為支援asynchronous IO),即使使用thread或者select()都無法解決的,最後我選擇的解決方案是fork()

asynchronous IO則是還沒機會使用C語言實作過,但是倒是在javascript的node.js上體驗過,一個使用event queue來理解這個機制比較容易,但是asynchronous IO似乎在流程控制上比較困難,如果有興趣可以參考我之前寫的文章

沒有留言:

張貼留言