您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“Linux進(jìn)程和線程有哪些區(qū)別”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Linux進(jìn)程和線程有哪些區(qū)別”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。
在理解進(jìn)程和線程概念之前首選要對(duì)并發(fā)有一定的感性認(rèn)識(shí),如果服務(wù)器同一時(shí)間內(nèi)只能服務(wù)于一個(gè)客戶端,其他客戶端都再那里傻等的話,可見其性能的低下估計(jì)會(huì)被客戶罵出翔來,因此并發(fā)編程應(yīng)運(yùn)而生,并發(fā)是網(wǎng)絡(luò)編程中必須考慮的問題。實(shí)現(xiàn)并發(fā)的方式有多種:比如多進(jìn)程、多線程、IO多路復(fù)用。
進(jìn)程是資源(CPU、內(nèi)存等)分配的基本單位,它是程序執(zhí)行時(shí)的一個(gè)實(shí)例。程序運(yùn)行時(shí)系統(tǒng)就會(huì)創(chuàng)建一個(gè)進(jìn)程,并為它分配資源,然后把該進(jìn)程放入進(jìn)程就緒隊(duì)列,進(jìn)程調(diào)度器選中它的時(shí)候就會(huì)為它分配CPU時(shí)間,程序開始真正運(yùn)行。
Linux系統(tǒng)函數(shù)fork()
可以在父進(jìn)程中創(chuàng)建一個(gè)子進(jìn)程,這樣的話,在一個(gè)進(jìn)程接到來自客戶端新的請求時(shí)就可以復(fù)制出一個(gè)子進(jìn)程讓其來處理,父進(jìn)程只需負(fù)責(zé)監(jiān)控請求的到來,然后創(chuàng)建子進(jìn)程讓其去處理,這樣就能做到并發(fā)處理。
# -*- coding:utf-8 -*- import os print('當(dāng)前進(jìn)程:%s 啟動(dòng)中 ....' % os.getpid()) pid = os.fork() if pid == 0: print('子進(jìn)程:%s,父進(jìn)程是:%s' % (os.getpid(), os.getppid())) else: print('進(jìn)程:%s 創(chuàng)建了子進(jìn)程:%s' % (os.getpid(),pid ))
輸出結(jié)果:
當(dāng)前進(jìn)程:27223 啟動(dòng)中 .... 進(jìn)程:27223 創(chuàng)建了子進(jìn)程:27224 子進(jìn)程:27224,父進(jìn)程是:27223
fork函數(shù)會(huì)返回兩次結(jié)果,因?yàn)椴僮飨到y(tǒng)會(huì)把當(dāng)前進(jìn)程的數(shù)據(jù)復(fù)制一遍,然后程序就分兩個(gè)進(jìn)程繼續(xù)運(yùn)行后面的代碼,fork分別在父進(jìn)程和子進(jìn)程中返回,在子進(jìn)程返回的值pid永遠(yuǎn)是0,在父進(jìn)程返回的是子進(jìn)程的進(jìn)程id。
線程是程序執(zhí)行時(shí)的最小單位,它是進(jìn)程的一個(gè)執(zhí)行流,是CPU調(diào)度和分派的基本單位,一個(gè)進(jìn)程可以由很多個(gè)線程組成,線程間共享進(jìn)程的所有資源,每個(gè)線程有自己的堆棧和局部變量。線程由CPU獨(dú)立調(diào)度執(zhí)行,在多CPU環(huán)境下就允許多個(gè)線程同時(shí)運(yùn)行。同樣多線程也可以實(shí)現(xiàn)并發(fā)操作,每個(gè)請求分配一個(gè)線程來處理。
進(jìn)程是資源分配的最小單位,線程是程序執(zhí)行的最小單位。
進(jìn)程有自己的獨(dú)立地址空間,每啟動(dòng)一個(gè)進(jìn)程,系統(tǒng)就會(huì)為它分配地址空間,建立數(shù)據(jù)表來維護(hù)代碼段、堆棧段和數(shù)據(jù)段,這種操作非常昂貴。而線程是共享進(jìn)程中的數(shù)據(jù)的,使用相同的地址空間,因此CPU切換一個(gè)線程的花費(fèi)遠(yuǎn)比進(jìn)程要小很多,同時(shí)創(chuàng)建一個(gè)線程的開銷也比進(jìn)程要小很多。
線程之間的通信更方便,同一進(jìn)程下的線程共享全局變量、靜態(tài)變量等數(shù)據(jù),而進(jìn)程之間的通信需要以通信的方式(IPC)進(jìn)行。不過如何處理好同步與互斥是編寫多線程程序的難點(diǎn)。
但是多進(jìn)程程序更健壯,多線程程序只要有一個(gè)線程死掉,整個(gè)進(jìn)程也死掉了,而一個(gè)進(jìn)程死掉并不會(huì)對(duì)另外一個(gè)進(jìn)程造成影響,因?yàn)檫M(jìn)程有自己獨(dú)立的地址空間。
讀到這里,這篇“Linux進(jìn)程和線程有哪些區(qū)別”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。