進程

進程:正在運行的程序

1、網絡服務器:當一個請求進入時,服務器檢查是否其需要的網頁在緩存中。如果是,則把網頁發送回去,如果不是,則啓動一個磁盤請求以獲取網頁。然而,從cpu的角度看,磁盤請求需要漫長的時間(因磁盤的速度遠小於內存處理,且是外圍設備),這時一般是先切換到其他進程運行

2、在某一瞬間,一個cpu只能運行一個進程,但在1秒鐘期間,它可能運行多個進程,這樣就產生了並行的錯覺(僞並行),但如果該系統有兩個或多個cpu(多核)共享一個物理內存,則是真正硬件並行,同一瞬間能運行多個進程

3、進程模型

一個進程就是一個正在執行程序的實例,包括程序計數器 、寄存器和變量的當前值

每個進程有自己的邏輯程序計數器,並且每個程序都獨立地運行。實際上只有一個物理程序計數器,所以在每個程序運行時,它的邏輯程序計數器被裝入實際的程序計數器中。當該程序執行結束(或暫停執行)時,物理程序計數器被保存在內存中該進程的邏輯程序計數器中

4、進程和程序的區別

廚師做菜的例子:廚師是處理器(cpu),而做菜的各種原材料就是輸入數據,做菜的食譜就是程序。進程就是廚師閱讀食譜,取來各種原料以及做菜一系列動作總和

5、創建進程:前臺進程、後臺進程(守護進程)

鍵入一個命令或雙擊一個圖標就啓動一個程序,這兩個動作的任一都會開始一個新的進程,並在其中運行所選擇的程序

從技術上看,新進程都是由於一個已存在的進程執行了一個用於創建進程的系統調用而創建的

UNIX系統中

只有一個系統調用可以用來創建新、進程fork。調用fork後,這兩個進程(父和子進程)擁有相同的存儲映像、同樣的環境字符串和同樣的打開文件。然後,子進程執行execve或一個類似的系統調用,以修改其存儲映像並運行一個新的程序

Windows系統中

情形正相反,一個win32函數調用CreateProcess既處理進程創建,也負責把正確的程序裝入新的進程

在UNIX和Windows中,進程創建後,父進程和子進程有各自不同的地址空間。在UNIX中,子進程的初始化地址空間是父進程的一個副本。但是這裏涉及兩個不同的地址空間,可認爲是後來修改了子進程的地址空間,讓它不同於父進程的。但是對於一個新創建的進程而言,確實有可能共享其創建者的其他資源,如打開的文件等。而Windows中,從一開始父進程的地址空間和子進程的地址空間就是不同的了

6、進程的層次結構

在UNIX中,進程和它的所有子女以及後裔共同組成一個進程組,當用戶從鍵盤發出一個信號時,該信號被送給當前與鍵盤相關的進程組中的所有成員(它們通常是在當前窗口創建的所有活動進程)每個進程可以分別獲取該信號、忽略該信號或採取默認的動作,即被該信號殺死。

相反,Windows中沒有進程層次的概念,所有的進程地位相同,唯一類似於進程層次的暗示是在創建進程的時候,父進程得到一個特別的令牌(稱句柄),該句柄可以用來控制子進程。但是,它有權把該句柄傳送給某個其他進程,這樣就不存在進程層次了。在UNIX中,進程就不能剝奪其子女的“繼承權”。

7、進程的狀態(如下圖)


1、進程爲等待輸入而阻塞

2、調度程序選擇另一個進程

3、調度程序選擇這個進程

4、出現有效的輸入



所有關於中斷處理、啓動進程和停止進程的具體細節都隱藏在調度程序中

8、進程的實現——>爲實現進程模型,OS維護着一張表格(一個結構數組),即進程表。每個進程佔用一個進程表項(有些地方稱這些表項爲進程控制塊)。該表項包含了進程狀態的重要信息,包含程序計數器、堆棧指針、內存分配狀況、所打開文件狀態、調度信息,以及其他在進程由運行態轉換到就緒態或阻塞態時必須保存的信息,從而保證該進程隨後能再次啓動,就像從未被中斷過一樣


發佈了127 篇原創文章 · 獲贊 34 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章