cpu:工廠
一次只能有乙個車間開工:cpu一次只能執行乙個任務
程序就好比工廠的車間,它代表cpu所能處理的單個任務。任一時刻,cpu總是執行乙個程序,其他程序處於非執行狀態
乙個車間裡,可以有很多任務人。他們協同完成乙個任務。
執行緒就好比車間裡的工人。乙個程序可以包括多個執行緒
車間的空間是工人們共享的,比如許多房間是每個工人都可以進出的。這象徵乙個程序的記憶體空間是共享的,每個執行緒都可以使用這些共享記憶體。
互斥鎖、訊號量
。。。。。
作業系統的設計,因此可以歸結為三點:
(1)以多程序形式,允許多個任務同時執行;
(2)以多執行緒形式,允許單個任務分成不同的部分執行;
(3)提供協調機制,一方面防止程序之間和執行緒之間產生衝突,另一方面允許程序之間和執行緒之間共享資源。
原文:程序作為程式的一次執行(有獨立的記憶體空間)這一特點
執行緒作為cpu排程單位這一特點
執行緒間同步是為了防止競爭(就是說因同時修改,而導致的資料不一致),本質上講,程序的記憶體空間是天然獨立的,執行緒的記憶體空間是天然共享的。正因為如此,程序通訊/執行緒同步才是系統程式設計的很大一塊內容。
程序和執行緒簡單而基本靠譜的定義如下:
1. 程序:程式的一次執行
2. 執行緒:cpu的基本排程單位
這兩個概念雖然過於簡單,但是完全可以為理解os/執行緒/程序打下堅實的基礎,我認為關於程序/執行緒的**,無論採用何種方式,都必須以這兩句話為落腳點,才算靠譜。
cpu的排程單位是執行緒,一次只能執行乙個執行緒(當然多核的有幾核就能同時執行幾個執行緒),而不是一次執行乙個程序!
拋開各種技術細節,從應用程式角度講:
1、在單核計算機裡,有乙個資源是無法被多個程式並行使用的:cpu。
沒有作業系統的情況下,乙個程式一直獨佔著全都cpu。
如果要有兩個任務來共享同乙個cpu,程式設計師就需要仔細地為程式安排好執行計畫--某時刻cpu和由程式a來獨享,下一時刻cpu由程式b來獨享
而這種安排計畫後來成為os的核心元件,被單獨名命為「scheduler」,即「排程器」,它關心的只是怎樣把單個cpu的執行拆分成一段一段的「執行片」,輪流分給不同的程式去使用,而在巨集觀上,因為分配切換的速度極快,就製造出多程式並行在乙個cpu上的假象。
2、在單核計算機裡,有乙個資源可以被多個程式共用,然而會引出麻煩:記憶體。
在乙個只有排程器,沒有記憶體管理元件的作業系統上,程式設計師需要手工為每個程式安排執行的空間 -- 程式a使用實體地址0x00-0xff,程式b使用實體地址0x100-0x1ff,等等。
然而這樣做有個很大的問題:每個程式都要協調商量好怎樣使用同乙個記憶體上的不同空間,軟體系統和硬體系統千差萬別,使這種定製的方案沒有可行性。
為了解決這個麻煩,計算機系統引入了「虛擬位址」的概念,從三方面入手來做:
2.1、硬體上,cpu增加了乙個專門的模組叫mmu,負責轉換虛擬位址和實體地址。
2.2、作業系統上,作業系統增加了另乙個核心元件:memory management,即記憶體管理模組,它管理物理記憶體、虛擬記憶體相關的一系列事務。
2.3、應用程式上,發明了乙個叫做【程序】的模型,(注意)每個程序都用【完全一樣的】虛擬位址空間,然而經由作業系統和硬體mmu協作,對映到不同的實體地址空間上。不同的【程序】,都有各自獨立的物理記憶體空間,不用一些特殊手段,是無法訪問別的程序的物理記憶體的。
3、現在,不同的應用程式,可以不關心底層的物理記憶體分配,也不關心cpu的協調共享了。然而還有乙個問題存在:有一些程式,想要共享cpu,【並且還要共享同樣的物理記憶體】,這時候,乙個叫【執行緒】的模型就出現了,它們被包裹在程序裡面,在排程器的管理下共享cpu,擁有同樣的虛擬位址空間,同時也共享同乙個實體地址空間,然而,它們無法越過包裹自己的程序,去訪問別乙個程序的實體地址空間。
4、程序之間怎樣共享同乙個實體地址空間呢?不同的系統方法各異,符合posix規範的作業系統都提供了乙個介面,叫mmap,可以把乙個實體地址空間對映到不同的程序中,由不同的程序來共享。
5、ps:在有的作業系統裡,程序不是排程單位(即不能被排程器使用),執行緒是最基本的排程單位,排程器只排程執行緒,不排程程序,比如vxworks
我的基本想法是:
(1)程序是乙個容器。
(2)執行緒是容器中的工作單位。
車間—工人的比喻就是這樣來的。
計算器系統對計算資源的分配(cpu)和對記憶體的分配是分開進行的
排程器在排程任務時,只知道執行緒,不知道程序這個東西,對於程序的管理,是os別的元件的事情。
程序和執行緒的通俗理解
程序是計算機領域最重要的概念之一,什麼是程序?程序是關於某次資料集合的一次執行活動,是執行在它自己位址空間的一段自包容程式,解釋的通俗的點,乙個程式在執行時,我們會得到乙個假象,該程序好像是獨佔地使用cpu和記憶體,cpu是沒有間斷地一條接一條的執行該程式的指令,所有的記憶體空間都是供該程序的 和資...
程序與執行緒的通俗理解
程序 process 和執行緒 thread 是作業系統的基本概念,但是它們比較抽象,不容易掌握。1.計算機的核心是cpu,它承擔了所有的計算任務。它就像一座工廠,時刻在執行。2.假定工廠的電力有限,一次只能供給乙個車間使用。也就是說,乙個車間開工的時候,其他車間都必須停工。背後的含義就是,單個cp...
程序與執行緒的通俗理解
qq程式如果沒有執行,那它只是程式,而不是程序,一旦執行了qq程式,那它就成了程序。qq程式一旦執行成了程序,作業系統如windows就要 分配給qq執行的記憶體空間,cpu執行的時間以及其它資源,這樣qq程式就可正常執行了。如果要執行其它程式,如防毒軟體,作業系統也要做同樣的事情。有了程序 之後,...