Linux進(jìn)程和線程有哪些區(qū)別

本文小編為大家詳細(xì)介紹“Linux進(jìn)程和線程有哪些區(qū)別”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Linux進(jìn)程和線程有哪些區(qū)別”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。

公司專注于為企業(yè)提供做網(wǎng)站、成都網(wǎng)站制作、微信公眾號(hào)開發(fā)、成都做商城網(wǎng)站,小程序設(shè)計(jì),軟件按需定制等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。憑借多年豐富的經(jīng)驗(yàn),我們會(huì)仔細(xì)了解各客戶的需求而做出多方面的分析、設(shè)計(jì)、整合,為客戶設(shè)計(jì)出具風(fēng)格及創(chuàng)意性的商業(yè)解決方案,創(chuàng)新互聯(lián)公司更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務(wù)。

在理解進(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)程

進(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)程接到來自客戶端新的請(qǐng)求時(shí)就可以復(fù)制出一個(gè)子進(jìn)程讓其來處理,父進(jìn)程只需負(fù)責(zé)監(jiān)控請(qǐng)求的到來,然后創(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è)請(qǐng)求分配一個(gè)線程來處理。

線程和進(jìn)程各自有什么區(qū)別和優(yōu)劣呢?

  • 進(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)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章題目:Linux進(jìn)程和線程有哪些區(qū)別
文章地址:http://muchs.cn/article18/johhgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)動(dòng)態(tài)網(wǎng)站、微信小程序、網(wǎng)站改版、域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)