C實(shí)例編程:C語言進(jìn)程vs線程選擇

字號(hào):

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