通過實例理解進程與線程的概念

前言

理解進程和線程的概念,對于網(wǎng)絡(luò)運維或者編寫程序都是十分重要的。無論是windowx平臺或者linux平臺州丹,甚至包括手機,如果你想要運行任何一個程序蒜哀,都和進程罗心、線程脫離不了干系。

概念

我們可以把一個程序理解為一個進程含思,這里我們拿谷歌瀏覽器舉例程序舉例崎弃,當(dāng)你運行谷哥瀏覽器程序后,在你的任務(wù)管理器里面就會出現(xiàn)該程序的進程含潘。


image.png

從上圖可以很清楚的看到系統(tǒng)為谷歌瀏覽器(Google Chrome)創(chuàng)建了1個進程饲做,并且該進程創(chuàng)建了34個線程,這里就出現(xiàn)了一個進程與線程之間關(guān)系的概念遏弱。一個進程可以擁有多個線程盆均,就像你只有2只手,但你有10個手指頭腾窝。

進程是大爺
進程實際上是不做事的缀踪,而是吩咐別人做事,這個“別人”當(dāng)然只有線程這位苦力了虹脯,當(dāng)一個程序(進程)想要做一件事驴娃,比如刷新網(wǎng)頁,他就會開啟一個線程循集,讓這個線程去做這件事唇敞。

多線程
前面提過,一個進程可以有多個線程咒彤。有一點要注意疆柔,一個進程至少要有一個線程。這也很好理解镶柱,沒有線程就沒有人“干活”了旷档。
還是以瀏覽器舉例,假設(shè)我想一邊聽歌一邊寫博客歇拆,那么我必須打開2個網(wǎng)頁鞋屈,一個用來聽歌,一個用來寫作故觅。這時候瀏覽器有2種方案處理厂庇,一種是只開一個線程,先執(zhí)行聽歌的任務(wù)输吏,等歌播放任務(wù)結(jié)束后权旷,再讓線程執(zhí)行寫作任務(wù)。這就是單線程串行執(zhí)行贯溅。
不過如果這種方式執(zhí)行拄氯,我估計寫博客的想砸電腦躲查。另一種就是多線程方案。瀏覽器開啟2個線程坤邪,1個線程負責(zé)播放音樂熙含,另1個線程負責(zé)打開博客供用戶寫作。相當(dāng)于并行處理兩個任務(wù)艇纺,但這里的并行有時候并不是真正的并行怎静,而是將CPU的的時間進行分片,以1秒時間為例黔衡,CPU將這1秒時間進行分片蚓聘,每一片的單位是0.001秒,兩個線程輪番占用CPU的時間盟劫,最終在2個線程優(yōu)先級相同的情況下夜牡,會各占用CPU 0.5秒的時間。但因為這個切換太快了侣签,用戶是根本感覺不到的塘装。但這種機制并不是真正的并行。

線程優(yōu)先級
線程是有優(yōu)先級的影所,優(yōu)先級越高蹦肴,它能獲取的CPU處理時間越多,反之亦然猴娩。我們用程序在測試線程的優(yōu)先級.

#以O(shè)bjective C為程序示例

#創(chuàng)建了2個線程阴幌,一個要執(zhí)行doMusic任務(wù),一個執(zhí)行doBlog任務(wù)
    NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(doMusic) object:nil];
    NSThread *thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(doBlog) object:nil];
    #設(shè)備線程的名稱卷中,方便區(qū)別
    thread1.name = @"播放音樂";
    thread2.name = @"博客寫作";
    #重點矛双,設(shè)置線程的優(yōu)先級,1為最高
    thread1.threadPriority = 1;
    thread2.threadPriority = 0.5;
    #讓線程開始執(zhí)行
    [thread1 start];
    [thread2 start];

#播放音樂執(zhí)行的任務(wù)
- (void) doMusic {
    for (int i=0; i < 10; i++) {
#輸入當(dāng)前線程的名稱和循環(huán)數(shù)i的值
        NSLog(@"%@---%zd",[NSThread currentThread].name,i);
    }
}

#博客寫作執(zhí)行的任務(wù)
- (void) doBlog {
    for (int i=0; i < 10; i++) {
        NSLog(@"%@---%zd",[NSThread currentThread].name,i);
    }
}

以下是程序運行結(jié)果


image.png

我們可以觀察到2件事蟆豫,第一议忽,兩條線程的確是交叉執(zhí)行的,和我們前面說的時間分片一致十减;第二徙瓶,優(yōu)先級較高的“播放音樂”線程很快就執(zhí)行完了10次循環(huán),也就是說在同一個時間段內(nèi)嫉称,“播放音樂”線程得到了更多的CPU時間資源,這就是優(yōu)先級的作用灵疮。

線程的生命周期

此節(jié)织阅,我們來觀察一個線程從生到死的過程,是不是覺得有點殘忍震捣?

新建狀態(tài)
每個線程被創(chuàng)建時都會經(jīng)歷的狀態(tài)荔棉,這個時候的線程是不會被CPU調(diào)度的闹炉;

可運行狀態(tài)
當(dāng)線程被允許執(zhí)行(由程序操控)時,就會進入可運行狀態(tài)(runnable)润樱,此時該線程會被放入CPU資源調(diào)度池(Pool)中渣触,由CPU根據(jù)線程的優(yōu)行級決定何時執(zhí)行。

運行狀態(tài)
線程被CPU調(diào)度時壹若,就處于運行狀態(tài)嗅钻,此時線程開始占用CPU處理時間。

阻塞狀態(tài)
線程因CPU調(diào)度或者程序內(nèi)部控制等原因(比如等待用戶輸入)將運行狀態(tài)改變?yōu)樽枞麪顟B(tài)(block),此狀態(tài)下店展,線程不再占用CPU時間养篓,但線程并沒有被釋放,而是等待某種條件達成后可再次轉(zhuǎn)換為可運行狀態(tài)赂蕴,注意陰塞狀態(tài)是不能直接轉(zhuǎn)換為運行狀態(tài)的柳弄。

釋放狀態(tài)
就是線程的所有工作都執(zhí)行完畢,就像上面舉例中的10次循環(huán)結(jié)束概说,此時線程迎來了它的終點碧注,這也是每一個線程的終點,在他們干完自己的工作后糖赔,就會被釋放掉(dead)萍丐,這是為了回收該線程所占用的系統(tǒng)資源。

多線程安全問題

如果兩個線程訪問同一個資源的時候挂捻,可能會出現(xiàn)“安全”問題碉纺。

image.png

我們還是看圖說話,圖有有2個線程刻撒,A線程和B線程骨田,他們是并發(fā)執(zhí)行的關(guān)系,有一個整型變量声怔,它的初始值是17态贤。首先A線程進行了讀取變量的操作,讀取的值是17,B線程在之后也讀取了該變量醋火,讀取值為17.A線程將該值+1,然后寫回給變量悠汽,此時變量的值變?yōu)?8.那么問題來了,此時B線程在之前也是讀取的17,B線程也給變量加+1,然后再寫回芥驳,這樣本來變量被加了2次柿冲,正確值應(yīng)該是19,但最后結(jié)果是18.
你可能覺得這并不嚴重?
把17想像成你的銀行存款兆旬,假設(shè)你有17萬元存款假抄,你的家人A往你帳戶存了1萬,同一時間你的家人B在另一個地方往你帳戶也了一萬,如果他們是按這種先后時間進行的宿饱,恭喜你熏瞄,你的銀行存款就只有18萬,而不是19萬谬以,知道問題的嚴重性了吧强饮?

解決方法

image.png

解決的方法就是“加鎖”,當(dāng)A線程準(zhǔn)備讀取數(shù)據(jù)時为黎,就對要讀取的變量加鎖邮丰,讓其它線程暫無法訪問。待A進程操作完畢寫入數(shù)據(jù)后再對該變量進行解鎖操作碍舍,接著B線程再對數(shù)據(jù)進行讀寫操作柠座。這樣數(shù)據(jù)我們就認為“安全”了。但代價是B線程有2段時間處于“閑置”狀態(tài)片橡。

最后

理解了進程和線程的概念妈经,我們才能夠在日常的運維工作中深入的追究問題;也只有掌握了他們的概念捧书,我們在編寫代碼時吹泡,寫出效率與性能兼顧的好程序。你已經(jīng)掌握他們的概念了嗎经瓷?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爆哑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子舆吮,更是在濱河造成了極大的恐慌揭朝,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件色冀,死亡現(xiàn)場離奇詭異潭袱,居然都是意外死亡,警方通過查閱死者的電腦和手機锋恬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門屯换,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人与学,你說我怎么就攤上這事彤悔。” “怎么了索守?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵晕窑,是天一觀的道長。 經(jīng)常有香客問我卵佛,道長幕屹,這世上最難降的妖魔是什么蓝丙? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮望拖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挫鸽。我一直安慰自己说敏,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布丢郊。 她就那樣靜靜地躺著盔沫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪枫匾。 梳的紋絲不亂的頭發(fā)上架诞,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音干茉,去河邊找鬼谴忧。 笑死,一個胖子當(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
  • 我被黑心中介騙來泰國打工粱快, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秩彤,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓皆尔,卻偏偏與公主長得像呐舔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子慷蠕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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

  • 文/tangsl(簡書作者) 原文鏈接:http://www.reibang.com/p/2b993a4b913e...
    西葫蘆炒胖子閱讀 3,771評論 0 5
  • 又來到了一個老生常談的問題珊拼,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢? 今天就這個問題開始流炕,來談?wù)劜?..
    tangsl閱讀 4,126評論 0 23
  • 1. 簡介 用戶打開瀏覽器每辟,其實就是打開了瀏覽器應(yīng)用程序剑辫。那么什么是程序呢?我們常說瀏覽器是多線程的渠欺,JS 是單線...
    love丁酥酥閱讀 3,519評論 0 6
  • 真正失敗的人妹蔽,就是那種害怕不能成功 怕死了,連試都不敢試的人挠将。
    時間很寶貴閱讀 204評論 0 0
  • 文/執(zhí)筆寫溫情 床頭柜旁的手機鈴聲大作胳岂。迷迷糊糊中,伸手拿過手機舔稀,放在耳旁乳丰。"趕緊叫你媽起來,趕緊叫你媽起來内贮,奶奶...
    執(zhí)筆溫情閱讀 364評論 0 0