1. 程式人生 > 其它 >java中介軟體、資料庫與spring框架,騰訊T3大佬親自教你

java中介軟體、資料庫與spring框架,騰訊T3大佬親自教你

1 程序

程序與程式

作業系統之中最為通用的概念就是「程序」。與此相關的面試題以及各種技術優化策略也層出不窮,足以夠證明它對於理解作業系統中舉足輕重的地位。事實上,通過「程序」,程式設計師可以更為直觀的理解自己所開發的軟體,並且能夠從中深刻的認識到作業系統在軟體執行做了些什麼。

簡單來講,程序就是正在執行的程式。每個程序都包含有屬於自己的一段地址空間,可以看作是一部分記憶體空間。在這樣的地址空間中,程序能夠根據需要進行記憶體的讀寫。

地址空間裡面一般包含可執行程式,以及對應程式的資料及其堆疊。與每個程序相關的還有一組資源,通常包括暫存器(包括程式計數器和堆疊指標)以及執行程式所需的所有其他資訊。從這可以看出,程式本身只是指令、資料以及其組織形式的一種描述方式,而程式的實際的執行例項就是一個程序。

不過程序與程式也並不完全等同,他們不是簡單的一一對應的關係,而是在不同層面的表現形式。他們的主要區別在於:

  • 程式是程序的靜態文字,而程序是執行程式的動態過程;
  • 程序與程式不是一一對應,同一程式可在不同程序中執行,一個程序也可以執行多個程式;
  • 程式是一種長期可儲存的文字,程序是暫時的一次執行過程;
  • 程序是作業系統分配排程的獨立單位,而程式是作業系統層級之上的應用程式。

程序狀態

從上面我們知道,程序可看作是程式執行的動態過程。那麼為了更好的對程序進行描述,我們給執行中的程序定義了三種基本狀態,包括就緒、執行和阻塞。

這就是所謂的三態模型,描述了程序在整個執行週期中狀態變化。每個狀態的轉移過程可以通過下圖來表示。

就緒狀態?是指程序已經被分配到了所有必需的資源,除了CPU。在這個狀態下,程序處於箭在弦上隨時待發的狀態,只要一獲得CPU的執行許可權,程序便會立刻執行,從而進入執行狀態。

當有多個處於就緒狀態的程序時,不同的程序會根據優先順序被劃分入不同的佇列。一個因為時間片用完而進入就緒狀態的程序會被劃分入低優先順序佇列,而因為I/O操作完成而進入就緒狀態的程序,則會被劃分入高優先順序佇列。

執行狀態?是指程序正常執行的狀態。而當處於執行狀態的程序由於需要等待某個事件傳送(通常為等待I/O)時,就會放棄CPU,從而進入暫時的阻塞狀態。CPU這時一旦空出,通過不同的排程演算法,CPU又會被分配給另一個就緒程序。

阻塞狀態?相當於就緒狀態和執行狀態的一個緩衝狀態。當處於執行狀態的程序無法正常執行時,會先進入阻塞狀態,等待需要的請求執行完成,再回到就緒狀態,等待下一次的CPU分配和執行。

三態模式是用來描述程序狀態轉移最為精簡的模型,實際上光這三種狀態是無法處理複雜的程序執行過程的。所以為了對程序進行更好的管理和排程,在三態模型的基礎上引入了兩種程序狀態,即建立狀態終止狀態,這就有了五態模型。

建立狀態?是指程序剛剛建立的狀態,在這個狀態下,需要等待作業系統完成建立和分配程序的各種所需資訊,包括建立PCB(Process Control Block)、載入程式並建立地址空間等。在完成這些準備工作後,該程序的狀態就會轉移為就緒狀態並劃分入就緒佇列中。

PCB:程序控制塊,用於存放程序的管理和控制資訊的資料結構

建立狀態看起來好像沒什麼太多用處,畢竟程序就緒的時候肯定完成了建立。但是之所以還是要引入,還是為了確保程序控制塊的完整。只有在建立狀態完成了程序完整的準備工作(PCB生成建立及資源分配),才能進入就緒狀態。

這樣就保證了處於就緒狀態程序的正確性,同時也提升了作業系統對程序的管理的靈活性。作業系統可以從一開始就對程序的建立和資源分配進行管理,更大程度上節省了系統資源的調控。

終止狀態?代表著程序的結束,當程序執行完成後,需要作業系統在終止狀態對程序的執行結果進行善後處理。這樣的善後處理包括對程序所使用的資源進行回收,並將其它程序所需要的資訊傳遞出去。最後,作業系統還需要對終止的程序進行記憶體釋放,將其PCB中的內容清空,並將這部分記憶體返還給系統。

終止狀態意味著程序的執行週期的結束,但卻並不表示程序是正常結束的。當一個程序出現了無法預知的錯誤或者被作業系統或其它程序所終止時,它都會進入終止狀態,進行各種資源的回收。

事實上即使是程序的五態模型也不足以用來描述程序複雜的執行過程。由於系統內部資源的限制,並不是為所有程序執行的要求都能夠滿足,因此在這個基礎上,又引入了程序的掛起就緒狀態以及對應的掛起阻塞狀態。

在七態模型中,活躍就緒是指程序在主存並且可被排程的狀態。而靜止就緒狀態是指就緒程序被對換到輔存時的狀態,它是不能被直接排程的狀態,只有當主存中沒有活躍就緒態程序,或者是掛起態程序具有更高的優先順序時,系統才會把掛起就緒態程序調回主存並轉換為活躍就緒狀態。

活躍阻塞狀態是指程序在主存,一旦等待的事件產生便會進入活躍就緒狀態。靜止阻塞是指阻塞程序對換到輔存時的狀態,一旦等待的事件產生便進入靜止就緒狀態。

程序相關的知識點實在是太多了,包括PCB、程序間通訊以及和執行緒相關的概念和基礎都是非常重要的知識。但是由於這篇文章的篇幅限制,不好在這裡過多展開。

只是點到為止的介紹執行緒的狀態模型,具體程序和執行緒的內容將會在之後幾篇文章中詳細展開介紹。

之所以花大力氣來介紹執行緒模型,只因為這是執行緒跟作業系統關係最為直觀的聯絡所在。

不斷優化執行緒模型的目的就是為了使得作業系統能夠更好的去管理程式軟體和資源分配的問題。

通過對執行緒的管理來達到資源合理調配的目的。這本身也就是作業系統作用的重要體現之一,可謂是作業系統的第一大靈魂概念。

2 地址空間

地址空間的概念在程序的介紹中略有提及,實際上也與程序有不可分割的關係。一般上的理解上,每個程序擁有其對應的地址空間,儲存著該程序用於程式執行時所需的資訊和資料。

我們知道,每臺計算機都有一些主記憶體,用於儲存正在執行的程式。在一個非常簡單的作業系統中,一次只有一個程式在記憶體中執行。要執行第二個程式,必須刪除第一個程式,然後將第二個程式放在記憶體中。

更復雜的作業系統就能夠解決這樣的問題,它們可以允許多個程式同時儲存在記憶體中。同時為了防止它們相互干擾(以及與作業系統之間的串擾),會採取某種一般存在於硬體中的保護機制。

通常,每個程序都有其可以使用的一組地址,通常從0到某個地址最大值。在最簡單的情況下,程序具有的最大地址空間量小於主儲存器的總容量。這樣,程序可以填滿它的地址空間,並且在主記憶體中也有足夠的空間容納這些資訊。

但是,如果某個程序的地址空間大於計算機的主記憶體,並且該程序想全部使用它,該怎麼辦?

在最初的計算機中,這樣的要求是十分過分的。而如今,好在有一種稱為虛擬記憶體的技術,作業系統能夠將地址空間抽象化為程序可以引用的地址集,從而使得地址空間與計算機的實體記憶體分離。這樣一來,程序的地址空間就有可能大於計算機的實體記憶體。

地址空間和實體記憶體的管理是作業系統功能的重要組成部分,同樣也是深入理解作業系統進/執行緒管理的基礎。

3 檔案

幾乎所有作業系統都支援的另一個關鍵概念就是檔案系統。作業系統的主要功能是隱藏磁碟和其他I/O裝置的特性,併為程式設計師提供一個與裝置或硬體無關的檔案的簡潔漂亮的抽象模型。

顯然需要通過作業系統的呼叫來建立檔案,刪除檔案,讀取檔案和寫入檔案。在讀取檔案之前,必須先將其放在磁碟上並開啟,在讀取檔案後應將其關閉,以便能夠提供呼叫來執行這些操作。

層次結構

為了提供存放以及找到檔案的位置,大多數PC作業系統都具有目錄的概念,該目錄是將檔案分組在一起的一種方式。目錄是以資料夾的形式進行展現,可以在資料夾中巢狀多個目錄。

整個檔案系統的模型是一個層次結構,就像是一顆多叉樹。從最頂層的資料夾依次以樹幹、樹枝的形式進行查詢,就可以搜尋到最底部的檔案目錄。

目錄層次結構中的每個檔案都可以通過在目錄層次結構的頂部(根目錄)給出其路徑名來指定。這樣的絕對路徑名包含必須從根目錄遍歷才能到達檔案的目錄列表,並用斜槓分隔各個元件。

D:/study/學習資源/個人/私は學ぶのが大好きです.mp4

每個程序都會有一個當前的工作目錄,在該目錄中查詢不以斜槓開頭的路徑名。這就是所謂的相對路徑。此外,程序可以通過發出指定新工作目錄的系統呼叫來更改其工作目錄。

需要注意的一點是,在讀寫檔案之前,必須先開啟該檔案,然後再檢查許可權。如果允許訪問,系統將返回一個稱為檔案描述符的小整數,以用於後續操作。如果禁止訪問,則返回錯誤程式碼。

掛載

在作業系統的檔案系統中,另一個重要概念就是掛載。大多數臺式計算機都有一個或多個光碟驅動器,可以在其中插入CD-ROMDVD和光碟。(下面以Unix系統為例進行介紹)

這些計算機以外的光碟驅動器實際上都可看作是一個檔案系統,並且與計算機本身硬碟上的根檔案系統是相互獨立,彼此無關的。為了提供一種優雅的方式來處理這些可移動介質,作業系統允許將光碟上的檔案系統附加到根檔案系統的主樹上,這就是掛載。

但是,由於無法在CD-ROM上指定路徑名,因此無法使用該檔案系統。UNIX不允許使用驅動器名稱或數字作為路徑名的字首。這是作業系統應該消除的對於裝置的依賴性。取而代之的是,系統呼叫允許CD-ROM上的檔案系統附加到根檔案系統。

在下圖中,CD-ROM上的檔案系統已安裝在目錄b中,因此可以訪問檔案/b/x/b/y。如果目錄b包含其它檔案,則在安裝CD-ROM時將無法訪問它們,因為/b將引用CD-ROM的根目錄。不過一般而言,檔案系統幾乎總是掛在空目錄上。如果系統包含多個硬碟,它們也都可以掛載到單個樹中。

專用檔案

檔案系統中的另一個重要概念是專用檔案。提供專用檔案的作用是為了使I/O裝置看起來像檔案。這樣,可以使用與讀寫檔案相同的系統呼叫來讀寫它們。

存在兩種專用檔案:塊特殊檔案和字元特殊檔案。塊特殊檔案用於對裝置進行建模,這些裝置由一組可隨機定址的塊(例如磁碟)組成。通過開啟一個塊專用檔案並讀取進行,這樣一來程式就可以直接訪問裝置上相應的塊,而無需考慮其上包含的檔案系統的結構。

同樣,字元專用檔案可用於對印表機,調變解調器和其他接受或輸出字元流的裝置進行建模。按照慣例,特殊檔案儲存在/dev目錄中。例如,dev/lp可能是印表機(曾經稱為行式印表機)。

除此之外,還有一個特殊的檔案,就是管道。沒錯,就是用來程序間通訊的那個。事實上,管道是一種偽檔案,可用於連線兩個程序。如果程序AB希望使用管道進行通話,則必須提前進行設定。

當程序A想要將資料傳送到程序B時,它將寫在管道上,就好像它是輸出檔案一樣。實際上,管道的實現與檔案的實現非常相似。程序B可以通過從管道讀取資料來讀取資料,就像它是輸入檔案一樣。

因此,程序之間的通訊非常類似於普通檔案的讀寫。更強大的是,當程序發現正在寫入的輸出檔案不是真正的檔案,而是管道時,就會進行特殊的系統呼叫。當然具體的實現這裡就不展開了,之後在講程序間通訊時再詳細介紹。持續關注,收穫更多哦~

4 輸入/輸出

所有計算機都具有用於獲取輸入和產生輸出的物理裝置,這就是所謂的I/O。畢竟,如果使用者在完成要求的工作後不知道該怎麼辦並且無法獲得結果,那麼計算機將有什麼用?

現代計算機中存在多種輸入和輸出裝置,包括鍵盤,滑鼠,顯示器,印表機等。這些裝置都是由作業系統進行管理和資源的分配。

因此,每個作業系統都有一個I/O子系統來管理其I/O裝置。某些I/O軟體與裝置無關,也就是說,它們同樣適用於許多或所有I/O裝置。其它的I/O軟體(例如裝置驅動程式)則會用於特定的I/O裝置。

依據I/O裝置工作方式的不同,通常進行如下分類:

(1)字元裝置character device,又叫做人機互動裝置。使用者通過這些裝置實現與計算機系統的通訊。它們大多是以字元為單位傳送和接受資料的,資料通訊的速度比較慢。

例如,鍵盤和顯示器為一體的字元終端、印表機、掃描器、包括滑鼠等,還有早期的卡片和紙帶輸入和輸出機。含有顯示卡的圖形顯示器的速度相對較快,可以用來進行影象處理中的複雜圖形的顯示。

(2)塊裝置block device,又叫外部儲存器,使用者通過這些裝置實現程式和資料的長期儲存。與字元裝置相比,它們是以塊為單位進行傳輸的,如磁碟、磁帶和光碟等。塊的常見尺寸為512~32768B之間。

(3)網路通訊裝置。這類裝置主要有網絡卡、調變解調器等,主要用於與遠端裝置的通訊。這類裝置的傳輸速度比字元裝置高,但比外部儲存器低。

5 保護

我們知道作業系統可以對程序和資源進行管理和控制,而在這個管理過程中,程序執行的正確性必須要得以保證。因此,作業系統內部需要提供一種保護機制來確保程序執行和獲取資源的正確性。

從概念上來說,作業系統的保護是指一種控制程式、程序或使用者對計算機系統資源進行訪問的機制。作業系統中的程序必須加以保護,使其免受其他程序活動的干擾。各種機制是為了確保只有從作業系統中獲得了恰當授權的程序才可以操作相應的檔案、記憶體段、CPU和其他的資源。

通俗點說,計算機包含大量使用者經常希望保護和保密的資訊。這些資訊可能包括電子郵件,商業計劃書,納稅申報單等等。作業系統需要採取一些機制來管理系統的安全性。例如,某些重要檔案只能由授權使用者訪問。

通過為每個檔案分配一個9位的二進位制保護程式碼來保護系統中的檔案。保護程式碼由三個3位欄位組成,一個用於所有者,一個用於所有者組的其他成員,另一個用於其他所有者。

每個欄位都有3位,一位表示讀許可權,一位表示寫許可權,一位表示執行許可權,這3個位稱為rwx位。例如,保護程式碼rwxr-x--x表示所有者可以讀取,寫入和執行檔案,其他組成員可以讀取或執行(但不能寫入)檔案,其他所有者都可以執行(但不能讀取或寫入)檔案。

除了檔案保護之外,作業系統還存在許多其他安全方面的保護機制。這些機制貫穿在作業系統的各個方面,從而能夠保證其在資源分配以及程式執行中的可靠性。

6 虛擬記憶體

虛擬記憶體想必都不會陌生,它主要是解決實體記憶體所帶來的一系列侷限問題。虛擬記憶體能夠通過在RAM和磁碟之間快速來回移動程式來執行比計算機實體記憶體更大的程式。

因為虛擬記憶體的存在,使得應用程式以為它擁有了連續可用的記憶體,即一個連續完整的地址空間。而實際上,它在實體記憶體中可能並不連續,通常是被分隔成多個實體記憶體碎片,甚至還有部分暫時儲存在外部磁碟儲存器上,在需要時才進行資料交換。

總的來說,虛擬記憶體將主存看成是一個儲存在磁碟空間上的地址空間的快取記憶體,主存中只儲存活動的區塊,並根據需要在磁碟和主存之間來回傳送資料。同時,它為程序提供了一致的地址空間,從而簡化了記憶體管理。

除此之外,作業系統為每個程序提供了一個獨立的虛擬地址空間,從而保護了每個程序的地址空間不被其他程序破壞。

由此可見,虛擬記憶體的提出解決了記憶體空間利用率問題、讀寫記憶體的安全性問題、程序間的通訊安全問題以及記憶體讀寫的效率問題。現在大多數作業系統都使用了虛擬記憶體,已經成為作業系統中最為基礎的概念之一。

讀者福利

更多筆記分享

本文已被CODING開源專案:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視訊+實戰專案原始碼】收錄