參考:
《從哲學層次上看作業系統》
《深入了解計算機系統》
《作業系統精髓與設計原理》
https://blog.csdn.net/qq_38410730/article/details/81415419 程序與檔案
簡述
計算機發展早期,為了提高 CPU 的使用率,人們想起将多個程式同時加載到計算機裡,并發執行。這些同時存在于計算機記憶體的程式就成為程序,其就是為了提高 CPU 使用率而出現的概念。
程序(process)其經典定義是 一個執行中程式的執行個體。 當我們在系統上運作一個程式時,我們會感到仿佛我們的程序是獨占處理器和記憶體,這種假象就是作業系統通過程序的概念提供的。
我們可以說,一個程序是由程式代碼、相關資料、程序控制塊組成的。
我們重點關注程序提供給應用程式的兩個關鍵抽象的實作:
- 一個私有的位址空間,它使我們覺得仿佛我們的程式使獨占記憶體。程序的空間
- 一個獨立的邏輯控制流,它使我們覺得仿佛我們的程式使獨占 CPU。程序的時間
位址空間
在一個 n 位位址地機器上,位址空間是 2^n 個位址的集合。一般而言,一個程序所占用的實體記憶體是不能被其它程序通路的。從這一點講位址空間是私有的。
盡管每個私有位址空間的内容是不同的,但它們一般都具有相同的結構。下圖是一個32位 Linux程序的位址空間的組織結構。

程序的管理
作業系統為了管理程序和資源,必須掌握每個程序和資源的目前狀态,普遍采用的方法是,作業系統構造并維護其管理的每個實體的資訊表。基本上有以下幾種:記憶體表,I/O表,檔案表,程序表,這些也是作業系統重要職責,我們此時主要關心程序表。
這裡我們需要注意的是:這些表是互相引用的。一個程序要和記憶體 I/O 檔案打交道的話,就需要對這些資源直接或間接的引用。
由上面我們可知,一個實際的模型中有以下幾部分
其中程序控制塊中的資訊主要分為三類:程序辨別資訊,處理器狀态資訊,程序控制資訊。
程序的上下文
程序是在作業系統支援下執行的,程序執行時需要作業系統為其設定相應的執行環境,如系統堆棧、位址映像寄存器、程式計數器、程式狀态字、打開檔案表以及相關通用寄存器等。 是以,把程序的實體實體與支援程序執行的實體環境合稱為程序上下文。
程序的位置
一個程序的位置取決于作業系統所采用的記憶體管理方案,在最簡單的情形下,整個程序在連續的實體記憶體上。不過主流情況下,我們采用虛拟記憶體并采用頁映射的方式将程序裝載到記憶體上,在這種情況下,程序被分為一頁一頁,部分頁在記憶體上,部分頁在磁盤上,并且在記憶體上的頁之間不一定連續,并且任何沒有順序關系。
這裡的順序關系 舉個例子,如果把實體記憶體比作多層抽屜,把杯子比作程序的話,杯子被分為杯蓋和杯身,把杯子放到抽屜上,不一定杯蓋就在杯身所在抽屜的上面的抽屜。
作業系統的執行
如果作業系統僅是像其他程式那樣由處理器執行的一組程式,那麼作業系統是一個程序嗎?如果是,如何控制它?這些有趣的問題使得人們提出了大量的設計方法。簡單的說有下面三種方式:
其中我們常用的是第二種,這種方法也是較小計算機(PC、工作站)的作業系統通常采用的方法。
在這種方法下,作業系統代碼和資料位于共享位址空間中,并被所有使用者程序共享。在使用者程序的上下文中執行所有作業系統功能。根據使用者模式和核心模式的概念,即使作業系統例程在使用者程序環境内執行,使用者也不能篡改或幹涉作業系統例程。
當發生中斷、陷阱或系統調用時,處理器置于核心模式,儲存模式上下文并切換模式(模式切換),再切換到一個作業系統例程,但此時仍然是在目前的使用者程序内繼續執行,不需要切換程序,隻是在同一程序中切換模式。當作業系統完成操作後,需要繼續運作目前的程序,則會切換模式在目前程序内恢複已中斷的程式。
當程序在核心模式下運作時,有單獨的核心棧用于管理調用/傳回。
有時,會儲存一個程序的狀态資訊,從就緒态程序中選擇另一個程序,并把控制權交給這個新程序。涉及到程序狀态變化,是以需要上下文切換。
程序與檔案
- fs 存儲程序對應的程式的檔案在檔案系統的位置。
- files 指向程序打開的檔案表。
- 當fork 之後 兩個程序的 files 會指向同一個files_struct 。
邏輯控制流
在一個程序的執行過程中,我們可以通過單步調試,看到程式計數器( Program Counter)的值,這些值唯一地對應于可執行目标檔案或運作時動态連接配接到程式的共享對象中的指令。這個 PC 的值的序列就稱為邏輯控制流,又簡稱(邏輯流)。
并發并行流![]()
快樂Linux —— 9. 程式模型剖析
- 當多個邏輯流邏輯上執行時間重疊,其中每個流稱為并發流(concurrent flow),這些流并發地運作。例如上圖的 A 和 B ,A 和 C 在某段時間并發地運作,而 B 和 C 沒有。
- 當多個邏輯流實體上執行時間重疊,稱每個流為并行流(parallel flow),當兩個流并發地運作在不同 CPU 上那麼它們稱為并行流。并行是并發地真子集,條件比并發更嚴格。例如上圖 隻有 A 與 C在一段時間内并行地運作。
程序的狀态
一個程序有多種狀态,不同的系統的實作不同,一個經典的模型是三種狀态:執行态,就緒态,阻塞态。
這裡闡述的程序三狀态并不是唯一的分類方式。事實上,許多商業作業系統的程序狀态不止三個,例如,Windows的程序有7個,Solaris裡面的程序則有6個。但不管3個6個7個還是幾個,其目的都是便于作業系統對程序的管理。隻要細分對管理有利,我們就細分。否則就維持三狀态。
程序的切換
程序切換(上下文切換):
- 儲存處理器的上下文,包括程式計數器和其他寄存器。
- 更新目前處于運作态程序的程序控制塊,包括改變程序的狀态。還須更新其他相關的字段,包括退出運作态的原因和記賬資訊。
- 把該程序的程序控制塊移到相應的隊列(就緒、阻塞、就緒/挂起)。
- 選擇另一個程序執行。
- 更新所選程序的程序控制塊,包括把程序的狀态改為運作态。
- 更新記憶體管理資料結構。是否需要更新取決于管理位址轉換的方式。
- 載入程式計數器和其他寄存器先前的值,将處理器的上下文恢複為所選程序上次退出運作态時的上下文。
模式切換:處理器狀态(模式)從使用者态到核心态或者從核心态到使用者态的轉換。一般有以下步驟:這個過程需要儲存的上下文主要是PCB 中的處理器狀态資訊。模式切換不同于程序切換,它不一定會引起程序狀态的轉換,在大多數情況下,也不一定引起程序切換。可以看出涉及狀态變化的程序切換與模式切換相比要做的工作更多。
- 将程式計數器置為中斷處理程式的開始位址。
- 從使用者模式切換到核心模式,以便中斷處理代碼包含特權指令。
程序相關的其它資訊
建立一個程序
當建立一個新程序時,作業系統會執行以下操作:
-
為新程序配置設定一個唯一的程序辨別符
主程序表會添加一個新表項。
-
為程序配置設定空間
包括程序模型中的所有元素。若任何已有的位址空間将被這個新程序共享,則要建立正确的連結。
-
初始化程序控制塊
初始化程序辨別資訊,處理器狀态資訊,程序控制資訊。程序最初不擁有任何資源(IO裝置、檔案),除非顯式地請求了這些資源或繼承了父程序的資源。
-
加入排程隊列
例如,若作業系統将每個排程隊列都維護為一個連結清單,則新程序必須放在就緒或就緒/挂起連結清單中。
-
建立或擴充其他資料結構。
例如,作業系統可因編制賬單或評估性能,為每個程序維護個記賬檔案。
後續學習過程中如果有新的疑問再進行補充。。。