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