進(jìn)程: 一個在內(nèi)存中運行的應(yīng)用程序。進(jìn)程是表示資源分配的的基本概念。
10年積累的做網(wǎng)站、網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有犍為免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
線程: 進(jìn)程中的一個執(zhí)行任務(wù)(控制單元),負(fù)責(zé)當(dāng)前進(jìn)程中程序的執(zhí)行。
1、根本區(qū)別: 進(jìn)程是操作系統(tǒng)資源分配的基本單位,而線程是處理器任務(wù)調(diào)度和執(zhí)行的基本單位。? ??
2、一個線程只能屬于一個進(jìn)程,但是一個進(jìn)程可以擁有多個線程。多線程處理就是允許一個進(jìn)程中在同一時刻執(zhí)行多個任務(wù)。
3、進(jìn)程有自己的獨立地址空間,進(jìn)程之間的地址空間和資源是相互獨立的;而線程是共享進(jìn)程中的地址空間和資源。也因此線程之間切換比進(jìn)程之間切換的資源開銷小,同樣創(chuàng)建一個線程的開銷也比進(jìn)程要小很多。? ? ? ? ? ? ? ? ? ? ? ? ? ?
4、因為同一進(jìn)程下的線程共享全局變量、靜態(tài)變量等數(shù)據(jù),所以線程之間的通信更方便。而進(jìn)程之間通信需要要復(fù)雜一些。
5、多進(jìn)程程序更健壯,因為進(jìn)程有自己獨立的地址空間,一個進(jìn)程崩潰后,在保護(hù)模式下不會對其他進(jìn)程產(chǎn)生影響,但是一個線程崩潰整個進(jìn)程都死掉。
6、每個獨立的進(jìn)程有程序運行的入口、順序執(zhí)行序列和程序出口。但是線程不能獨立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個線程執(zhí)行控制,兩者均可并發(fā)執(zhí)行:
多進(jìn)程:操作系統(tǒng)中同時運行的多個程序
多線程:在同一個進(jìn)程中同時運行的多個任務(wù)
進(jìn)程通信(Interprocess Communication,IPC)是一個進(jìn)程與另一個進(jìn)程間共享消息的一種通信方式。
進(jìn)程通信的目的
數(shù)據(jù)傳輸:一個進(jìn)程需要將其數(shù)據(jù)發(fā)送給另一進(jìn)程。
共享數(shù)據(jù):多個進(jìn)程操作共享數(shù)據(jù)。
事件通知:一個進(jìn)程需要向另一個或一組進(jìn)程發(fā)送消息,通知它(它們)發(fā)生了某種事件。
進(jìn)程控制:有些進(jìn)程希望完全控制另一個進(jìn)程的執(zhí)行(如Debug進(jìn)程。
進(jìn)程通信方式
每個進(jìn)程各自有不同的地址空間,任何一個進(jìn)程的全局變量在另一個進(jìn)程中都看不到,所以進(jìn)程之間要交換數(shù)據(jù)必須通過內(nèi)核,在內(nèi)核中開辟一塊緩沖區(qū),進(jìn)程A把數(shù)據(jù)從用戶空間拷到內(nèi)核緩沖區(qū),進(jìn)程B再從內(nèi)核緩沖區(qū)把數(shù)據(jù)讀走,內(nèi)核提供的這種機(jī)制稱為進(jìn)程間通信。
1.無名管道( pipe ):管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動,而且只能在具有親緣關(guān)系的進(jìn)程間使用。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。
2.高級管道(popen):將另一個程序當(dāng)做一個新的進(jìn)程在當(dāng)前程序進(jìn)程中啟動,則它算是當(dāng)前程序的子進(jìn)程,這種方式我們成為高級管道方式。
3.有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關(guān)系進(jìn)程間的通信。
4.消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內(nèi)核中并由消息隊列標(biāo)識符標(biāo)識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點。
5.信號量( semophore ) : 信號量是一個計數(shù)器,可以用來控制多個進(jìn)程對共享資源的訪問。它常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問共享資源時,其他進(jìn)程也訪問該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。
6.信號 ( sinal ) : 信號是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個事件已經(jīng)發(fā)生。
7.共享內(nèi)存( shared memory ) :共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問的內(nèi)存,這段共享內(nèi)存由一個進(jìn)程創(chuàng)建,但多個進(jìn)程都可以訪問。共享內(nèi)存是最快的 IPC 方式,它是針對其他進(jìn)程間通信方式運行效率低而專門設(shè)計的。它往往與其他通信機(jī)制,如信號量,配合使用,來實現(xiàn)進(jìn)程間的同步和通信。
8.套接字( socket ) : 套解字也是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是,它可用于不同機(jī)器間的進(jìn)程通信。
線程的不安全是由于多線程訪問和修改共享資源而引起的不可預(yù)測的結(jié)果。
ios多線程開發(fā)中為保證線程的安全常用到的幾種鎖: NSLock 、 dispatch_semaphore 、 NSCondition 、 NSRecursiveLock 、 @synchronized 。
WEAKSELF typeof(self) __weak weakSelf = self;
NSLock 是OC層封裝底層線程操作來實現(xiàn)的一種鎖,繼承NSLocking協(xié)議。不能迭代加鎖,如果發(fā)生兩次lock,而未unlock過,則會產(chǎn)生死鎖問題。
以車站購票為例,多個窗口同時售票(同步),每個窗口有人循環(huán)購票:
原子操作
原子操作是指不可打斷的操作,也就是說線程在執(zhí)行操作的過程中,不會被操作系統(tǒng)掛起,而是一定會執(zhí)行完,
變量屬性Property中的原子定義
一般我們定義一個變量@property (nonatomic ,strong)NSLock *lock;nonatomic:非原子性,不會為setter方法加鎖,適合內(nèi)存小的移動設(shè)備;atomic:原子性,默認(rèn)為setter方法加鎖(默認(rèn)就是atomic),線程安全。
PS: 在iOS開發(fā)過程中,一般都將屬性聲明為nonatomic,盡量避免多線程搶奪同一資源,盡量將加鎖等資源搶奪業(yè)務(wù)交給服務(wù)器。
NSCondition常用于生產(chǎn)者-消費者模式,它繼承了NSLocking協(xié)議,同樣有l(wèi)ock和unlock方法。條件變量有點像信號量,提供了線程阻塞和信號機(jī)制,因此可以用來阻塞某個線程,并等待數(shù)據(jù)就緒再喚醒程序。
信號量主要有3個函數(shù),分別是:
注意: 正常的使用順序是先降低然后提高,這兩個函數(shù)通常都是成對出現(xiàn)。
本文主要參考了這篇文章(
),并對其中所能理解的部分進(jìn)行一一驗證,以前沒怎么寫過類似的,如果有什么做的不好的地方還請大家多多見諒!
上一節(jié)中,我們探究了OC中重要的實現(xiàn)多線程的方法——NSOperation。本節(jié)中,我們了解一下不常用的一種創(chuàng)建多線程的方式——pThread。
相關(guān)鏈接:
NSOpreation鏈接: iOS詳解多線程(實現(xiàn)篇——NSOperation)
GCD鏈接: iOS詳解多線程(實現(xiàn)篇——GCD)
NSThread鏈接: 詳解多線程(實現(xiàn)篇——NSThread)
多線程概念篇鏈接: 詳解多線程(概念篇——進(jìn)程、線程以及多線程原理)
源碼鏈接:
1.NSThread(OC)
2.GCD(C語言)
3.NSOperation(OC)
5.其他實現(xiàn)多線程方法
pThread并不是OC特有的實現(xiàn)多線程的方法,而是Unix、Linux還有Windows都通用的一種實現(xiàn)多線程的方式。
pThread的全稱是POSIX threads,是線程的 POSIX 標(biāo)準(zhǔn)。
pThread是C語言的,在iOS的開發(fā)中極少使用。
使用之前,記得先導(dǎo)入頭文件
運行結(jié)果:
從結(jié)果可以看出,開啟了新的線程,執(zhí)行任務(wù)。
pthread_create() 創(chuàng)建一個線程
pthread_exit() 終止當(dāng)前線程
pthread_cancel() 中斷另外一個線程的運行
pthread_join() 阻塞當(dāng)前的線程,直到另外一個線程運行結(jié)束
pthread_attr_init() 初始化線程的屬性
pthread_attr_setdetachstate() 設(shè)置脫離狀態(tài)的屬性(決定這個線程在終止時是否可以被結(jié)合)
pthread_attr_getdetachstate() 獲取脫離狀態(tài)的屬性
pthread_attr_destroy() 刪除線程的屬性
pthread_kill() 向線程發(fā)送一個信號
由于pThread我們基本用不到,所以不再做深入研究。
線程和進(jìn)程在我們開發(fā)中,跟我們一直形影不離,那么什么是進(jìn)程,什么是線程,它們又有什么關(guān)系,這篇文章將為您簡單介紹。
線程概念
進(jìn)程概念
地址空間:同?進(jìn)程的線程共享本進(jìn)程的地址空間( TLS是本地的線程棧存空間,線程的局部空間是某些操作系統(tǒng)為線程提供的私有空間,只具備有限的容量,并不屬于線程,由操作系統(tǒng)單獨安排的 ),?進(jìn)程之間則是獨?的地址空間。
資源擁有:同?進(jìn)程內(nèi)的線程共享本進(jìn)程的資源如內(nèi)存、I/O、cpu等,但是進(jìn)程之間的資源是獨?的。
優(yōu)點:
缺點:
時間?的概念:CPU在多個任務(wù)直接進(jìn)?快速的切換,這個時間間隔就是時間?。
多線程同時執(zhí)行
如果線程非常多
互斥鎖?結(jié)
互斥鎖參數(shù)
nonatomic?原?屬性
atomic原?屬性(線程安全),針對多線程設(shè)計的,默認(rèn)值,保證同?時間只有?個線程能夠?qū)?(但是同?個時間多個線程都可以取值)
atomic本身就有?把鎖(?旋鎖)
單寫多讀:單個線程寫?,多個線程可以讀取
atomic:線程安全,需要消耗?量的資源
nonatomic:?線程安全,適合內(nèi)存?的移動設(shè)備
iOS開發(fā)建議
所有屬性都聲明為nonatomic
盡量避免多線程搶奪同一塊資源
盡量將加鎖,資源搶奪的業(yè)務(wù)邏輯交給服務(wù)器處理,減少APP的壓力
這篇文章簡單介紹了線程與進(jìn)程的概念,煩請大家不吝賜教。
一.狀態(tài)概述
新建線程,線程就緒,執(zhí)行線程,sleep,等待同步鎖
NSThread *thread = [[NSThread alloc] initWithTarget:selfselector:@selector(run)object:nil];
就緒cpu可以調(diào)用執(zhí)行
[thread start];
概圖:
二.控制線程狀態(tài)
1.啟動線程
- (void)start;
//進(jìn)入就緒狀態(tài)-運行狀態(tài)。當(dāng)線程任務(wù)執(zhí)行完畢,自動進(jìn)入死亡狀態(tài)
2.阻塞(暫停)線程
+ (void)sleepUntilDate:(NSDate*)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
//進(jìn)入阻塞狀態(tài)
3.強(qiáng)制停止線程
+ (void)exit;
//進(jìn)入死亡狀態(tài)
Dome:
網(wǎng)頁題目:ios開發(fā)線程,ios開發(fā)多線程在項目中的使用
本文網(wǎng)址:http://aaarwkj.com/article32/dsieipc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、虛擬主機(jī)、網(wǎng)站建設(shè)、用戶體驗、服務(wù)器托管、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)