{eval=Array;=+count(Array);}

亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

問答專欄Q & A COLUMN

linux下的多進(jìn)程和多線程,他們分別有什么作用?

Java_oldboyJava_oldboy 回答0 收藏1
收藏問題

2條回答

Cciradih

Cciradih

回答于2022-06-27 17:11

首先,Linux多線程和多進(jìn)程的作用其實(shí)作用都差不多,主要是為了完成并發(fā)任務(wù)。

其次,我們再來看看什么是進(jìn)程,什么是線程,以及它們之間的關(guān)系。

線程是執(zhí)行體,用來執(zhí)行我們寫的代碼或指令,多個(gè)線程可以同時(shí)執(zhí)行。

進(jìn)程是容器,包含了線程執(zhí)行所需要的一切系統(tǒng)資源,線程只能在進(jìn)程空間中執(zhí)行,進(jìn)程中可以包含多個(gè)執(zhí)行線程,但只有一個(gè)主線程,我們代碼中包含main函數(shù)的線程也就是進(jìn)程中的主線程。

進(jìn)程本身是不活躍的,在Linux中,如果進(jìn)程中的所有執(zhí)行線程都已經(jīng)退出,而父進(jìn)程沒有捕獲子進(jìn)程結(jié)束的信號(hào),此時(shí)該進(jìn)程則會(huì)變?yōu)榻┦M(jìn)程,該進(jìn)程不占CPU時(shí)間,但會(huì)占據(jù)系統(tǒng)資源,如果大量存在,必定會(huì)導(dǎo)致系統(tǒng)資源被耗盡,導(dǎo)致死機(jī)。

通俗的比喻就是,操作系統(tǒng)就像一個(gè)手工作坊,進(jìn)程就相當(dāng)于作坊中一個(gè)個(gè)獨(dú)立的工作車間,而線程就相當(dāng)于車間中真正勞作的工人,沒有工人的車間是無法進(jìn)行生產(chǎn)的。

進(jìn)程空間之間彼此隔離,可以說互不影響,就相當(dāng)于上述手工作坊中的兩個(gè)車間中都有個(gè)叫張三的人,但其中一個(gè)因?yàn)樯习鄷r(shí)間玩手機(jī)被老板開除了,而另一個(gè)車間中的張三卻不會(huì)受到任何影響。(當(dāng)然,這不是絕對的,Linux子進(jìn)程會(huì)在創(chuàng)建初期共享父進(jìn)程的進(jìn)程空間,而vfork系統(tǒng)調(diào)用會(huì)導(dǎo)致這種共享一直存在,導(dǎo)致父進(jìn)程中的變量修改會(huì)影響子進(jìn)程數(shù)據(jù),而fork則采用寫時(shí)拷貝技術(shù)來避免了這個(gè)問題)。

由于進(jìn)程的這種隔離性,進(jìn)程之間共享數(shù)據(jù)和通信也變得麻煩許多,一般的技術(shù)手段就是管道,POSIX信號(hào),System V信號(hào),共享內(nèi)存,Socket網(wǎng)路通信等等。

線程之間也沒有進(jìn)程那么麻煩,它們是共享整個(gè)進(jìn)程空間的,這就像車間里要開小組會(huì)議,一個(gè)人發(fā)言的時(shí)候大家都能聽到,但這又造成了另一個(gè)問題,畢竟一個(gè)車間十來號(hào)人,難免人多嘴雜,怎么保證一個(gè)人發(fā)言的中途沒人插嘴呢,這就是線程同步的問題,一般的技術(shù)手段就是信號(hào)量,互斥鎖,讀寫鎖,文件鎖等等。

當(dāng)然,多線程中同步的問題在多進(jìn)程中依然會(huì)遇到,解決辦法自然也就和多線程差不多。

評論0 贊同0
  •  加載中...
doodlewind

doodlewind

回答于2022-06-27 17:11

先聲明下,什么是多進(jìn)程、多線程

什么是多進(jìn)程?

在計(jì)算中,進(jìn)程是正在執(zhí)行的計(jì)算機(jī)程序的一個(gè)實(shí)例?;蛘吆唵蔚卣f,運(yùn)行程序也稱為進(jìn)程。

多進(jìn)程意味著“在單個(gè)計(jì)算機(jī)系統(tǒng)中具有兩個(gè)或更多個(gè)CPU。

例如,如果計(jì)算機(jī)系統(tǒng)具有雙核心,并且同時(shí)運(yùn)行(執(zhí)行)兩個(gè)進(jìn)程(同時(shí)),則可以通過將每個(gè)進(jìn)程分配給系統(tǒng)的每個(gè)核心來實(shí)現(xiàn)。因此,這兩個(gè)過程可以同時(shí)執(zhí)行。換句話說,多進(jìn)程可以定義為多個(gè)進(jìn)程可以同時(shí)執(zhí)行,而不是一個(gè)接一個(gè)地執(zhí)行。在多進(jìn)程中,每個(gè)進(jìn)程都有不同的地址空間和資源。

什么是多線程?

進(jìn)程是線程的集合。線程是一個(gè)輕量級(jí)的過程。線程執(zhí)行是執(zhí)行的小處理單元。

每個(gè)進(jìn)程包含許多線程,所有線程共享相同的內(nèi)存空間。

同一個(gè)進(jìn)程中可以存在多個(gè)線程,共享內(nèi)存等資源,而不同的進(jìn)程不共享這些資源。

在單個(gè)處理器上,多線程通常通過時(shí)分多路復(fù)用(如多任務(wù)處理):處理器在不同的線程之間切換。

這種上下文切換通常發(fā)生得足夠頻繁,以至于用戶感覺到線程或任務(wù)同時(shí)運(yùn)行。

線程與進(jìn)程有什么不同?

線程不同于傳統(tǒng)的多任務(wù)操作系統(tǒng)進(jìn)程:

進(jìn)程通常是獨(dú)立的,而線程作為進(jìn)程的子集存在

進(jìn)程比線程攜帶更多的狀態(tài)信息,而進(jìn)程內(nèi)的多個(gè)線程共享進(jìn)程狀態(tài)以及內(nèi)存和其他資源

進(jìn)程具有獨(dú)立的地址空間,而線程共享其地址空間

進(jìn)程只能通過系統(tǒng)提供的進(jìn)程間通信機(jī)制進(jìn)行交互

同一進(jìn)程中的線程之間的上下文切換通常比進(jìn)程之間的上下文切換更快

多線程調(diào)度

操作系統(tǒng)通過以下兩種方式之一來調(diào)度線程:

先發(fā)制人的多線程一般被認(rèn)為是優(yōu)越的方法,因?yàn)樗试S操作系統(tǒng)確定何時(shí)發(fā)生上下文切換。搶占式多線程的缺點(diǎn)是系統(tǒng)可能會(huì)在不恰當(dāng)?shù)臅r(shí)間進(jìn)行上下文切換,引起鎖車隊(duì),優(yōu)先級(jí)反轉(zhuǎn)或其他負(fù)面影響,這可能會(huì)通過協(xié)作式多線程來避免。

另一方面,合作多線程依賴于線程自己放棄控制,一旦他們在停止點(diǎn)。如果線程正在等待資源變?yōu)榭捎脿顟B(tài),則會(huì)產(chǎn)生問題。

線程的保護(hù)機(jī)制

一個(gè)線程將共享父進(jìn)程的所有全局變量和文件描述符,允許程序員在一個(gè)進(jìn)程內(nèi)輕松地分離多個(gè)任務(wù)。

它共享一切,除了每個(gè)線程將有自己的程序計(jì)數(shù)器,堆棧和寄存器。由于每個(gè)線程都有自己的堆棧,所以線程之間不會(huì)共享局部變量。

由于一個(gè)進(jìn)程的所有線程共享相同的全局變量,所以同步訪問全局變量會(huì)出現(xiàn)問題。例如,我們假設(shè)你有一個(gè)全局變量X和兩個(gè)線程A和B.假設(shè)線程A和B只會(huì)增加X的值。當(dāng)線程A開始執(zhí)行時(shí),它將把X的值復(fù)制到寄存器中并遞增。在它有機(jī)會(huì)將值寫回內(nèi)存之前,此線程被暫停。下一個(gè)線程開始,讀取第一個(gè)線程讀取的相同的X值,遞增并寫回到內(nèi)存。然后,第一個(gè)線程完成執(zhí)行并將其值從寄存器寫回到內(nèi)存。在這兩個(gè)線程完成之后,X的值會(huì)按照您的預(yù)期遞增1而不是2。

評論0 贊同0
  •  加載中...

最新活動(dòng)

您已邀請0人回答 查看邀請

我的邀請列表

  • 擅長該話題
  • 回答過該話題
  • 我關(guān)注的人
向幫助了您的網(wǎng)友說句感謝的話吧!
付費(fèi)偷看金額在0.1-10元之間
<