進程vs線程,如何選擇?
我們編寫程序,到底是采用多線程還是多進程?這裡是有區別的,采用不同的機制能夠獲得的效率也不一樣。如何選擇適合我們自己的程序的機制呢?下面是一些常見的選擇的看法,不過也只是提供給大家參考參考,具體設計的時候還是要自己處理。
¨ 一個程序裡面的所有的線程都在同一個運行空間中執行。而一個程序的子進程則是運行在另外的執行空間中的,這裡是通過調用了exec函數來實現的。
¨ 同一個進程中的某個線程的故障可以影響其它的線程,因為所有的線程共享同一個虛擬內存空間以及其他資源。例如,某個線程對沒有初始化的指針進行寫操作,就可能影響其它的線程。而一個出了問題的進程是不會影響其它的進程的,因為它們分別在不同的進程空間進行自己的操作。
¨ 創建新的進程需要進行內存的拷貝操作,這就額外的增加了系統負擔,而線程則不需要這個拷貝過程。不過由於現在的操作系統的實現是僅僅當內存需要改變的時候才拷貝改動的部分,所以這裡的影響相對還是比較小的。
¨ 線程通常用在某些需要比較好的同步操作的場合。例如,某個問題可以分解為多個幾乎對等同步處理的任務的話,則是用線程是很好的選擇。進程則適合應用在不需要嚴格的同步的場合。
¨ 線程之間共享數據是很方便的,因為不同的線程本來就是共享同樣的存儲空間。(然而這裡就要非常仔細的處理競爭的情況。)而不同進程之間共享數據則需要使用一些ipc機制,例如管道、共享內存、套接字等等。