① 簡述線程,進程和應用程序域的區別和聯系
程序
程序是為解決一個信息處理任務而預先編制的工作執行方案,是由一串CPU能夠執行的基本指令組成的序列,每一條指令規定了計算機應進行什麼操作(如加、減、乘、判斷等)及操作需要的有關數據。
進程
進程指是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,是系統進行資源分配和調度的一個獨立單位。
線程
線程是指線程是進程中的一個實體,是被系統獨立調度和執行的基本單位。
管程
管程是指管程實際上是定義了一個數據結構和在該數據結構上的能為並發進程所執行的一組操作,這組操作能同步進程和改變管程中的數據。
關系
(1)作業是在較早的多道批處理系統中提出的,現代操作系統基本沒有這個概念。一般來說作業是可以包含多個程序或數據集,但至少有一個程序。怎麼理解呢?個人任務程序和作業可以從功能的角度來理解。打個比方,今天班主任要求我們進行班級大掃除,這可以看做一個作業。而這個作業被我們分成擦窗戶,洗地板等等,這些所謂的「子作業」可以看成是一個一個的程序。
(2)一個程序可以有多個進程,一個線程可以包含多個程序。前半句比較好理解,那上面那個例子來說,比如說實現擦窗戶這個程序。有些人(資源)去准備好布(資源)和水(資源),供別人擦洗;有些人(資源)接布進程擦窗戶。這便可以理解為實現這個程序功能的兩個線程。而為什麼又說一個線程可以包含多個程序?仔細看清楚是「包含」。其實便是在這個進程裡面直接調用其他程序,也就是使用程序的功能。
(3)一個進程至少有一個線程. 線程的劃分尺度小於進程,多個線程共享進程內存。多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。 一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以並發執行。還是拿上面的例子來講,實現擦窗戶這個功能的程序創建了兩個進程。需要的資源有:人、布、水。這些資源早在創建的時候就已經申請了。第一條進程「有些人(資源)去准備好布(資源)和水(資源),供別人擦洗「現在可以開辟多個線程來細化這個任務。可以叫其中一個人去打水,其中一個人負責洗布,其中一個人傳遞干凈的布等,這便是一個個線程。而無論開辟多少個線程,使用的資源都是來自進程已申請的,無法脫離進程而獨自存在。另外,線程之間是獨立的,打水的,洗布的,傳遞的,只要自己干好自己的活,沒有必然的相互依賴的關系。而且可以同時進行,這便是多線程的好處所在。
(4)而對於管程呢?通俗的理解就是」管理進程「。死鎖問題的存在導致管程於1971年被Dijkstra提出,說道:把所有進程對某一種臨界資源的同步操作都集中起來,構成一個所謂的秘書進程。凡要訪問該臨界資源的進程,都需先報告秘書,由秘書來實現諸進程對同一臨界資源的互斥使用。
管程由四部分組成:
1).管程內部的共享變數。
2).管程內部的條件變數。
3).管程內部並行執行的進程。
4).對於局部與管程內部的共享數據設置初始值的語句。
回到例子,上面說道兩個進程中,有些人去准備布和水的工作,有些人要擦窗戶。那麼問題來了。准備布工作的人的名單中卻寫著准備水的人,那麼問題來了,這個人到底該干嗎?如果准備布工作要了這個人,這個人一直工作著,而准備水的工作一直等著他去做,那麼就一直等著嗎?更極端的情況下,這個一直在洗布就不去換水,這便是死鎖的一個情形。沒關系,此時班主任來了,看到在場的情形,他決定了此時這個人應該去幹嘛,解決了用人沖突的問題,其作用類似管程。