操作系統(tǒng)有兩個基本功能:防止硬件被失控的應用程序濫用;為應用程序低級設備方面提供簡單的抽象氨菇。比如進程是對處理器牍陌、主存和I/O設備的抽象表示撬呢,文件是對I/O設備的抽象表示吝梅,虛擬存儲器是對主存和磁盤I/O設備的抽象表示虱疏。
一、進程
進程是操作系統(tǒng)對運行程序的一種抽象苏携,在一個系統(tǒng)上可以同時運行多個進程做瞪,每個進程都好像獨占使用硬件。我們稱為并發(fā)運行,實際上是一個進程指令和另一個進程指令是交替執(zhí)行的装蓬。操作系統(tǒng)實現(xiàn)這種交替執(zhí)行的機制稱為上下文切換著拭。
操作系統(tǒng)保存進程運行所需的所有狀態(tài)信息。這種狀態(tài)牍帚,也就是上下文儡遮,包括許多信息,比如PC和寄存器文件的當前值暗赶,以及主存的內容鄙币。在任何時刻,系統(tǒng)上都只有一個進程正在運行蹂随。當操作系統(tǒng)決定從當前進程轉移控制權到某個新進程十嘿,它就會進行上下文切換,即保存當前進程的上下文糙及,恢復新進程的上下文详幽,然后將控制權轉移到新進程。
實現(xiàn)進程這個抽象概念需要低級硬件和操作系統(tǒng)軟件的緊密合作浸锨。
二唇聘、線程
盡管通常我們認為一個進程只有一個的控制流,但在現(xiàn)代系統(tǒng)中柱搜,一個進程實際可以由多個稱為線程的執(zhí)行單元組成迟郎,每個線程都運行在進程上下文中,并共享同樣的代碼和全局數(shù)據(jù)聪蘸。
由于網(wǎng)絡服務器對并行處理要求宪肖,線程稱為越來越重要的編程模型,因為多線程之間比多進程之間更容易共享數(shù)據(jù)健爬,也因為線程一般都比進程更高效控乾。
三、虛擬存儲器
虛擬儲存器是一個抽象概念娜遵,為每個進程提供了一個假象蜕衡,每個進程都獨占使用主存。每個進程都看到的存儲器都是一致的设拟,稱為虛擬地址空間慨仿。在Linux中,最上面的四分之一的地址空間是預留給操作系統(tǒng)中的代碼和數(shù)據(jù)的纳胧,這對所有進程都一樣镰吆。底部的四分之三的地址空間是用來存放用戶進程定義的代碼和數(shù)據(jù)。
- 程序代碼和數(shù)據(jù)跑慕。代碼是從同一固定地址開始万皿,緊接著是和C全局變量相對應的數(shù)據(jù)區(qū)。代碼和數(shù)據(jù)區(qū)是由可執(zhí)行目標文件直接初始化的
- 堆。代碼和數(shù)據(jù)區(qū)緊接著是運行時堆相寇。代碼和數(shù)據(jù)區(qū)是在進程一旦開始時就被指定了大小慰于。如果調用malloc和free這樣的C標準庫函數(shù),堆可在運行時動態(tài)地擴展和收縮唤衫。
- 共享庫婆赠。在地址空間的中間附近是一塊用來存放像C標準庫和數(shù)學庫這樣的共享庫的代碼和數(shù)據(jù)區(qū)域
- 棧。位于用戶虛擬地址空間頂部的是用戶棧佳励,編譯器用它來實現(xiàn)函數(shù)調用休里。和堆一樣,用戶棧在程序執(zhí)行期間可以動態(tài)地擴展和收縮赃承。每次調用一個函數(shù)妙黍,棧會增長,瞧剖。每次從函數(shù)返回拭嫁,棧會收縮。
- 內核虛擬存儲器抓于。內核是操作系統(tǒng)總是在駐留在存儲器中的部分做粤,地址空間1/4部位是為內核預留。應用程序不允許讀寫這個區(qū)域的內容或直接調用內核代碼定義的函數(shù)