操作系统---进程篇
????進程(process)就是操作系統的靈魂,一個軟件的程序通常就是由若干進程組成的。現在計算機一般采用多道程序設計和多處理機設計(所謂的4核、八核其實就是指多個處理機)。
????一、并行和并發
????并行:就是由多個CPU情況下,多道程序可以在同一時刻依靠不同CPU運行,注意是同一時刻,而不是時間間隔,這就是并行性。
????并發:現在我們假設只有一個CPU,那么多道程序要運行,必然在同一時刻只有一個才可以占用CPU,而計算機讓CPU在同一時間段內快速地在多道程序間交換,注意這里是同一時間間隔,這樣就造成了一種偽并行的感覺,這就是并發性。
????二、進程和程序的區別
????進程和程序很容易被混淆。可以舉一個簡單例子,例如一位科學家,買了食譜和一些面粉等原材料準備給他女兒做蛋糕。那么食譜上蛋糕的做法就是程序(即被適當描述的算法),科學家就是CPU,那么科學家按照食譜上的做法,結合面粉這些原料做蛋糕的過程這就是進程了。總的來說,程序是靜態的,就是一堆代碼。進程是動態的,更強調一系列動作的總和。單個處理機經常被多個進程共享,它使用某種調度算法決定進程間的切換。
????三、進程的創建和終止? ?
????進程的創建,通常是由一個已經存在的進程執行了創建進程的系統調用而創建了一個新的進程。這個已經存在的進程可能是一個由鍵盤或鼠標啟動的系統進程、一個已經存在的用戶進程,或一個批處理管理進程。這個進程的工作就是執行一個創建進程的系統調用,這個系統調用就會通知操作系統創建一個新進程,并且直接或間接地指定在該進程中運行的程序。(fork程序就是用來創建一個進程的,通常調用該程序所得到的子進程是父進程的一個副本,但是擁有獨立的地址空間,需要執行一個execve或類似的系統調用,修改存儲映像以用來運行別的程序)。總的來說,記住進程通常由三種方式(系統程序調用系統調用、用戶程序調用系統調用、批處理管理程序調用系統調用)創建
? ? 進程的終止,通常有四個原因:1、正常退出(自愿,exit),2、出錯退出(自愿),3、嚴重錯誤(非自愿),4、被其他進程殺死(非自愿,kill)。
????四、進程調度
要理解進程調度,必須先知道進程一般情況下有三個狀態:
運行態:正在占有處理器正在運行;
阻塞/等待態:等待某個事件的完成;阻塞隊列
就緒態:等待系統分配處理器以便運行。就緒隊列
運行態---->阻塞態/等待態:通常是由于等待外設IO操作,因為IO操作比起CPU高速運算來說慢的多得多,CPU不可能把這些時間都讓這個程序在占有著CPU的情況下在等待,因此將該進程轉換為阻塞態,至于阻塞隊列中。同理等待主存資源也是一個原因。說白了之所以切換到等待態就是為了等待某個相對CPU來說慢的多的事件的完成。
阻塞態--->就緒態:等待的條件已完成,那么進程就從阻塞隊列轉到了就緒隊列,只需等待CPU分配處理器即可。
就緒態---->運行態:系統按某種策略選中一個處于就緒狀態的進程,使其獲得處理機并執行。
運行態--->就緒態:時間片用完或者被搶占,讓出CPU。不是由于自身原因,而是由于外部原因導致。
進程調度算法(就是從就緒隊列中選取哪個進程進入運行態的策略):先進先出算法、短進程優先算法、輪轉法、多級反饋隊列。說白了獲取資源就可以擺脫等待態。
????五、進程(process)和線程(控制流、thread)
????在有些情況下,需要在相同的地址空間中有多個控制流并行得運行,就像他們是單獨的進程一樣(只是他們共享相同的地址空間),通常這些控制流就被稱為線程,或者輕量級進程。
????舉個簡單例子,就是我們訪問一個web頁面時,對于web頁面上的每一幅小圖像,瀏覽器都必須與站點建立一個連接。這種情況下,就可以采用多線程,讓瀏覽器可以同時傳輸多幅圖像。
????線程和進程一樣,也有三種狀態。
????總的來說,線程就是控制流,多線程就比如web頁面讀取多個圖片時的機制。線程是CPU調度的最小單位,進程是資源分配的最小單位(因為一般情況下,多個線程公用一個人由進程所獲取的地址空間。)
????六、同步機制
臨界資源、臨界區(critical section)、互斥量(mutex)、信號量(samaphore)、事件(event)
臨界資源:比如例如打印機、磁帶機這種就屬于臨界資源
1)臨界區(critical section):臨界區就是訪問公共資源的一段代碼。通常如果一個線程執行到了臨界區代碼,那么其他視圖訪問公共資源的線程將被掛起,直到該線程離開這段代碼區。這樣就保證了任意時刻只有一個線程訪問公共資源,就不會造成異步的不定向問題。但這個只能在同一個應用程序的不同線程間實現資源的安全共享。因為只有屬于本程序的才能檢測到臨界區是否在執行。
2)互斥量(mutex):即互斥對象,只有一個,只有擁有互斥對象的線程才有訪問公共資源的權限。因此這樣也保證了資源的安全共享。但是互斥量比臨界區負載,且比臨界區復雜以及功能強大,它可以在不同應用程序的線程之間實現對資源的安全共享。
3)信號量(samaphore):它允許多個線程同時訪問同一資源,但是需要限制在同一時刻訪問此資源的最大線程數目,即。這與操作系統的PV操作相同。
PV操作:
P操作申請資源:S-1;若S-1>=0,則進程執行執行;若S-1<0,則該進程被阻塞后進入該信號相對應的隊列中,然后轉入進程調度;
V操作釋放資源:S+1;若S+1>0,則進程繼續執行。若S+1<=0,則從該信號的等待隊列中喚醒一個等待進程,然后再返回原進程繼續執行或轉入進程調度。
4)事件:通過通知操作的方式來保持線程的同步,還可以方便實現對多個線程的優先級比較的操作。
????七、進程通信
進程通信主要包括管道,IPC(包括消息隊列,信號量,共享存儲),socket
(1)管道:管道分為有名管道和無名管道,無名管道只能用于父子進程之間的通信,而有名管道則可用于無親屬關系的進程之間。
(2)消息隊列:用于運行在同一臺機器上的進程間通信,與管道相似;
(3)共享內存:通常由一個進程創建,其他進程對這塊內存進行讀寫。并不常用
(4)信號量:計數器,它用來記錄對某個資源的存取狀況。
(5)socket:應用于不同計算機的進程通信。
????八、進程通信和同步區分。
進程同步:臨界區、互斥量、信號量、事件
進程通信: 管道、消息隊列(事件)、共享存儲、信號量、socket
相同點:兩者都有信號量和消息隊列(事件)
????九、死鎖(deallocks)
????概念:死鎖就是指兩個后兩個以上的進程(線程)在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,他們將無法推進下去。由于資源占用是互斥的,當某個資源提出資源申請后,使得有關進程在無外力協助下,永遠無法分配不到必需的資源而無法繼續執行,這就產生了一種特殊現象的死鎖。
????產生死鎖的四個必要條件:
互斥條件:一個資源只能被一個進程(線程)使用
請求和保持條件:一個進程(線程)因請求資源而阻塞時,對已獲得的資源保持不放
不剝奪條件:此進程(線程)已獲得的資源,在未使用完之前,不能強行剝奪
循環等待條件:多個進程(線程)之間形成一種頭尾相接的循環等待資源關系。
????死鎖的預防:
因為第一個條件是天然的,因此可以選擇破壞后三個死鎖的條件其中一個實現對死鎖的預防。
破壞請求和保持條件:
一次性請求所需的所有資源,若無法獲取全部就等待,直到滿足為止。
2.破壞不可剝奪條件
規定一個已占用資源的額進程若要申請新的資源,必須先釋放自己已占用的資源;
3.破壞循環等待條件
將系統中所有的資源設置標志位、排序,規定所有的進程申請資源必須以一定的(升序或降序)做操作。(這個就是解決了哲學家就餐問題)
轉載于:https://blog.51cto.com/xlineryi/1696309
總結
以上是生活随笔為你收集整理的操作系统---进程篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跟angular2学一键开启项目--关于
- 下一篇: 最小圆覆盖模板