iOS面試題-關(guān)于多線程

1.什么是進(jìn)程窑睁,什么是線程?

進(jìn)程是一個正在運行的應(yīng)用程序葵孤,一個應(yīng)用程序可以對應(yīng)一個或多個進(jìn)程担钮。應(yīng)用程序是一個沒有生命的實體,只有運行以后尤仍,才能稱為一個活動的實體箫津,也就是進(jìn)程。

進(jìn)程是操作系統(tǒng)分配資源的基本單元宰啦。進(jìn)程在運行的過程中擁有獨立的內(nèi)存單元苏遥,一個進(jìn)程崩潰后,不會對其他進(jìn)程造成影響绑莺。

線程是獨立運行和獨立調(diào)度的基本單位暖眼,線程才是程序真正的執(zhí)行單元負(fù)責(zé)代碼的執(zhí)行一個進(jìn)程可以有一個或多個線程纺裁,同一個進(jìn)程的線程共享進(jìn)程的內(nèi)存資源。線程沒有單獨的地址空間司澎,一個線程崩潰整個進(jìn)程就會崩潰欺缘。

2.什么是多線程?

多線程的實現(xiàn)原理:事實上挤安,同一時間內(nèi)單核的CPU只能執(zhí)行一個線程谚殊,多線程是CPU快速的在多個線程之間進(jìn)行切換(調(diào)度),造成了多個線程同時執(zhí)行的假象蛤铜。

如果是多核CPU就真的可以同時處理多個線程了嫩絮。

多線程的目的是為了同步完成多項任務(wù),通過提高系統(tǒng)的資源利用率來提高系統(tǒng)的效率围肥。

3.多線程有什么優(yōu)點和缺點剿干?

多線程可以提高系統(tǒng)的資源利用率,從而提高系統(tǒng)的效率穆刻。

開啟多線程需要花費時間和空間置尔,開啟過多的線程反而會降低性能,cpu頻繁的在多個線程中調(diào)度會消耗大量的CPU資源氢伟,把CPU累死榜轿。所以幽歼,不要在系統(tǒng)中同時開啟過多的子線程。

參考:iOS多線程總結(jié)

4.線程創(chuàng)建實際的開銷在內(nèi)存方面是有多大谬盐?

蘋果官方文檔說甸私,開啟線程需要消耗內(nèi)存資源和性能。每一個線程都需要分配系統(tǒng)內(nèi)核空間和程序的內(nèi)存空間飞傀。

Each thread requires the allocation of memory in both the kernel memory space and your program’s memory space. The core structures needed to manage your thread and coordinate its scheduling are stored in the kernel using wired memory. Your thread’s stack space and per-thread data is stored in your program’s memory space.

下面是一張具體的圖:

創(chuàng)建線程花費的開銷

簡單來說颠蕴,創(chuàng)建線程需要花費大約90微秒的時間和512KB的棧空間助析,以及1KB的內(nèi)核空間犀被。

參考:官方文檔

5.多線程在開發(fā)中的使用場景?

在實際開發(fā)中應(yīng)該將一些耗時的操作放在子線程執(zhí)行外冀,iOS中默認(rèn)有一個主線程寡键,用來響應(yīng)用戶的手勢和刷新UI,如果在主線程執(zhí)行耗時操作就會把頁面卡死雪隧,直到執(zhí)行完了這個操作才能操作界面西轩。一定要在主線程刷新UI的原因:iOS為了保證效率,多線程是線程不安全的脑沿,在子線程刷新UI可能會導(dǎo)致未知錯誤藕畔。

6.iOS中實現(xiàn)多線程的幾種方案,各自有什么特點庄拇?

Pthread 是用c語言實現(xiàn)的注服,非常底層的多線程實現(xiàn)方案,在開發(fā)中很少用到措近。需要程序員手動管理線程的生命周期(手動創(chuàng)建和銷毀)溶弟。

NSThread 面向?qū)ο蟮模枰绦騿T手動創(chuàng)建線程瞭郑,但不需要手動銷毀辜御。子線程間通信很難。

創(chuàng)建子線程:

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(testThread:) object:@"我是參數(shù)"];//有返回值屈张,可以拿到返回值設(shè)置線程的優(yōu)先級和名稱

[thread start];//需要手動開啟

[NSThread detachNewThreadSelector:@selector(testThread:) toTarget:self withObject:@"便利構(gòu)造器方式"];//沒有返回值擒权,不需要手動開啟

[self performSelectorInBackground:@selector(run:)withObject:@"開啟后臺線程"];//沒有返回值,不需要手動開啟阁谆,只要是NSObject對象或者是NSObject的子類對象都可以用這種方法開啟子線程碳抄,用下面的方法回到主線程

回到主線程:

[self performSelectorOnMainThread:@selector(backMainThread) withObject:nil waitUntilDone:YES];//回到主線程的方法

GCD c語言,充分利用了設(shè)備的多核笛厦,自動管理線程生命周期纳鼎。比NSOperation效率更高。

gcd的用法很多,不寫了贱鄙。

參考:gcd劝贸、關(guān)于iOS多線程看我就夠了

NSOperation 基于gcd封裝,更加面向?qū)ο蠖耗萭cd多了一些功能映九。

兩個概念:操作(NSOperation)和隊列(NSOperationQueue)

創(chuàng)建隊列:

NSOperationQueue*mainQueue = [NSOperationQueuemainQueue];//創(chuàng)建主隊列,串行隊列

NSOperationQueue*queue = [[NSOperationQueue alloc]init];//創(chuàng)建非主隊列瞎颗,同時具備串行隊列和并發(fā)隊列的功能件甥。可以設(shè)置最大并發(fā)數(shù)哼拔,實現(xiàn)串行和并行的功能引有。

創(chuàng)建任務(wù)

NSInvocationOperation* opt1 = [[NSInvocationOperation alloc]initWithTarget:selfselector:@selector(task1)object:nil];

[queueaddOperation:opt1];//不需要手動啟動隊列

NSBlockOperation*blockOperation = [NSBlockOperationblockOperationWithBlock:^{NSLog(@"block --- %@",[NSThreadcurrentThread]); }];

[queue addOperation:blockOperation];

也可以不創(chuàng)建任務(wù),直接用block向隊列添加任務(wù):

[mainQueue addOperationWithBlock:^{ ? ? ? ? ??

self.myImage.image= image;

?NSLog(@"ui-------%@",[NSThreadcurrentThread]);

?}];

NSOperation一些特有的用法:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倦逐,一起剝皮案震驚了整個濱河市譬正,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌檬姥,老刑警劉巖曾我,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異健民,居然都是意外死亡抒巢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門秉犹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛉谜,“玉大人,你說我怎么就攤上這事凤优≡寐” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵筑辨,是天一觀的道長。 經(jīng)常有香客問我幸逆,道長棍辕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任还绘,我火速辦了婚禮楚昭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拍顷。我一直安慰自己抚太,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尿贫,像睡著了一般电媳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庆亡,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天匾乓,我揣著相機(jī)與錄音,去河邊找鬼又谋。 笑死拼缝,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的彰亥。 我是一名探鬼主播咧七,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼任斋!你這毒婦竟也來了继阻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仁卷,失蹤者是張志新(化名)和其女友劉穎穴翩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锦积,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡芒帕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了带膀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垛叨。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡喂击,死狀恐怖翰绊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抡谐,我是刑警寧澤童叠,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響撬碟,放射性物質(zhì)發(fā)生泄漏呢蛤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧造烁,春花似錦膨蛮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怎囚。三九已至,卻和暖如春恳守,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伊群。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工咽袜, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留及老,地道東北人骄恶。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像匕垫,于是被迫代替她去往敵國和親僧鲁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容