姓名:王重月? 學(xué)號(hào):21021211019? ?學(xué)院:電子工程學(xué)院
轉(zhuǎn)自:(30條消息) 嵌入式必備知識(shí)_Oliver.H的博客-CSDN博客_嵌入式基本知識(shí)必備
【嵌牛導(dǎo)讀】介紹進(jìn)程和線程的概念
【嵌牛鼻子】進(jìn)程和線程的優(yōu)點(diǎn)
【嵌牛提問(wèn)】什么是進(jìn)程、線程洛勉,各自有什么優(yōu)點(diǎn)
【嵌牛正文】
1.1 進(jìn)程和線程的概念
1.1.1 什么是進(jìn)程揍魂、線程,各自有什么優(yōu)點(diǎn)
概念:
進(jìn)程是對(duì)運(yùn)行時(shí)程序的封裝朝抖,是系統(tǒng)進(jìn)行資源調(diào)度和分配的的基本單位早芭,實(shí)現(xiàn)了操作系統(tǒng)的并發(fā)美旧;
線程是進(jìn)程的子任務(wù),是CPU調(diào)度和分派的基本單位渔肩,用于保證程序的實(shí)時(shí)性因俐,實(shí)現(xiàn)進(jìn)程內(nèi)部的并發(fā);線程是操作系統(tǒng)可識(shí)別的最小執(zhí)行和調(diào)度單位周偎。每個(gè)線程都獨(dú)自占用一個(gè)虛擬處理器:獨(dú)自的寄存器組抹剩,指令計(jì)數(shù)器和處理器狀態(tài)。每個(gè)線程完成不同的任務(wù)蓉坎,但是共享同一地址空間(也就是同樣的動(dòng)態(tài)內(nèi)存澳眷,映射文件,目標(biāo)代碼等等)蛉艾,打開(kāi)的文件隊(duì)列和其他內(nèi)核資源钳踊。
區(qū)別:
根本區(qū)別:進(jìn)程是操作系統(tǒng)資源分配的基本單位衷敌,而線程是處理器任務(wù)調(diào)度和執(zhí)行的基本單位
資源開(kāi)銷:每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(程序上下文),程序之間的切換會(huì)有較大的開(kāi)銷拓瞪;線程可以看做輕量級(jí)的進(jìn)程缴罗,同一類線程共享代碼和數(shù)據(jù)空間,每個(gè)線程都有自己獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC)祭埂,線程之間切換的開(kāi)銷小面氓。
包含關(guān)系:如果一個(gè)進(jìn)程內(nèi)有多個(gè)線程,則執(zhí)行過(guò)程不是一條線的蛆橡,而是多條線(線程)共同完成的舌界;線程是進(jìn)程的一部分,所以線程也被稱為輕權(quán)進(jìn)程或者輕量級(jí)進(jìn)程泰演。
內(nèi)存分配:同一進(jìn)程的線程共享本進(jìn)程的地址空間和資源呻拌,而進(jìn)程之間的地址空間和資源是相互獨(dú)立的
影響關(guān)系:一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其他進(jìn)程產(chǎn)生影響睦焕,但是一個(gè)線程崩潰整個(gè)進(jìn)程都死掉藐握。所以多進(jìn)程要比多線程健壯。
執(zhí)行過(guò)程:每個(gè)獨(dú)立的進(jìn)程有程序運(yùn)行的入口复亏、順序執(zhí)行序列和程序出口趾娃。但是線程不能獨(dú)立執(zhí)行缭嫡,必須依存在應(yīng)用程序中缔御,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制,兩者均可并發(fā)執(zhí)行
1.1.2 多進(jìn)程妇蛀、多線程的優(yōu)缺點(diǎn)
多進(jìn)程:操作系統(tǒng)中同時(shí)運(yùn)行的多個(gè)程序
多線程:在同一個(gè)進(jìn)程中同時(shí)運(yùn)行的多個(gè)任務(wù)
優(yōu)缺點(diǎn):
多進(jìn)程編程和多線程編程耕突,都可以使用并行機(jī)制來(lái)提升系統(tǒng)的運(yùn)行效率。二者的區(qū)別在于運(yùn)行時(shí)所占的內(nèi)存分布不同评架,多錢程是共用一套內(nèi)存的代碼塊區(qū)間眷茁;而多進(jìn)程是各用一套獨(dú)立的內(nèi)存區(qū)間。
多進(jìn)程的優(yōu)點(diǎn)是穩(wěn)定性好纵诞,一個(gè)子進(jìn)程崩潰了上祈,不會(huì)影響主進(jìn)程以及其余進(jìn)程≌丬剑基于這個(gè)特性登刺,常常會(huì)用多進(jìn)程來(lái)實(shí)現(xiàn)守護(hù)服務(wù)器的功能。
多進(jìn)程編程也有不足嗡呼,即創(chuàng)建進(jìn)程的代價(jià)非常大纸俭,因?yàn)椴僮飨到y(tǒng)要給每個(gè)進(jìn)程分配固定的資源,并且操作系統(tǒng)對(duì)進(jìn)程的總數(shù)會(huì)有一定的限制南窗,若進(jìn)程過(guò)多揍很,操作系統(tǒng)調(diào)度都會(huì)存在問(wèn)題郎楼,會(huì)造成假死狀態(tài)。
多線程編程的優(yōu)點(diǎn)是效率較高一些窒悔,適用于批處理任務(wù)等功能呜袁;不足之處在于,任何一個(gè)線程崩潰都可能造成整個(gè)進(jìn)程的崩潰蛉迹,因?yàn)樗鼈児蚕砹诉M(jìn)程的內(nèi)存資源池傅寡。
1.1.3 什么時(shí)候用進(jìn)程,什么時(shí)候用線程
1)多進(jìn)程模型的優(yōu)勢(shì)是CPU
2)多線程模型主要優(yōu)勢(shì)為線程間切換代價(jià)較小北救,因此適用于I/O密集型的工作場(chǎng)景荐操,因此I/O密集型的工作場(chǎng)景經(jīng)常會(huì)由于I/O阻塞導(dǎo)致頻繁的切換線程。同時(shí)珍策,多線程模型也適用于單機(jī)多核分布式場(chǎng)景托启。
1.1.4 多進(jìn)程、多線程同步(通訊)的方法
進(jìn)程間的通信方式:
管道( pipe ):
管道是一種半雙工的通信方式攘宙,數(shù)據(jù)只能單向流動(dòng)屯耸,而且只能在具有親緣關(guān)系的進(jìn)程間使用。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系蹭劈。
有名管道 (namedpipe) :
有名管道也是半雙工的通信方式疗绣,但是它允許無(wú)親緣關(guān)系進(jìn)程間的通信。
信號(hào)量(semophore ) :
信號(hào)量是一個(gè)計(jì)數(shù)器铺韧,可以用來(lái)控制多個(gè)進(jìn)程對(duì)共享資源的訪問(wèn)多矮。它常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問(wèn)共享資源時(shí)哈打,其他進(jìn)程也訪問(wèn)該資源塔逃。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段料仗。
消息隊(duì)列( messagequeue ) :
消息隊(duì)列是由消息的鏈表湾盗,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。消息隊(duì)列克服了信號(hào)傳遞信息少立轧、管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)格粪。
信號(hào) (sinal ) :
信號(hào)是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生氛改。
共享內(nèi)存(shared memory ) :
共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問(wèn)的內(nèi)存帐萎,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪問(wèn)平窘。共享內(nèi)存是最快的 IPC 方式吓肋,它是針對(duì)其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計(jì)的。它往往與其他通信機(jī)制瑰艘,如信號(hào)兩是鬼,配合使用肤舞,來(lái)實(shí)現(xiàn)進(jìn)程間的同步和通信。
套接字(socket ) :
套接口也是一種進(jìn)程間通信機(jī)制均蜜,與其他通信機(jī)制不同的是李剖,它可用于不同設(shè)備及其間的進(jìn)程通信。
線程間的通信方式:
鎖機(jī)制:包括互斥鎖囤耳、條件變量篙顺、讀寫鎖
互斥鎖提供了以排他方式防止數(shù)據(jù)結(jié)構(gòu)被并發(fā)修改的方法。
讀寫鎖允許多個(gè)線程同時(shí)讀共享數(shù)據(jù)充择,而對(duì)寫操作是互斥的德玫。
條件變量可以以原子的方式阻塞進(jìn)程,直到某個(gè)特定條件為真為止椎麦。對(duì)條件的測(cè)試是在互斥鎖的保護(hù)下進(jìn)行的宰僧。條件變量始終與互斥鎖一起使用。
信號(hào)量機(jī)制(Semaphore):包括無(wú)名線程信號(hào)量和命名線程信號(hào)量
信號(hào)機(jī)制(Signal):類似進(jìn)程間的信號(hào)處理
線程間的通信目的主要是用于線程同步观挎,所以線程沒(méi)有像進(jìn)程通信中的用于數(shù)據(jù)交換的通信機(jī)制琴儿。
1.1.5 進(jìn)程的空間模型
Linux下使用虛擬內(nèi)存空間給每一個(gè)進(jìn)程,32位操作系統(tǒng)下嘁捷,每個(gè)進(jìn)程都有獨(dú)立的4G虛擬內(nèi)存空間造成。
其中包括:
1、內(nèi)核區(qū):用戶代碼不可見(jiàn)的區(qū)域雄嚣,頁(yè)表就存放在這個(gè)區(qū)域中晒屎。
2、用戶區(qū):
a现诀、代碼段:只可讀夷磕,不可寫履肃,程序代碼段仔沿。
b、數(shù)據(jù)段:保存全局變量尺棋,靜態(tài)變量的區(qū)域封锉。
c、堆區(qū):就是動(dòng)態(tài)內(nèi)存膘螟,通過(guò)malloc成福,new申請(qǐng)內(nèi)存,有一個(gè)堆指針荆残,可以通過(guò)brk系統(tǒng)調(diào)用調(diào)整堆指針奴艾。
d、文件映射區(qū)域:通過(guò)mmap系統(tǒng)調(diào)用内斯,如動(dòng)態(tài)庫(kù)蕴潦,共享內(nèi)存等映射物理空間的內(nèi)存區(qū)域像啼。可以單獨(dú)釋放潭苞,不會(huì)產(chǎn)生內(nèi)存碎片忽冻。
e、棧區(qū):用于維護(hù)函數(shù)調(diào)用的上下文空間此疹,用ulimit -s 查看僧诚。一般默認(rèn)為8M
1.1.6 父進(jìn)程、子進(jìn)程的關(guān)系以及區(qū)別
關(guān)于資源:子進(jìn)程得到的是除了代碼段是與父進(jìn)程共享的以外蝗碎,其他所有的都是得到父進(jìn)程的一個(gè)副本湖笨,子進(jìn)程的所有資源都繼承父進(jìn)程,得到父進(jìn)程資源的副本蹦骑,既然為副本赶么,也就是說(shuō),二者并不共享地址空間脊串。兩個(gè)是單獨(dú)的進(jìn)程辫呻,繼承了以后二者就沒(méi)有什么關(guān)聯(lián)了,子進(jìn)程單獨(dú)運(yùn)行琼锋。(采用寫時(shí)復(fù)制技術(shù))
關(guān)于文件描述符:繼承父進(jìn)程的文件描述符時(shí)放闺,相當(dāng)于調(diào)用了dup函數(shù),父子進(jìn)程共享文件表項(xiàng)缕坎,即共同操作同一個(gè)文件怖侦,一個(gè)進(jìn)程修改了文件,另一個(gè)進(jìn)程也知道此文件被修改了谜叹。
1.2 并發(fā)匾寝,同步,異步荷腊,互斥艳悔,阻塞,非阻塞的理解
1.2.1 什么是線程同步和互斥
(1)互斥是指某一資源同時(shí)只允許一個(gè)訪問(wèn)者對(duì)其進(jìn)行訪問(wèn)女仰,具有唯一性和排它性猜年。但互斥無(wú)法限制訪問(wèn)者對(duì)資源的訪問(wèn)順序,即訪問(wèn)是無(wú)序的疾忍。
(2)同步是指在互斥的基礎(chǔ)上(大多數(shù)情況)乔外,通過(guò)其它機(jī)制實(shí)現(xiàn)訪問(wèn)者對(duì)資源的有序訪問(wèn)。
(3)同步其實(shí)已經(jīng)實(shí)現(xiàn)了互斥一罩,所以同步是一種更為復(fù)雜的互斥杨幼。
(4)互斥是一種特殊的同步。
1.2.2 線程同步與阻塞的關(guān)系?同步一定阻塞嗎差购?阻塞一定同步嗎补疑?
同步是個(gè)過(guò)程,阻塞是線程的一種狀態(tài)歹撒。多個(gè)線程操作共享變量時(shí)可能會(huì)出現(xiàn)競(jìng)爭(zhēng)莲组。這時(shí)需要同步來(lái)防止兩個(gè)以上的線程同時(shí)進(jìn)入臨界區(qū),在這個(gè)過(guò)程中暖夭,后進(jìn)入臨界區(qū)的線程將阻塞锹杈,等待先進(jìn)入的線程走出臨界區(qū)。
線程同步不一定發(fā)生阻塞B踝拧=咄!線程同步的時(shí)候裕菠,需要協(xié)調(diào)推進(jìn)速度咬清,互相等待和互相喚醒會(huì)發(fā)生阻塞狂秦。
1.3 孤兒進(jìn)程院尔、僵尸進(jìn)程、守護(hù)進(jìn)程的概念
1.3.1 基本概念
1)正常進(jìn)程
正常情況下季惩,子進(jìn)程是通過(guò)父進(jìn)程創(chuàng)建的画髓,子進(jìn)程再創(chuàng)建新的進(jìn)程掘剪。子進(jìn)程的結(jié)束和父進(jìn)程的運(yùn)行是一個(gè)異步過(guò)程,即父進(jìn)程永遠(yuǎn)無(wú)法預(yù)測(cè)子進(jìn)程到底什么時(shí)候結(jié)束奈虾。 當(dāng)一個(gè)進(jìn)程完成它的工作終止之后夺谁,它的父進(jìn)程需要調(diào)用wait()或者waitpid()系統(tǒng)調(diào)用取得子進(jìn)程的終止?fàn)顟B(tài)。
unix提供了一種機(jī)制可以保證只要父進(jìn)程想知道子進(jìn)程結(jié)束時(shí)的狀態(tài)信息肉微, 就可以得到:在每個(gè)進(jìn)程退出的時(shí)候匾鸥,內(nèi)核釋放該進(jìn)程所有的資源,包括打開(kāi)的文件碉纳,占用的內(nèi)存等勿负。 但是仍然為其保留一定的信息,直到父進(jìn)程通過(guò)wait / waitpid來(lái)取時(shí)才釋放村象。保存信息包括:
1進(jìn)程號(hào)the process ID
2退出狀態(tài)the termination status of the process
3運(yùn)行時(shí)間the amount of CPU time taken by the process等
2)孤兒進(jìn)程
一個(gè)父進(jìn)程退出笆环,而它的一個(gè)或多個(gè)子進(jìn)程還在運(yùn)行攒至,那么那些子進(jìn)程將成為孤兒進(jìn)程厚者。孤兒進(jìn)程將被init進(jìn)程(進(jìn)程號(hào)為1)所收養(yǎng),并由init進(jìn)程對(duì)它們完成狀態(tài)收集工作迫吐。
3)僵尸進(jìn)程
一個(gè)進(jìn)程使用fork創(chuàng)建子進(jìn)程库菲,如果子進(jìn)程退出,而父進(jìn)程并沒(méi)有調(diào)用wait或waitpid獲取子進(jìn)程的狀態(tài)信息志膀,那么子進(jìn)程的進(jìn)程描述符仍然保存在系統(tǒng)中熙宇。這種進(jìn)程稱之為僵尸進(jìn)程鳖擒。
僵尸進(jìn)程是一個(gè)進(jìn)程必然會(huì)經(jīng)過(guò)的過(guò)程:這是每個(gè)子進(jìn)程在結(jié)束時(shí)都要經(jīng)過(guò)的階段。
如果子進(jìn)程在exit()之后烫止,父進(jìn)程沒(méi)有來(lái)得及處理蒋荚,這時(shí)用ps命令就能看到子進(jìn)程的狀態(tài)是“Z”。如果父進(jìn)程能及時(shí) 處理馆蠕,可能用ps命令就來(lái)不及看到子進(jìn)程的僵尸狀態(tài)期升,但這并不等于子進(jìn)程不經(jīng)過(guò)僵尸狀態(tài)。
如果父進(jìn)程在子進(jìn)程結(jié)束之前退出互躬,則子進(jìn)程將由init接管播赁。init將會(huì)以父進(jìn)程的身份對(duì)僵尸狀態(tài)的子進(jìn)程進(jìn)行處理。
3)守護(hù)進(jìn)程
守護(hù)進(jìn)程(daemon)是一類在后臺(tái)運(yùn)行的特殊進(jìn)程吼渡,用于執(zhí)行特定的系統(tǒng)任務(wù)容为。守護(hù)進(jìn)程是一個(gè)在后臺(tái)運(yùn)行并且不受任何終端控制的進(jìn)程。Unix操作系統(tǒng)有很多典型的守護(hù)進(jìn)程(其數(shù)目根據(jù)需要或20—50不等)寺酪,它們?cè)诤笈_(tái)運(yùn)行坎背,執(zhí)行不同的管理任務(wù)。
1.3.2正確處理僵尸進(jìn)程的方法
方法一:父進(jìn)程回收法
wait函數(shù)將使其調(diào)用者阻塞寄雀,直到其某個(gè)子進(jìn)程終止沼瘫。故父進(jìn)程可調(diào)用wait函數(shù)回收其僵尸子進(jìn)程。
方法二:init進(jìn)程回收法
如果父進(jìn)程先于子進(jìn)程結(jié)束咙俩,那么子進(jìn)程的父進(jìn)程自動(dòng)改為 init 進(jìn)程耿戚。
如果 init 的子進(jìn)程結(jié)束,則 init 進(jìn)程會(huì)自動(dòng)回收其子進(jìn)程的資源而不是讓它變成僵尸進(jìn)程阿趁。
————————————————
版權(quán)聲明:本文為CSDN博主「Oliver.H」的原創(chuàng)文章膜蛔,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明脖阵。
原文鏈接:https://blog.csdn.net/weixin_43253519/article/details/108351553