標籤:style blog c tar http a
非原創 文字來自:http://www.cnblogs.com/yuanjianguo2012/p/3725480.html 純屬複製
進程和線程概念:
一個程式包含一個以上的進程,而一個進程又可以包含一個以上的線程,每一個進程都有自己獨立的記憶體空間,相應的一個進程中的所有線程都共用該記憶體空間。
進程:是一個具有一定獨立功能的程式關於某個資料集合的一次運行活動。它是作業系統動態執行的基本單元,在傳統的作業系統中,進程既是基本的資 源配置單位,也是基本的執行單元。獨立的地址空間使得不同的進程共用狀態資訊變得非常困難,為了共用資訊,它們必須顯式的使用(進程通訊機制),進程之間 通訊比較慢,因為進程式控制制和進程式通訊機制開銷很大。
線程:進程作為分配資源的基本單位,而把線程作為獨立運行和獨立調度的基本單位,由於線程比進程更小,基本上不擁有系統資源,故對它的調度所付 出的開銷就會小得多,能更高效的提高系統內多個程式間並發執行的程度。一個線程就是運行在進程內容相關的一個邏輯流。現代作業系統允許我們編寫一個進程裡同 時運行多個線程的程式。線程由核心調度。每個進程開始生命週期時都是單一線程,這個線程稱為主線程,在某一時刻,主線程建立一個對等線程。從這個時間點開 始,兩個線程就並發運行。最後,因為主線程執行一個慢速系統調用,如read或者sleep,控制就會通過環境切換傳遞到對等線程。在控制傳遞迴主線程 前,對等線程會執行一段時間。
(一) 傳統的程式執行方式是一種順序執行方式,即本句執行完成之後,才會執行下一句。
在調用一個函數或者執行一個數位塊時,執行該程式佔用系統主程式的執行時間,也就是說,這個函數或代碼塊不執行完系統是不會執行下一條指令的:
例如: 我們在主函數裡調用 [self doOneThing]; [self doTheSecondThing]; 只有第一個正確執行後才會執行下一個函數。
(二) 多線程下程式塊可以並發執行,大大地節省了程式的執行時間,下面列出建立多線程的幾種方式:
(1)使用performSelectorInBackground建立一個線程:也就是說在程式執行doThing與執行下一段程式是同步執行的
[self performSelectorInBackground:@selector(doThing) withObject:nil];
(2)直接建立一個線程,selector選取器則指明將要進行的操作,用這種方法時線程直接啟動:
[NSThread detachNewThreadSelector:@selector(doThing) toTarget:self withObject:nil];
(3)建立一個線程並設定啟動方式
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(doThing) object:nil];
thread.name = @"QingYun";
[thread start];
(4)建立一個多線程的隊列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
建立一個操作對象,這個操作對象定義了多線程需要執行作務
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doThing) object:nil];
[queue addOperation:operation]; // 將操作對象放到這個隊列裡,這樣線程就可以直接啟動
(5)使用Block塊操作對象的方式建立線程,添加到隊列中並啟動線程
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"do thing....");
[NSThread sleepForTimeInterval:10];
}
[queue addOperation:operation];
(6)使用隊列分發模式建立線程:下面以非同步分發建立線程為例說明其工作原理,在非同步線程中,在分發時系統對線程按順序分發下去,但在執行的過程中,則線程之間又存在相互競爭的關係。
dispatch_queue_t queque = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async (queque,^{
[NSThreadsleepForTimeInterval:5];
};
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
[NSThreadsleepForTimeInterval:5];
};