程序和進程的關(guān)系如同工廠和車間的關(guān)系酣溃,因為進程是正在運行中的程序瘦穆,所以是正在進行生產(chǎn)作業(yè)的車間;一個工廠可以有多個車間赊豌,這些車間有的在運行有的可能不在運行扛或,運行中的車間可以看做是進程;
進程和線程的關(guān)系就如同生成車間和生產(chǎn)機床的關(guān)系碘饼,一個車間如果有多個機床(多線程)熙兔,那么這些機床同時生產(chǎn)就可以提高效率,當然這些機床可以生產(chǎn)相同的產(chǎn)品也可以生產(chǎn)的是不同產(chǎn)品艾恼;
那么多車間(多進程)和多機床(多線程)生產(chǎn)有什么關(guān)系和區(qū)別呢住涉?首先多車間生產(chǎn),它的材料是獨享的(多進程在執(zhí)行的時候钠绍,其所需數(shù)據(jù)都會在內(nèi)存中獨自創(chuàng)建一份)舆声;多機床的話它的材料是共享的(多線程共享一份數(shù)據(jù),在使用的時候會加鎖柳爽,會有等待時間)媳握;車間(進程)和機床(線程)都是在使用時創(chuàng)建,使用完后銷毀磷脯,所以進程和線程的創(chuàng)建和銷毀都會消耗資源和時間蛾找。而且這兩者是共存的,線程是屬于進程的赵誓,多進程和多線程也可以同時存在打毛。
進程和線程的執(zhí)行都消耗cpu資源,對于進程而言俩功,一個cpu核芯在一個時間點只能執(zhí)行一個進程(不能拆分)隘冲,所以單線程的進程就會對多線程cpu核芯造成浪費;多線程的進程可以充分發(fā)揮多線程cpu核芯的性能绑雄。
我們以httpd服務(wù)對請求的處理模式為例:
①展辞、prefork模式:一個進程處理一個請求(處理完該請求后該進程銷毀),多個請求同時來的的時候需要創(chuàng)建多個進程處理万牺;相對穩(wěn)定罗珍,一個進程出現(xiàn)問題不會影響其它進程
②、worker模式:一個線程處理一個請求脚粟,多進程多線程處理
③覆旱、event模式:一個進程處理多個請求(同prefork模式的區(qū)別,這個進程中的多個請求基于事件驅(qū)動可以同時執(zhí)行核无,即它沒有那么頻繁的創(chuàng)建銷毀進程)
注:多進程和多線程難以說出絕對的優(yōu)劣扣唱,因為一個進程中多個線程是可以發(fā)揮多線程cpu的功能,但是因為它的內(nèi)存數(shù)據(jù)是線程共享的,在寫一個數(shù)據(jù)的時候會加鎖噪沙,也會浪費等待時間炼彪。所以具體情況還是根據(jù)測試結(jié)果而定。當然總的來說還是一個進程中有多個線程會好一些正歼。