操做系統(Operation System, OS)是管理和控制計算機硬件與軟件資源的計算機程序,是直接運行在「裸機」三的最基本的系統軟件,任何其餘軟件都必須在操做系統的支持下才能運行。算法
互斥:進程之間訪問臨界資源時相互排斥的現象;編程
臨界資源:一次僅容許一個進程使用的資源,如 打印機。
臨界區:每一個進程中訪問臨界資源的那段代碼。數組
多線程:多線程是進程中併發運行的一段代碼,可以實現線程之間的切換執行;瀏覽器
異步和多線程:不是同等關係,異步是目的,多線程只是實現異步的一個手段,實現異步能夠採用多線程技術或者交給其餘進程來處理。安全
網絡操做系統和分佈式操做系統網絡
網絡操做系統和分佈式操做系統的不一樣之處在於:
在分佈式操做系統中,若干臺計算機相互協同完成同一任務;
而在網絡操做系統中,每臺計算機都是相互獨立的,它們並不能相互協同完成同一任務。數據結構
大多數計算機系統將CPU執行狀態分爲目態與管態。
管態就是 supervisor(管理者) mode翻譯來的。
那麼目態呢,實際上是object(目標) mode翻譯來的。多線程
管態:supervisor(管理者) mode又叫特權態、系統態或者核心態。CPU在管態下能夠執行指令系統的全集。併發
若是程序處於管態,則該程序就能夠訪問計算機的任何資源,即 它的資源訪問權限不受限制。異步
一般,操做系統在管態下運行。
目態:object(目標) mode又叫常態或用戶態。機器處於目態時,程序只能執行非特權指令,不能直接使用系統資源,也不能改變CPU的工做狀態,而且只能訪問這個用戶程序本身的存儲空間。
科普:爲何叫object mode呢?
一般CPU執行兩種不一樣性質的程序:一種是操做系統內核程序;另外一種是用戶自編程序或系統外層的應用程序。
對操做系統而言,這兩種程序的做用不一樣,前者是後者的管理者,所以「管理程序」要執行一些特權指令,而「被管理程序」出於安全考慮不能執行這些指令。
由於管理者須要管理它,它就是管理者的管理目標。因此就叫object mode。
I/O設備的中斷:當I/O設備完成用戶請求操做後,會向CPU發出相應的中斷信號,這時CPU會暫停執行下一條即將要執行的指令,轉而去執行與中斷信號對應的處理程序,若是先前執行的指令是用戶態下的程序,那麼這個轉換的過程天然也就發生了由用戶態到核心態的切換。
例如,硬盤讀寫操做完成,系統會切換到硬盤讀寫的中斷處理程序中,執行後續的操做。
其中,系統調用能夠認爲是用戶進程主動發起的,異常和外部設備中斷則是被動的。
地址映射:編譯後的程序的地址分爲邏輯地址和物理地址,多道程序環境中,每道程序不可能都從「0」地址開始,要保證程序運行,則須將邏輯地址轉換成內存空間中的物理地址。
動態重定位:在程序執行過程當中,每當訪問指令或數據時,將要訪問的程序或數據的邏輯地址轉換成物理地址。
實現方法:在系統中增長一個重定位寄存器,用來裝入程序在內存中的起始地址,程序執行時,真正訪問的內存地址是相對地址於重定向寄存器中的地址相加之和,從而實現動態重定位。
對於操做系統來講,一個任務就是一個進程(Process),好比打開一個瀏覽器就是啓動一個瀏覽器進程,打開一個記事本就啓動了一個記事本進程,打開兩個記事本就啓動了兩個記事本進程,打開一個Word就啓動了一個Word進程。
有些進程還不止同時幹一件事,好比Word,它能夠同時進行打字、拼寫檢查、打印等事情。在一個進程內部,要同時幹多件事,就須要同時運行多個「子任務」,咱們把進程內的這些「子任務」稱爲線程(Thread)。類比:
進程=工廠
線程=工廠裏各個流水線
進程能夠認爲是程序執行時的一個實例。進程是系統進行資源分配的獨立實體,且每一個進程擁有獨立的地址空間。(即 資源的分配和調度的一個獨立單元)
進程控制塊(Process Control Block, PCB):保存運行期間進程的數據,PCB是進程存在的惟一標誌。
進程的五種基本狀態及其轉換:
注意:後備隊列在外存中,而就緒隊列在內存中。
PV操做是一種實現進程互斥與同步的有效方法。PV操做與信號量的處理相關,P表示經過(pass)的意思,V表示釋放(荷蘭語v開頭)的意思。
在操做系統中,信號量S是一整數。
S大於或等於零,表明可供併發進程使用的資源實體數;
在S小於零時,S表示正在等待使用資源實體的進程數。
創建一個信號量必須說明此信號量所表明的意義而且賦初值。
除賦初值外,信號量僅能經過PV操做來訪問。
S減1;
類比:「佔用了一個資源」
若S減1後仍大於或等於0,則進程繼續執行;
類比:「若佔用一個資源後,還有多餘的資源或者恰好用完資源,那麼就表明該進程有資源能夠利用,進程也就能夠繼續執行」
若S減1後小於0,則該進程被阻塞後放入等待該信號量的等待隊列中,而後轉進程調度。
類比:「若佔用一個資源後,還欠別人資源,那麼就表明該進程根本就沒有資源能夠用了,若是再用就要欠債了,因此等待」
S加1;
類比:「資源佔用完了,物歸原主,釋放資源」
若相加後結果大於0,則進程繼續執行;
類比:「若釋放資源後,資源數大於0,就表明庫存裏還有資源能夠給你利用,那就繼續執行」
若相加後結果小於或等於0,則從該信號的等待隊列中釋放一個等待進程,而後再返回原進程繼續執行或轉進程調度。
類比:「若釋放資源後,資源數仍是欠別人的或者爲0,就表明庫存裏沒有資源能夠利用了,因此等待」
注意:PV操做對於每個進程來講,都只能進行一次,並且必須成對使用。
根據交換信息量的多少和效率的高低,進程通訊分爲以下低級通訊和高級通訊。
低級通訊:只能傳遞狀態和整數值(控制信息)。
因爲進程的互斥和同步,須要在進程間交換必定的信息,故很多學者將它們也歸爲進程通訊。
在通訊進程之間存在一塊可直接訪問的共享空間,經過對這片共享空間進行寫/讀操做,實現進程之間的信息交換。
在對共享空間進行寫/讀操做時,須要同步互斥工具(如 P操做、V操做),對共享空間的寫/讀進行控制。
類比:
進程=物品
共享空間=錢
用錢進行交換,而不用物物交換
在消息傳遞模式中,進程間的數據交換是以格式化的消息(Message)爲單位的。
進程經過系統提供的發送消息和接收消息兩個原語進行數據交換。
若通訊進程之間不存在可直接訪問的共享空間,則必須利用操做系統提供的信息傳遞方法實現進程通訊。
可分爲直接和間接兩種通訊方式:
間接:將消息發送給某個中間實體(信箱),接受進程從中間實體中取得消息,又稱爲信箱通訊方式。
類比:
甲給乙寫信
直接:甲直接把信交給乙
間接:甲經過郵差把信交給乙
共享文件:用於鏈接一個發送進程和一個接收進程,以實現它們之間通訊的文件,就是共享文件,又名pipe(管道)文件。
向管道提供輸入的發送進程,以字節流形式將大量的數據送入管道;
而接收管道輸出的接收進程,則從管道中接收數據。
爲了協調雙方的通訊,管道機制必須提供互斥、同步和肯定對方存在三方面的協調能力。
對線程最基本的理解就是「輕量級進程」,它是一個基本的CPU執行單元,也是程序執行流的最小單元,由線程ID、程序計數器、寄存器集合和堆棧組成。(即 CPU調度的基本單元)
線程控制塊(Thread Control Block, TCB):保存運行期間線程的數據,TCB是線程存在的惟一標誌。
調度算法是根據系統的資源分配策略所規定的資源分配算法。
有的調度算法適用於做業調度,有的適用於進程調度,有的兩種都適用。
先來先服務調度(First Come First Service, FCFS):按照做業/進程進入系統的前後次序進行調度,先進入系統者先調度,即 啓動等待時間最長的做業/進程。
有利於CPU繁忙型做業/進程
CPU繁忙意味着是長做業,不須要頻繁的輸入輸出
對短做業/進程不利
由於短做業執行時間很短,若令它等待較長時間,則帶權週轉時間會很高。
不利於I/O繁忙型做業進程
I/O繁忙意味着不停地中斷完成,是短做業
短做業優先調度(Shortest Job First, SJF):該算法每次從後備隊列/就緒隊列中選擇一個估計時間最短的做業/進程,將資源分配給它。
優先級調度:該算法每次從後備隊列/就緒隊列中選擇優先級最高的一個做業/進程,將資源分配給它。
根據新的更高優先級進程可否搶佔正在執行的進程,可將該調度分爲:
高響應比優先調度(Highest Response Ratio Next, HRRN):該算法是對FCFS調度算法和SJF調度算法的一種綜合平衡,同時考慮每一個做業的等待時間和估計的運行時間。
在每次進行做業調度時,先計算後備做業隊列中每一個做業的響應比,從中選出響應比最高的做業投入運行。
響應比=做業週轉時間/做業執行時間=(等待時間+要求服務時間)/要求服務時間
該算法將全部就緒進程按到達的前後次序排成一個隊列,每次調度時,把處理機分配給隊首進程,並令其執行一個時間片;
當執行的時間片用完時,由一個計時器發出時鐘中斷請求,調度程序便中止該進程的執行,並將其放到就緒隊列尾;
而後,再把處理機分配給就緒隊列中新的隊首。
該算法是時間片輪轉調度算法和優先級調度算法的綜合和發展,經過動態調整進程優先級和時間片大小,能夠兼顧多方面的系統目標。
設置多個就緒隊列,並賦予不一樣優先級,優先級越高,時間片越小,進程在進入待調度的隊列等待時,首先進入優先級最高的Q1等待,一個時間片結束後,若進程沒有運行完,則轉入低一級的就緒隊列隊尾,僅當高優先級隊列中無就緒進程纔開始調度低一級的就緒隊列中的進程(若此刻有進程進入了高優先級隊列中,那麼要先轉去調用高優先級隊列)。
時刻6 因爲Q1已經空閒,因而開始調度Q2中的做業,則J1獲得處理器開始運行。J1再通過一個時間片,完成了任務。因而整個調度過程結束。
從上面的例子看,在多級反饋隊列中,後進的做業不必定慢完成。
死鎖是指多個進程因競爭臨界資源而形成的一種僵局(互相等待),若無外力做用,這些進程都沒法向前推動。
資源競爭
例子:
A有紙,B有筆
A:你不給我筆,我就寫不完做業
B:你不給我紙,我就寫不了做業
彼此僵持不下。。
進程推動順序非法
例子:
A要前進2步,到桌子前,再後退2步,結果順序非法:
A前後退,就永遠到不了桌子前,觸發不了,死鎖
環路條件(循環等待):存在一種進程循環鏈,鏈中每個進程已得到的資源同時被鏈中下一個資源所請求。
注意:這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立;
反之,只要上述條件之一不知足,就不會發生死鎖。
預防死鎖:經過設置一些限制條件,破壞死鎖的一些必要條件,讓死鎖沒法發生。
避免死鎖:在動態分配資源的過程當中,用一些算法(如 銀行家算法)防止系統進入不安全狀態,避免死鎖的發生。
Dijkstra E W於1968年提出銀行家算法。之因此稱爲銀行家算法,是由於該算法可用於銀行系統。
新進程進入系統時,它必須說明各種資源類型的實例的最大需求量,這一數量不能超過系統各種資源的總數。
當進程申請一組資源時,該算法須要檢查申請者懟各種資源的最大需求量,若是系統現存的各種資源的數量能夠知足當前它懟各種資源的最大需求量時,就知足當前的申請;不然,進程必須等待,直到其餘進程釋放足夠的資源爲止。
換言之,僅當申請者能夠在必定時間內無條件地歸還它所申請的所有資源時,才能把資源分配給它。
死鎖的檢測及解除:在死鎖發生前不作任何操做,只是檢測當前是否發生死鎖,若發生死鎖,則採起一些措施(如 資源剝奪法、撤銷進程法、進程回退法)來解除死鎖。
在分區存儲管理中,程序的地址空間是一維線性的,由於指令或操做數地址只要給出一個信息量便可決定。
分區存儲管理中經常使用的分配策略有:首次適應算法、循環首次適應算法、最佳適應算法和最壞適應算法。
首次適應算法:按地址從小到大排序,分配第一個符合條件的分區。
循環首次適應算法:在首次適應算法的基礎上,從上次查找結束的位置開始查找,分配第一個符合的分區。
最佳適應算法:是按空間從小到大排序,分配第一個符合條件的分區。
最壞適應算法:是按地址從大到小排序,分配第一個符合條件的分區。
在頁式存儲管理中,程序的地址空間是一維線性的,由於指令或操做數地址只要給出一個信息量便可決定。
理解:頁式存儲管理只用給出一個邏輯地址就行,由於頁的大小是固定的,邏輯地址÷頁的大小=頁號...餘 偏移量,因此是地址空間一維的,只用一個邏輯地址。
在地址映射過程當中,若在頁面中發現所要訪問的頁面不在內存中,則產生缺頁中斷。
當發生缺頁中斷時,若是操做系統內存中沒有空閒頁面,則操做系統必須在內存選擇一個頁面將其移出內存,以便爲即將調入的頁面讓出空間。而用來選擇淘汰哪一頁的規則叫作頁面置換算法。抖動(顛簸):是指在頁面置換過程當中,剛剛調出的頁面立刻又要調入內存,剛剛調入的頁面立刻又要調出,發生頻繁的頁面調度行爲。
先進先出置換算法(First In First Out, FIFO):將最先進入內存的頁面調出。
該算法會產生Belady異常,即 發生缺頁時,若是對一個進程未分配它所要求的所有頁面,有時分配頁數↑,缺頁率反而↑的異常現象。(先進先出,結果進來了一個須要的頁,也出去了一個須要的頁)
時鐘置換算法(CLOCK):也稱爲最近未用算法(NRU),該算法是爲每一個頁面設置一個使用位,須要替換頁面時,循環檢查各個頁面,將使用位爲1的頁面重置爲0(使用時再置爲1),直到遇到第一個使用位爲0的頁面,將其調出。
若是在每一個頁面再增長一個修改位,則獲得改進型的CLOCK置換算法,相似的,須要替換頁面時,將使用位和修改位都爲0的頁面調出。
段式存儲管理的用戶地址是二維的、按段劃分的。
理解:段式存儲管理必須給出(段號,偏移量),由於段的大小不固定,必須給出這兩個,因此是二維的。
在這樣的系統中做業的地址空間由若干邏輯分段組成,每一個分段有本身的名字,對於一個分段而言,它是一個連續的地址區。
段號 | 段內位移 |
---|---|
s | w |
段頁式存儲管理的用戶地址也是二維的、按段劃分的。只是在段中再劃分紅若干大小相等的頁。
理解:段頁式存儲管理也必須給出(段號,偏移量),雖然段的大小不固定,可是段內頁號和頁內偏移能夠根據偏移量算出來,因此仍是二維的。
地址結構就由段號、段內頁號、頁內位移三部分組成。
注意:不要看三部分就是三維的了,其實用戶使用的部分也是二維的。
段號 | 段內頁號 | 頁內位移 |
---|
用戶使用的還是段號和段內相對地址,
由地址變換機構自動將段內相對地址的高几位解釋爲段內頁號,將剩餘的低位解釋爲頁內位移。
用戶地址空間的最小單位不是段而是頁,而主存按頁的大小劃分,按頁裝入。
這樣,一個段能夠裝入到若干個不連續的主存塊內,段的大小再也不受主存可用區的限制了。
虛擬存儲器:是指具備請求調入功能和置換功能,並能從邏輯上對內存容量加以擴充的一種存儲器系統。
時間局部性(Temporal Locality):若是一個信息項正在被訪問,那麼在近期它極可能還會被再次訪問。
程序循環、堆棧等是產生時間局部性的緣由。
順序局部性(Order Locality):在典型程序中,除轉移類指令外,大部分指令是順序進行的。順序執行和非順序執行的比例大體是5:1。此外,對大型數組訪問也是順序的。
指令的順序執行、數組的連續存放等是產生順序局部性的緣由。
虛擬存儲器基於局部性原理,在程序裝入時,能夠只將程序的一部分裝入內存,就能夠啓動程序執行。
在執行過程當中,當所訪問的信息不在內存中時,由操做系統將所需內容調入內存,使程序繼續執行;
同時,操做系統將內存中暫時不用的內容調出到外存。
這樣,系統就好像爲用戶提供了一個比實際內存大得多的存儲器,稱爲虛擬存儲器。
文件分配對應於文件的物理結構,是指如何爲文件分配磁盤塊(外存)。
經常使用的磁盤空間分配方法有三種:
最短尋找時間優先算法(Shortest Seek Time First, SSTF):選擇處理的磁道是與當前磁頭所在磁道距離最近的磁道,使每次的尋找時間最短。
該算法會產生「飢餓」現象。
掃描算法(SCAN):也叫電梯算法,在磁頭當前移動方向上選擇與當前磁頭所在距離最近的請求做爲下一次服務的對象。
其實是在SSTF算法的基礎上規定了磁頭運動的方向。
循環掃描算法(Cyclic SCAN, C-SCAN):在SCAN算法的基礎上規定磁頭單向移動來提供服務,到達磁盤端點返回時,直接快速返回起始端。
若磁頭移動到最遠端的請求後,即刻返回,而不是到達端點再返回,則將改進後的SCAN算法和C-SCAN算法稱爲LOOK算法和C-LOOK算法。
程序I/O方式:計算機從外部設備讀取數據到存儲器,每次讀取一個字的數據。對讀入的每一個字,CPU須要對外設狀態進行循環檢查,直到肯定該字已經在I/O控制器的數據寄存器中。
該方式適用於早期的無中斷計算機系統中。
CPU和I/O設備只能串行工做,致使CPU的利用率至關低。
中斷驅動I/O控制方式:容許I/O設備主動打斷CPU的運行並請求服務,從而使CPU在對I/O控制器發送命令後能夠作其餘工做。
該方法廣泛用於現代的計算機系統中。
因爲數據中每一個字在存儲器與I/O控制器之間 的傳輸都必須通過CPU,仍然會小號CPU較多的時間。
DMA I/O控制方式:在I/O設備和內存之間開闢直接的數據交換通路,數據的基本單位是數據塊,所傳送的數據是從設備直接送入內存;
或者相反,僅在傳送數據塊的開始和結束時須要CPU干預,數據傳送是在DMA控制器的控制下完成的。
該方法適用於I/O設備爲塊設備時和主機進行數據交換。
塊設備是I/O設備中的一類,是將信息存儲在固定大小的塊中,每一個塊都有本身的地址,還能夠在設備的任意位置讀取必定長度的數據,例如硬盤,U盤,SD卡等。
直接內存存取(Direct Memory Access, DMA)是全部現代電腦的重要特點,它容許不一樣速度的硬件裝置來溝通,而不須要依賴於CPU的大量中斷負載。
不然,CPU須要歷來源把每一片斷的資料複製到暫存器,而後把它們再次寫回到新的地方。在這個時間中,CPU對於其餘的工做來講就沒法使用。
I/O通道控制方式:是DMA方式的發展,只在一組數據的傳輸開始和結束時須要CPU干預,能夠實現CPU、通道和I/O設備三者的並行操做。
該方式適用於設備與主機進行數據交換是一組數據塊的狀況,使用該方法要求系統必須配置相應的通道及通道控制器。
引入緩衝區的目的是什麼?