先寫出將要解釋的哪幾對(duì)概念:
程序、進(jìn)程和線程
并發(fā)和并行
多線程和超線程
單核和多核。(
必須先咒罵一句,以下內(nèi)容其實(shí)是第二遍寫了,在第一次發(fā)表的時(shí)候,沒有發(fā)表成功,結(jié)果全都沒有了,還得重新寫一遍,第一次寫的內(nèi)容其實(shí)很多,第二次是在沒有心思寫太多了,只寫主要的了,TMD....)
程序是死的,只是安裝到你的電腦上的一堆文件而已,你不允許它,它就靜靜躺在那里,什么都不做。進(jìn)程:很專業(yè)的解釋是,操作系統(tǒng)對(duì)一個(gè)運(yùn)行的程序的一種抽象(CSAPP)。果然是很抽象的,抽象的基本不懂。進(jìn)程就是代表程序在電腦里運(yùn)行的,每一個(gè)程序至少有一個(gè)進(jìn)程,進(jìn)程是進(jìn)程是一個(gè)具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)。當(dāng)賦予死的程序以生命時(shí),它就成了一個(gè)活動(dòng)的實(shí)體,稱之為進(jìn)程。每一個(gè)進(jìn)程運(yùn)行后,都會(huì)向cpu索要相應(yīng)的系統(tǒng)資源,都會(huì)有自己一定的地址空間,在這空間里會(huì)存放文本區(qū)域(text region)、數(shù)據(jù)區(qū)域(data region)和
堆棧(stack region)。文本區(qū)域存儲(chǔ)處理器執(zhí)行的代碼;數(shù)據(jù)區(qū)域存儲(chǔ)變量和進(jìn)程執(zhí)行期間使用的動(dòng)態(tài)分配的內(nèi)存;堆棧區(qū)域存儲(chǔ)著活動(dòng)過程調(diào)用的指令和本地變量。線程,線程,有時(shí)被稱為
輕量級(jí)進(jìn)程(Lightweight Process,LWP),是程序執(zhí)行流的最小
單元。每一個(gè)進(jìn)程都至少有一個(gè)主線程,進(jìn)程向系統(tǒng)申請(qǐng)一段地址空間,而線程并不擁有專屬于自己的地址空間,每個(gè)線程都只擁有一點(diǎn)點(diǎn)必不可少的資源,進(jìn)程中所有的線程共享進(jìn)程的資源。線程一個(gè)創(chuàng)建和撤銷另外一個(gè)線程。線程其實(shí)才是真正利用cpu的單位,它是能獨(dú)立運(yùn)行的基本單位,也是獨(dú)立調(diào)度和分派的單位??梢赃@么認(rèn)為,進(jìn)程向cpu申請(qǐng)了地址空間后,然后把真正要做的工作全部交給了線程去做,但是線程使用的資源是由進(jìn)程代表申請(qǐng)的。
拿一個(gè)c程序舉例子來說明下進(jìn)程和線程的關(guān)系,一個(gè)c程序只有一個(gè)主函數(shù),main函數(shù),但是可以擁有其他很多子函數(shù),main函數(shù)是c程序運(yùn)行的切入點(diǎn),通過main函數(shù)可以調(diào)用其他子函數(shù),main函數(shù)和其他子函數(shù)共享全局變量,也可以相互之間很方便的傳遞數(shù)據(jù)。這里,可以把進(jìn)程看成一個(gè)c程序,一個(gè)進(jìn)程也只擁有一個(gè)主線程,主線程就是相當(dāng)于main函數(shù),線程之間共享數(shù)據(jù),也可以相互很方便的傳遞數(shù)據(jù)。
再舉一個(gè)更生動(dòng)的數(shù)據(jù)。說:
一堆肉,是死的,什么都做不了,但是一堆肉組成了一個(gè)人,人是活的有生命的,人又由很多器官組成,當(dāng)人想要做什么事情的時(shí)候,其實(shí)是由大腦這個(gè)器官調(diào)配其余器官來真正做的??梢哉f人在這個(gè)社會(huì)上占有一定的資源,但是真正使用這些資源的是器官,但是我們不能說器官占有這些資源。這里,程序就是一堆肉,進(jìn)程就是一個(gè)人,線程就是器官,其中主線程是大腦。
這些概念都有所了解,但是要想完全說清楚很難了,等我逐一弄懂,并且確定自己的了解是正確的后,我會(huì)貼出來的。
WAITING...