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