一 操作系統基礎
1、什么是操作系統
操作系統(Operating System,簡稱 OS)是配置在計算機硬件上的第一層軟件,是對硬件系統的首次擴充。其主要作用是管理好這些設備,提高它們的利用率和系統的吞吐量,并為用戶和應用程序提供一個簡單的接口,便于用戶使用。OS是現代計算機系統中最基本和最重要的系統軟件,而其它的諸如編譯程序、數據庫系統管理系統等系統軟件,以及大量的應用軟件,都直接依賴于操作系統的支持,取得它所提供的服務。
2、操作系統的作用
- OS作為用戶與計算機硬件系統之間的接口
- OS作為計算機系統資源的管理者
- OS實現了對計算機資源的抽象
3、操作系統的內核
操作系統的內核(Kernel)是操作系統的核?部分,它負責系統的內存管理,硬件設備的管理,?件系統的管理以及應?程序的管理。 內核是連接應?程序和硬件的橋梁,決定著系統的性能和穩定性。
4、內核態和系統態
為了防止OS本身及關鍵數據(如PCB等)遭受到應用程序有意或無意的破壞,通常將處理機的執行狀態分成系統態和用戶態兩種:
- 系統態(內核態):它具有較高的特權,能執行一切指令,訪問所有寄存器的存儲區,傳統的OS都在系統態運行。
- 用戶態:它是具有較低特權的執行狀態,僅能執行規定的指令,訪問指定的寄存器和存儲區。
一般情況下,應用程序只能在用戶態運行,不能執行OS指令及訪問OS區域,這樣可以防止應用程序對OS的破壞。
5、什么是系統調用
我們運?的程序基本都是運?在?戶態,如果我們需要調?操作系統提供的系統態級別的?功能,就需要使用系統調?。也就是說在我們運?的?戶程序中,凡是與系統態級別的資源有關的操作(如?件管理、進程控制、內存管理等),都必須通過系統調??式向操作系統提出服務請求,并由操作系統代為完成。
6、系統調用的類型
- 設備管理。完成設備的請求或釋放,以及設備啟動等功能。
- ?件管理。完成?件的讀、寫、創建及刪除等功能。
- 進程控制。完成進程的創建、撤銷、阻塞及喚醒等功能。
- 進程通信。完成進程之間的消息傳遞或信號傳遞等功能。
- 內存管理。完成內存的分配、回收以及獲取作業占?內存區??及地址等功能。
二 進程和線程
1、進程和線程的概念
- 進程:程序執行時的一個實例,每個進程都有獨立的內存地址空間,是系統進行資源分配和調度的基本單位。
- 線程:進程中的一個實體,比進程更加輕量,是CPU 調度和分派的基本單位。
2、進程和線程的區別
- 本質:進程是操作系統資源分配的基本單位;線程是任務調度和執行的基本單位。
- 內存分配:系統在運行的時候會為每個進程分配不同的內存空間,建立數據表來維護代碼段、堆棧段和數據段;除了 CPU 外,系統不會為線程分配內存,線程所使用的資源來自其所屬進程的資源。
- 資源擁有:進程之間的資源是獨立的,無法共享;同一進程的所有線程共享本進程的資源,如內存,CPU,IO 等
- 開銷:每個進程都有獨立的代碼和數據空間,程序之間的切換會有較大的開銷;線程可以看做輕量級的進程,同一類線程共享代碼和數據空間,每個線程都有自己獨立的運行程序計數器和棧,線程之間切換的開銷小。
- 通信:進程間 以IPC(管道,信號量,共享內存,消息隊列,文件,套接字等)方式通信 ;同一個進程下,線程間可以共享全局變量、靜態變量等數據進行通信,做到同步和互斥,以保證數據的一致性。
- 調度和切換:線程上下文切換比進程上下文切換快,代價小。
- 執行過程:每個進程都有一個程序執行的入口,順序執行序列;線程不能夠獨立執行,必須依存在應用程序中,由程序的多線程控制機制控制。
- 健壯性:每個進程之間的資源是獨立的,當一個進程崩潰時,不會影響其他進程;同一進程的線程共享此線程的資源,當一個線程發生崩潰時,此進程也會發生崩潰,穩定性差,容易出現共享與資源競爭產生的各種問題,如死鎖等
- 可維護性:線程的可維護性,代碼也較難調試,bug 難排查。
3、進程有哪幾種狀態
- 創建狀態(new) :進程正在被創建,尚未到就緒狀態。
- 就緒狀態(ready) :進程已處于準備運?狀態,即進程獲得了除了處理器之外的?切所需資源,?旦得到處理器資源(處理器分配的時間?)即可運?。
- 運?狀態(running) :進程正在處理器上上運?(單核 CPU 下任意時刻只有?個進程處于運?狀態)。
- 阻塞狀態(waiting) :?稱為等待狀態,進程正在等待某?事件?暫停運?如等待某資源為可?或等待 IO 操作完成。即使處理器空閑,該進程也不能運?。
- 結束狀態(terminated) :進程正在從系統中消失。可能是進程正常結束或其他原因中斷退出運?。
4、進程間的通信方式
- 管道/匿名管道(Pipes) :?于具有親緣關系的父子進程間或者兄弟進程之間的通信。
- 有名管道(Names Pipes) : 匿名管道由于沒有名字,只能?于親緣關系的進程間通信。為了克服這個缺點,提出了有名管道。有名管道嚴格遵循先進先出(first in first out)。有名管道以磁盤?件的?式存在,可以實現本機任意兩個進程通信。
- 信號(Signal) :信號是?種復雜的通信?式,?于通知接收進程某個事件已經發?;
- 消息隊列(Message Queuing) :消息隊列是消息的鏈表,具有特定的格式,存放在內存中并由消息隊列標識符標識。管道和消息隊列的通信數據都是先進先出的原則。與管道(?名管道:只存在于內存中的?件;命名管道:存在于實際的磁盤介質或者?件系統)不同的是消息隊列存放在內核中,只有在內核重啟(即,操作系統重啟)或者顯示地刪除?個消息隊列時,該消息隊列才會被真正的刪除。消息隊列可以實現消息的隨機查詢,消息不?定要以先進先出的次序讀取,也可以按消息的類型讀取.? FIFO 更有優勢。消息隊列克服了信號承載信息量少,管道只能承載?格式字節流以及緩沖區??受限等缺。
- 信號量(Semaphores) :信號量是?個計數器,?于多進程對共享數據的訪問,信號量的意圖在于進程間同步。這種通信?式主要?于解決與同步相關的問題并避免競爭條件。
- 共享內存(Shared memory) :使得多個進程可以訪問同?塊內存空間,不同進程可以及時看到對?進程中對共享內存中數據的更新。這種?式需要依靠某種同步操作,如互斥鎖和信號量等。可以說這是最有?的進程間通信?式。
- 套接字(Sockets) : 此?法主要?于在客戶端和服務器之間通過?絡進?通信。套接字是?持 TCP/IP 的?絡通信的基本操作單元,可以看做是不同主機之間的進程進?雙向通信的端點,簡單的說就是通信的兩?的?種約定,?套接字中的相關函數來完成通信過程。
5、線程間的同步方式
線程同步是兩個或多個共享關鍵資源的線程的并發執?,同步線程是為了避免關鍵資源的使?沖突。
操作系統?般有下?三種線程同步的?式:
- 互斥量(Mutex):采?互斥對象機制,只有擁有互斥對象的線程才有訪問公共資源的權限。因為互斥對象只有?個,所以可以保證公共資源不會被多個線程同時訪問。?如 Java 中的synchronized 關鍵詞和各種 Lock 都是這種機制。
- 信號量(Semphares) :它允許同?時刻多個線程訪問同?資源,但是需要控制同?時刻訪問此資源的最?線程數量。
- 事件(Event) :Wait/Notify:通過通知操作的?式來保持多線程同步,還可以?便的實現多線程優先級的比較操作。
6、進程調度方式
- 非搶占方式
在采用這種調度方式時,一旦把處理機分配給某進程后,就一直讓它運行下去,決不會因為時鐘中斷或任何其它原因去搶占當前正在運行進程的處理機,直至該進程完成,或發生某事件而被阻塞時,才把處理機分配給其它進程。 - 搶占方式
這種調度方式允許調度程序根據某種規則,去暫停某個正在執行的進程,將已分配給該進程的處理機重新分配給另一進程。“搶占”不是一種任意性行為,必須遵循一定的原則,主要原則有:- 優先權原則:允許優先級高的新到進程搶占當前進程的處理機。
- 短進程優先原則:允許新到的短進程搶占當前進程的處理機。
- 時間片原則:各進程按時間片輪轉運行時,當正在執行的進程的一個時間片用完后,便停止該進程的執行而重新進行調度。
7、進程的調度算法
進度調度的任務主要有三:保存處理機的現場信息;按某種算法選取進程;把處理器分配給進程。
這里的“某種算法”就是進程的調度算法。
- 先到先服務(FCFS)調度算法 : 從就緒隊列中選擇?個最先進?該隊列的進程為之分配資源,使它?即執?并?直執?到完成或發?某事件?被阻塞放棄占? CPU 時再重新調度。
- 短作業優先(SJF)的調度算法 : 從就緒隊列中選出?個估計運?時間最短的進程為之分配資源,使它?即執?并?直執?到完成或發?某事件?被阻塞放棄占? CPU 時再重新調度。
- 時間?輪轉調度算法 : 時間?輪轉調度是?種最古?,最簡單,最公平且使?最?的算法,?稱 RR(Round robin)調度。每個進程被分配?個時間段,稱作它的時間?,即該進程允許運?的時間。
- 多級反饋隊列調度算法 :前?介紹的?種進程調度的算法都有?定的局限性。如短進程優先的調度算法,僅照顧了短進程?忽略了?進程 。多級反饋隊列調度算法既能使?優先級的作業得到響應?能使短作業(進程)迅速完成。,因?它是?前被公認的?種較好的進程調度算法,UNIX 操作系統采取的便是這種調度算法。算法詳細:1)設置多個就緒隊列,并為每個隊列賦予不同的優先級;2)每個隊列都采用FCFS算法;3)按隊列優先級調度。
- 優先級調度 : 為每個流程分配優先級,?先執?具有最?優先級的進程,依此類推。具有相同優先級的進程以 FCFS ?式執?。可以根據內存要求,時間要求或任何其他資源要求來確定優先級。
8、死鎖的定義、起因、必要條件和處理方法
- 定義:如果一組進程中的每一個進程都在等待僅由該組進程中的其它進程才能引發的事件,那么該組進程是死鎖的。
- 起因:死鎖的起因,通常是源于多個進程對資源的爭奪。
- 必要條件:產生死鎖必須同時具備下面四個必要條件
- 互斥條件:一段時間內,某資源只能被一個進程占用,如果此時還有其它進程請求該資源,則請求進程只能等待,直至占用該資源的進程用畢釋放。
- 請求和保持條件:進程已經保持了一個資源,但又提出了新的資源請求,而該資源已被其它進程占有,此時請求進程被阻塞,但對自己已獲得的資源保持不放。
- 不可搶占條件:進程已獲得的資源在未使用完之前不能被搶占,只能在進程使用完時由自己釋放。
- 循環等待條件:在發生死鎖時,必然存在一個 進程-資源 的循環鏈,即進程集合
中的
正在等待一個
占用的資源,
正在等待
占用的資源,......,
正在等待已被
占用的資源。
- 處理方法:目前處理死鎖的方法可歸結為四種
- 預防死鎖:(待補充)
- 避免死鎖:(待補充)
- 檢測死鎖:(待補充)
- 接觸死鎖:(待補充)
上述四種方法,從1到4對死鎖的防范程度逐漸減弱,對對應的是資源利用率的提高,以及進程因資源因素而阻塞的頻度下降(即并發程度提高)。
三 內存管理
1、操作系統的內存管理主要是做什么?
內存管理的主要任務,是為多道程序的運行提供良好的環境,提高內存的利用率,方便用戶使用,并能從邏輯上擴充內存。因此,內存管理應具有內存分配和回收、內存保護、地址映射和內存擴充等功能。
2、內存管理機制
簡單分為連續分配管理?式和非連續分配管理?式這兩種。連續分配管理方式是指為?個?戶程序分配?個連續的內存空間,常見的如 分區管理。連續分配方式會形成許多碎片,雖然可以通過“緊湊”方法將許多碎片拼接成可用的大空間,但須為之付出很大開銷,如果允許將一個進程直接分散裝入許多不相鄰接的分區中,便可充分地利用內存空間,而無須再進行“緊湊” 。基于這一思想而產生了非連續的分配管理方式,非連續分配管理?式允許?個程序使?的內存分布在離散或者說不相鄰的內存中,常見的如頁式管理、段式管理及“段頁式管理”。
- 分區管理 : 遠古時代的計算機操系統的內存管理?式。將內存的用戶空間分若干個分區(大小固定或動態),每
個分區中只包含?個進程。如果程序運?需要內存的話,操作系統就分配給它一個分區,如果程序運?只需要很小的空間的話,分配的這塊內存很??部分?乎被浪費了。這些在每個塊中未被利?的空間,我們稱之為碎片。 - 頁式管理 :在該方式中,將用戶程序的地址空間分為若干個固定大小的區域,稱為“頁”或“頁面”。相應地,也將內存空間分為若干個物理塊或頁框(frame),頁和塊的大小相同。這樣可將用戶程序的任一頁放入任一物理塊中,實現了離線分配。系統為每個進程建立了一張頁面映射表,簡稱頁表,頁表的作用是實現從頁號到物理塊號的地址映射。
- 段式管理 : 這是為了滿足用戶要求而形成的一種內存管理方式。它把用戶程序的地址空間分為若干個大小不同的段,每段可定義一組相對完整的信息。例如,有主程序段MAIN、子程序段X、數據段D及棧段S等。在內存分配時,以段為單位,這些段在內存中可以不相鄰接,所以也同樣實現了離散分配。系統為每個進程建立一張段映射表,簡稱段表,段表項記錄了該段在內存中的起始地址(又稱“基址”)和段的長度,段表的作用是實現從邏輯段到物理內存區的映射的。
- 段頁式管理:
段頁式管理機制結合了段式管理和頁式管理的優點。簡單來說段頁式管理機制就是先將用戶程序分成若干段,再把每個段分成若干頁,并為每一個段賦予一個段名。
3、塊表和多級頁表
快表
由于頁表是存放在內存中的,這使CPU在每存取一個數據時,都要訪問兩次內存。第一次是訪問內存中的頁表,從中找到指定頁的物理塊號,再將塊號與頁內偏移量拼接,以形成物理地址。第二次訪問內存時,才是從第一次所得地址中獲得所需數據(或向此地址中寫入數據)。
為了提高地址變換速度,操作系統在頁表方案基礎之上引入了快表來加速虛擬地址到物理地址的轉換。
快表可以看作頁表的一種緩存,用以存放當前訪問的那些頁表項。
使用快表之后的地址轉換流程是這樣的:
- 根據虛擬地址中的頁號查找快表;
- 如果該頁在快表中,直接從快表中讀取相應的物理地址;
- 如果該頁不在快表中,就訪問內存中的頁表,再從頁表中得到物理地址,同時將頁表中的該表項添加到快表中;
- 當快表填滿后,又要登記新頁時,就按照一定的淘汰策略淘汰掉快表中的一個頁。
多級頁表
引?多級頁表的主要?的是為了避免把全部頁表?直放在內存中占?過多空間,特別是那些根本就不需要的頁表就不需要保留在內存中。
4、段頁式管理機制的地址變換過程
在段頁式系統中,為了獲得一條指令或數據,須三次訪問內存。
第一次訪問是訪問內存中的段表,從中取得頁表始址;
第二次訪問是訪問內存中的頁表,從中取出該頁所在的物理塊號,并將該塊號與頁內地址一起形成指令或數據的物理地址;
第三次訪問才是珍重從第二次訪問所得的地址中取出指令或數據。
5、分頁機制和分段機制的共同點和區別
- 共同點
- 分頁機制和分段機制都是為了提?內存利?率,減少內存碎?。
- 頁和段都是離散存儲的,所以兩者都是離散分配內存的?式。但是,每個頁和段中的內存是連續的。
- 區別
- ?的大小是固定的,由操作系統決定;而段的大小不固定,取決于我們當前運行的程序。
- 分頁僅僅是為了滿?操作系統內存管理的需求,而段是邏輯信息的單位,在程序中可以體現為代碼段,數據段,能夠更好滿?用戶的需要。
6、邏輯(虛擬)地址與物理地址
-
為什么要有虛擬地址?
- 如果直接把物理地址暴露出來的話會帶來嚴重問題,比如可能對操作系統造成傷害以及給同時運?多個程序造成困難。
- 如果沒有虛擬地址,在編寫程序時,必須要知道程序所在的物理地址空間,這在實際中是難以確定的。而通過虛擬地址可以屏蔽掉物理地址的細節,使程序員只關注程序本身的地址空間。
- 直接暴露物理地址無法對各個進程能訪問的地址空間進行隔離。
-
通過虛擬地址訪問內存有哪些優勢
- 程序可以使??系列相鄰的虛擬地址來訪問物理內存中不相鄰的大內存緩沖區。
- 程序可以使??系列虛擬地址來訪問?于可?物理內存的內存緩沖區。當物理內存的供應量變小時,內存管理器會將物理內存頁(通常大小為 4 KB)保存到磁盤?件。數據或代碼頁會根據需要在物理內存與磁盤之間移動。
- 不同進程使?的虛擬地址彼此隔離。?個進程中的代碼無法更改正在由另?進程或操作系統使?的物理內存。
7、對換(Swapping)技術
“對換”,是指把內存中暫時不能運行的進程或暫時不用的程序和數據換出到外存上,以便騰出足夠的內存空間,再把已具備運行條件的進程或進程所需要的程序和數據換入內存。對換是改善內存利用率的有效措施,它可以解決內存緊張問題,直接提高處理機的利用率和系統的吞吐量。
四 虛擬內存
1、什么是虛擬內存
- 廣義 :虛擬內存使得應?程序認為它擁有連續的可?的內存(?個連續完整的地址空間),而實際上,它通常是被分隔成多個物理內存碎片,還有部分暫時存儲在外部磁盤存儲器上,在需要時進行數據交換。與沒有使?虛擬內存技術的系統相比,使用這種技術的系統使得大型程序的編寫變得更容易,對真正的物理內存(例如 RAM)的使?也更有效率。
- 狹義:虛擬內存是現代操作系統中內存管理的一項重要技術,實現內存擴充功能。但該功能并非是從物理上實際地擴大內存地容量,而是從邏輯上實現對內存容量地擴充,讓用戶感覺到的內存容量比實際內存容量大得多。于是便可以讓比內存空間更大的程序運行,或者讓更多的用戶程序并發運行。這樣既滿足了用戶的需要,又改善了系統的性能。
2、局部性原理
要想更好地理解虛擬內存技術,必須要知道計算機中著名的局部性原理,該原理又表現在以下兩個方面:
- 時間局部性:如果程序中的某條指令?旦執?,不久以后該指令可能再次執?;如果某數據被訪問過,不久后該數據可能再次被訪問。產?時間局部性的典型原因,是在程序中存在著?量的循環操作。
- 空間局部性:?旦程序訪問了某個存儲單元,在不久之后,其附近的存儲單元也將被訪問,即程序在?段時間內所訪問的地址,可能集中在?定的范圍之內,這是因為指令通常是順序存放、順序執?的,數據也?般是以向量、數組、表等形式簇聚存儲的。
時間局部性是通過將近來使?的指令和數據保存到?速緩存存儲器中,并使??速緩存的層次結構實現。空間局部性通常是使用較大的?速緩存,并將預取機制集成到?速緩存控制邏輯中實現。虛擬內存技術實際上就是建立了 “內存?外存”的兩級存儲器的結構,利?局部性原理實現高速緩存。
3、虛擬存儲器的基本工作
基于局部性原理,在程序裝入時,可以僅將程序當前要運行的?部分裝?內存,?將其他部分留在外存,就可以啟動程序執行。由于外存往往比內存?很多,所以我們運?的軟件的內存大小實際上是可以比計算機系統實際的內存大小大的。在程序執行過程中,當所訪問的信息不在內存時,由操作系統將所需要的部分調?內存,然后繼續執?程序。另???,操作系統將內存中暫時不使?的內容換到外存上,從而騰出空間存放將要調?內存的信息。這樣,計算機好像為?戶提供了?個比實際內存?得多的存儲器——虛擬存儲器。
4、虛擬內存的技術實現
- 基于局部性原理可知,應用程序在運行之前沒有必要將之全部裝入內存,而僅須將那些當前要運行的少數頁面或段先裝入內存便可運行,其余部分暫留在盤上。
- 程序在運行時,如果它所要訪問的頁或段已調入內存,便可繼續執行下去;但如果程序所要訪問的頁或段尚未調入內存(稱為缺頁或缺段),便發出缺頁或缺段的中斷請求,此時OS將利用請求調頁(段)功能將它們調入內存,以使進程能繼續執行下去。
- 如果此時內存已滿,無法再裝入新的頁或段,OS還需要再利用頁或段的置換功能,將內存中暫時不用的頁或段調至盤上,騰出足夠的內存空間后,再將需要訪問的頁或段調入內存,使程序繼續執行下去。
- 這樣,便可使一個大的用戶程序再較小的內存空間中運行,也可在內存中同時裝入更多的進程,使它們并發執行。
5、頁面置換算法的作用
當發?缺頁中斷時,如果當前內存中并沒有空閑的頁?,操作系統就必須在內存選擇?個頁面將其移出內存,以便為即將調?的頁面讓出空間。?來選擇淘汰哪??的規則叫做頁面置換算法,我們可以把頁面置換算法看成是淘汰頁面的規則。
置換算法的好壞將直接影響到系統的性能。
不適當的算法可能會導致進程發生“抖動”,即剛被換出的頁很快又要被訪問,需要將它重新調入,此時又需再選一頁調出;而此剛被調出的頁很快又被訪問,又需將它調入,如此頻繁的更換頁面,以致一個進程在運行中把大部分時間都花費在頁面置換工作上,我們稱該進程發生了“抖動”。
產生抖動的原因:
- 進程分配的物理塊數太少
- 置換算法選擇不當
- 全局置換使抖動傳播 ?
7、常見的頁面置換算法
- OPT(Optimal)頁面置換算法(最佳頁面置換算法) :最佳(Optimal, OPT)置換算法所選擇的被淘汰頁面將是以后永不使?的,或者是在最?時間內不再被訪問的頁面,這樣可以保證獲得最低的缺頁率。但由于人們目前?法預知進程在內存下的若千頁面中哪個是未來最?時間內不再被訪問的,因而該算法無法實現。?般作為衡量其他置換算法的方法。
- FIFO(First In First Out) 頁面置換算法(先進先出頁面置換算法) :總是淘汰最先進入內存的頁面,即選擇在內存中駐留時間最久的頁面進?淘汰。
- LRU (Least Currently Used)頁面置換算法(最近最久未使???置換算法) :LRU算法賦予每個頁面?個訪問字段,?來記錄?個頁面自上次被訪問以來所經歷的時間 T,當須淘汰?個頁面時,選擇現有頁面中其 T 值最大的,即最近最久未使?的頁面予以淘汰。
- LFU (Least Frequently Used)頁面置換算法(最少使?頁面置換算法) : 該置換算法選擇在之前時期使?最少的頁面作為淘汰頁。