操作系統(tǒng)概念:
-
程序皮假、進(jìn)程帽撑、線程
程序:由源代碼生成的可執(zhí)行應(yīng)用叛薯。
進(jìn)程:一個(gè)正在運(yùn)行的程序可以看做一個(gè)進(jìn)程,進(jìn)程擁有獨(dú)立運(yùn)行所需要的全部資源帮匾,是資源分配的基本單位。
線程:程序中獨(dú)立運(yùn)行的代碼段痴鳄。是調(diào)度運(yùn)行的基本單位瘟斜。
一個(gè)進(jìn)程是由一或多個(gè)線程組成,進(jìn)程只負(fù)責(zé)資源的調(diào)度和分配,線程才是程序真正的執(zhí)行單元哼转,負(fù)責(zé)代碼的執(zhí)行明未。
-
進(jìn)程控制塊PCB
描述和控制進(jìn)程的運(yùn)行,系統(tǒng)為每個(gè)進(jìn)程定義了一個(gè)數(shù)據(jù)結(jié)構(gòu)——進(jìn)程控制塊(PCB)壹蔓。是進(jìn)程重要的組成部分趟妥,它記錄了操作系統(tǒng)所需的、用于描述進(jìn)程的當(dāng)前狀態(tài)和控制進(jìn)程的全部信息佣蓉。 操作系統(tǒng)就是根據(jù)進(jìn)程的PCB來(lái)感知進(jìn)程的存在披摄,并依此對(duì)進(jìn)程進(jìn)行管理和控制。 PCB是進(jìn)程存在的唯一標(biāo)識(shí)勇凭。
PCB主要包括:進(jìn)程標(biāo)識(shí)信息疚膊、處理機(jī)狀態(tài)(PSW)、進(jìn)程調(diào)度信息(狀態(tài)虾标、優(yōu)先級(jí)等)寓盗、進(jìn)程控制信息 (程序和數(shù)據(jù)地址、進(jìn)程同步和通信機(jī)制等)璧函。
-
進(jìn)程上下文
進(jìn)程執(zhí)行時(shí)需要操作系統(tǒng)為其設(shè)置相應(yīng)的執(zhí)行環(huán)境傀蚌,如系統(tǒng)堆棧、地址映像寄存器蘸吓、程序計(jì)數(shù)器善炫、程序狀態(tài)字、打開(kāi)文件表以及相關(guān)通用寄存器等库继。 所以箩艺,把進(jìn)程的物理實(shí)體與支持進(jìn)程執(zhí)行的物理環(huán)境合稱為進(jìn)程上下文。
-
進(jìn)程上下文切換
進(jìn)程上下文切換發(fā)生在不同的進(jìn)程之間而不是同一個(gè)進(jìn)程內(nèi)宪萄。
進(jìn)程上下文切換分成三個(gè)步驟:
(1) 把被切換進(jìn)程的相關(guān)信息保存到有關(guān)存儲(chǔ)區(qū)艺谆,例如該進(jìn)程的PCB中。
(2) 操作系統(tǒng)中的調(diào)度和資源分配程序執(zhí)行拜英,選取新的進(jìn)程静汤。
(3) 將被選中進(jìn)程的原來(lái)保存的正文部分從有關(guān)存儲(chǔ)區(qū)中取出,并送至寄存器與堆棧中,激活被選中進(jìn)程執(zhí)行聊记。
-
單線程與多線程
單線程
每個(gè)正在運(yùn)行的程序(即進(jìn)程),至少包括一個(gè)線程恢暖,這個(gè)線程叫主線程排监。
主線程在程序啟動(dòng)時(shí)被創(chuàng)建,用于執(zhí)行main函數(shù)杰捂。只有一個(gè)主線程的程序舆床,稱作單線程程序。
主線程負(fù)責(zé)執(zhí)行程序的所有代碼(UI展現(xiàn)以及刷新,網(wǎng)絡(luò)請(qǐng)求挨队,本地存儲(chǔ)等等)谷暮。這些代碼只能順序執(zhí)行,無(wú)法并發(fā)執(zhí)行盛垦。
多線程
擁有多個(gè)線程的程序湿弦,稱作多線程程序。
iOS允許用戶自己開(kāi)辟新的線程腾夯,相對(duì)于主線程來(lái)講颊埃,這些線程,稱為子線程蝶俱“嗬可以根據(jù)需要開(kāi)辟若干子線程。
子線程和主線程都是獨(dú)立的運(yùn)行單元榨呆,各自的執(zhí)行互不影響罗标,因此能夠并發(fā)執(zhí)行。
-
進(jìn)程間通信方式
進(jìn)程間通信(IPC积蜻,Interprocess communication)是一組編程接口闯割,讓程序員能夠協(xié)調(diào)不同的進(jìn)程,使之能在一個(gè)操作系統(tǒng)里同時(shí)運(yùn)行浅侨,并相互傳遞纽谒、交換信息。這使得一個(gè)程序能夠在同一時(shí)間里處理許多用戶的要求如输。因?yàn)榧词怪挥幸粋€(gè)用戶發(fā)出要求鼓黔,也可能導(dǎo)致一個(gè)操作系統(tǒng)中多個(gè)進(jìn)程的運(yùn)行,進(jìn)程之間必須互相通話不见。IPC接口就提供了這種可能性澳化。每個(gè)IPC方法均有它自己的優(yōu)點(diǎn)和局限性,一般稳吮,對(duì)于單個(gè)程序而言使用所有的IPC方法是不常見(jiàn)的缎谷。
IPC方法包括管道(PIPE)、消息排隊(duì)灶似、旗語(yǔ)列林、共用內(nèi)存以及套接字(Socket)。
- 管道( pipe ):管道是一種半雙工的通信方式酪惭,數(shù)據(jù)只能單向流動(dòng)希痴,而且只能在具有親緣關(guān)系的進(jìn)程間使用。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系春感。
- 有名管道 (named pipe) : 有名管道也是半雙工的通信方式砌创,但是它允許無(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ì)列( message queue ) : 消息隊(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ī)制不同的是颅筋,它可用于不同及其間的進(jìn)程通信。
-
線程之間的通信方式
鎖機(jī)制:包括互斥鎖输枯、條件變量议泵、讀寫(xiě)鎖
*互斥鎖提供了以排他方式防止數(shù)據(jù)結(jié)構(gòu)被并發(fā)修改的方法。
*讀寫(xiě)鎖允許多個(gè)線程同時(shí)讀共享數(shù)據(jù)桃熄,而對(duì)寫(xiě)操作是互斥的先口。
*條件變量可以以原子的方式阻塞進(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ī)制谐宙。
-
多進(jìn)程與多線程對(duì)比
-
什么時(shí)候用多線程?什么時(shí)候用多進(jìn)程?
1)需要頻繁創(chuàng)建銷毀的優(yōu)先用線程
原因請(qǐng)看上面的對(duì)比血崭。
這種原則最常見(jiàn)的應(yīng)用就是Web服務(wù)器了卧惜,來(lái)一個(gè)連接建立一個(gè)線程,斷了就銷毀線程夹纫,要是用進(jìn)程咽瓷,創(chuàng)建和銷毀的代價(jià)是很難承受的
2)需要進(jìn)行大量計(jì)算的優(yōu)先使用線程
所謂大量計(jì)算,當(dāng)然就是要耗費(fèi)很多CPU舰讹,切換頻繁了茅姜,這種情況下線程是最合適的。
這種原則最常見(jiàn)的是圖像處理月匣、算法處理钻洒。
3)強(qiáng)相關(guān)的處理用線程,弱相關(guān)的處理用進(jìn)程
什么叫強(qiáng)相關(guān)锄开、弱相關(guān)素标?理論上很難定義,給個(gè)簡(jiǎn)單的例子就明白了萍悴。
一般的Server需要完成如下任務(wù):消息收發(fā)头遭、消息處理⊙⒂眨“消息收發(fā)”和“消息處理”就是弱相關(guān)的任務(wù)计维,而“消息處理”里面可能又分為“消息解碼”、“業(yè)務(wù)處理”撕予,這兩個(gè)任務(wù)相對(duì)來(lái)說(shuō)相關(guān)性就要強(qiáng)多了鲫惶。因此“消息收發(fā)”和“消息處理”可以分進(jìn)程設(shè)計(jì),“消息解碼”实抡、“業(yè)務(wù)處理”可以分線程設(shè)計(jì)欠母。
當(dāng)然這種劃分方式不是一成不變的,也可以根據(jù)實(shí)際情況進(jìn)行調(diào)整澜术。
4)可能要擴(kuò)展到多機(jī)分布的用進(jìn)程艺蝴,多核分布的用線程
原因請(qǐng)看上面對(duì)比。
5)都滿足需求的情況下鸟废,用你最熟悉猜敢、最拿手的方式
至于“數(shù)據(jù)共享、同步”盒延、“編程缩擂、調(diào)試”、“可靠性”這幾個(gè)維度的所謂的“復(fù)雜添寺、簡(jiǎn)單”應(yīng)該怎么取舍胯盯,我只能說(shuō):沒(méi)有明確的選擇方法。但我可以告訴你一個(gè)選擇原則:如果多進(jìn)程和多線程都能夠滿足要求计露,那么選擇你最熟悉博脑、最拿手的那個(gè)憎乙。
-
進(jìn)程狀態(tài)轉(zhuǎn)換圖
1)運(yùn)行:當(dāng)一個(gè)進(jìn)程在處理機(jī)上運(yùn)行時(shí),則稱該進(jìn)程處于運(yùn)行狀態(tài)叉趣。處于此狀態(tài)的進(jìn)程的數(shù)目小于等于處理器的數(shù)目泞边,對(duì)于單處理機(jī)系統(tǒng),處于運(yùn)行狀態(tài)的進(jìn)程只有一個(gè)疗杉。在沒(méi)有其他進(jìn)程可以執(zhí)行時(shí)(如所有進(jìn)程都在阻塞狀態(tài))阵谚,通常會(huì)自動(dòng)執(zhí)行系統(tǒng)的空閑進(jìn)程。
(2)就緒:當(dāng)一個(gè)進(jìn)程獲得了除處理機(jī)以外的一切所需資源烟具,一旦得到處理機(jī)即可運(yùn)行梢什,則稱此進(jìn)程處于就緒狀態(tài)。就緒進(jìn)程可以按多個(gè)優(yōu)先級(jí)來(lái)劃分隊(duì)列朝聋。例如嗡午,當(dāng)一個(gè)進(jìn)程由于時(shí)間片用完而進(jìn)入就緒狀態(tài)時(shí),排入低優(yōu)先級(jí)隊(duì)列冀痕;當(dāng)進(jìn)程由I/O操作完成而進(jìn)入就緒狀態(tài)時(shí)翼馆,排入高優(yōu)先級(jí)隊(duì)列。
(3)阻塞:也稱為等待或睡眠狀態(tài)金度,一個(gè)進(jìn)程正在等待某一事件發(fā)生(例如請(qǐng)求I/O而等待I/O完成等)而暫時(shí)停止運(yùn)行应媚,這時(shí)即使把處理機(jī)分配給進(jìn)程也無(wú)法運(yùn)行,故稱該進(jìn)程處于阻塞狀態(tài)猜极。
參考于:http://blog.csdn.net/hyqsong/article/details/51592992
-
線程狀態(tài)轉(zhuǎn)換圖