個人博客:http://uesugier11.gitee.io/uesugi-er11/
現代計算機中的計算機硬件:輸入設備+輸出設備+存儲器+運算器+控制器
具體的工作過程是首先由監督程序將磁帶上的第一個作業裝入內存,並把運行控制權交給作業;該作業處理完時,又把控制權交給監督程序,再有監督程序把磁帶的第二個作業調入內存等等。可以看成是串行的。
優點:解決人機矛盾和CPU與IO設備速度不匹配問題,提高系統資源的利用率和系統吞吐量。
缺點:不能充分的利用系統資源,現很少使用。
在一臺主機上連接了多個配有顯示器和鍵盤的終端並由此所組成的系統,該系統允許多個用戶同時通過自己的終端,以交互方式使用計算機,共享主機中的資源。
系統能及時響應外部事件的請求,在規定的時間內完成對該事件的處理,並控制所有實時任務協調一致地運行。
並行:指兩個或多個事件在同一時刻發生;
併發:指兩個或多個事件在同一時間間隔內發生
具體地說:併發指在一段時間內宏觀上有多個程序在同時運行,但在單處理機系統中,每一時刻卻僅能有一道程序執行,故在微觀上這些程序是分時地交替執行。
若計算機系統有多個處理機,這些可以併發執行的程序便可以被分配到多個處理機上,實現並行執行。即利用每一個處理機來處理一個可併發執行的程序。
引入概念**【進程】**:指在系統中能獨立運行 並作爲資源分配的基本單位,它是由一組機器指令、數據和堆棧等組成的,是一個能獨立運行的活動實體。
在一個沒有引入進程的系統中,屬於同一個應用程序的計算機程序和 I/O程序之間只能是順序執行,也就是計算機程序執行告一段落後,才允許I/O程序執行;反之,在程序執行I/O操作時,計算程序也不能執行。-----------爲計算程序和I/O程序分別建立一個進程(Process)後,這兩個程序就可以 併發執行。
**併發和共享是OS的兩個最基本的特徵!沒有併發和共享就談不上虛擬和異步; **
虛擬和異步是依賴於併發特性的。
所謂虛擬(Virtual)是指通過某種技術把一個物理實體變成爲若干個邏輯上的對應物。
物理實體是實際存在的東西,邏輯實體是虛的,它並不存在,但是用戶卻感覺它存在。
用於實現虛擬的技術稱爲虛擬技術,在操作系統中利用了兩種方式實現虛擬技術:時分複用技術和空分複用技術。
時分複用技術概念:將資源在不同的時間片內分配給各進程以使該資源被重複利用,從而提高資源的利用率。如採用時分複用的虛擬處理機,能夠在不同的時間片內處理多個用戶的請求,從而使得用戶感覺自己獨佔主機,而處理機在這期間也被充分的利用。
這樣可使原來僅允許在一段時間內由一個用戶訪問的設備(即臨界資源),變爲允許多個用戶「同時」訪問的共享設備
當一種資源在時間上覆用時,不同的程序或用戶輪流使用它。時分複用技術通過利用處理及的空閒時間運行其他程序,提高了處理機的利用率
實質上就是每次只把用戶程序的一部分調入內存運行,運行完成後將該部分換出,再換入另一部分到內存中執行,通過這樣的置換功能,實現了用戶程序的各個部分分時地進入內存運行。
讓同一個頻段在不同的空間內得到重複利用。空分複用技術利用存儲器的空閒空間分區域分存放和運行其他多道程序,以此來提高內存的利用率。
注意:採用分時複用技術,每臺虛擬設備的平均速度必然等於或低於物理設備速度的1/N,同理,採用空分複用技術,一臺虛擬設備平均佔用的空間必然等於或低於物理設備所擁有空間的1/N
由於資源等因素的限制,使進程的執行通常都不可能「一氣呵成」,而是以「走走停停」的方式運行。
對於內存中的每個進程,在何時能獲得處理機執行,何時又因提出某種資源請求而暫停,以及進程以怎樣的速度向前推進,每道程序總共需要多少時間才能完成等等,都是不可預知的。
進程是以人們不可預知的速度向前推進的,此即進程的異步性。
操作系統關於進程方面管理任務有如下幾種:進程控制,進程同步,進程通信,調度
內存管理主要功能:內存分配,內存保護,地址映射,內存擴充
引題:
包含關係:
注意事項:
一次完整的交互過程可以分成以下四步:
ps:經常會問到 在微內核OS中,爲什麼要採用客戶/服務器模式?我們答客戶/服務器模式的優點即可
微內核技術——把操作系統中更多的成分和功能放到更高的層次(用戶模式)中去運行,而留下一個儘量小的內核,用它來完成操作系統最基本的核心功能。
基於【機制與策略分離】的原理,將機制部分以及與硬件緊密相關的部分放入微內核中。由此微內核通常具有如下幾個方面功能:
事實上,只有不存在前趨關係的程序之間纔有可能併發執行,否則無法併發執行
特徵:
程序:是靜態的,是一個存放在磁盤裏的可執行文件,是一系列的指令集合
進程:是動態的,是進程實體的運行過程,是系統進行資源分配和調度的一個獨立單位。
其中,進程實體包含三部分:程序段,相關的數據段和PCB。
程序進程關係:一個程序多次執行會對應多個進程,比如說QQ可以登錄三個賬號。那麼既然都是QQ,那OS是怎麼區分不同進程的呢?當進程被創建的時候,OS會爲該進程分配一個唯一的,不重複的身份證——PID(Process ID,進程ID)
進程控制塊(PCB):OS需要記錄進程PID,分配了哪些資源,運行情況,那麼這些信息需要記錄到哪裏呢?答案就是進程控制塊——PCB。
進程狀態有五種:創建狀態,就緒狀態,執行狀態,阻塞狀態,終止狀態;其中就緒、執行、阻塞是三種基本狀態。
終止態:即一個進程達到了自然結束點,或是出現了無法克服的錯誤,或是被操作系統所終結,或是被其他有終止權的進程所終結,它將進入終止狀態。
引起進程狀態轉換的具體原因如下:
NULL→新建態:執行一個程序,創建一個子進程。
新建態→就緒態:當操作系統完成了進程創建的必要操作,並且當前系統的性能和虛擬內存的容量均允許。
就緒態→運行態:進程被調度
運行態→終止態:當一個進程到達了自然結束點,或是出現了無法克服的錯誤,或是被操作系統所終結,或是被其他有終止權的進程所終結。
運行態→就緒態:運行時間片到;出現有更高優先權進程。
運行態→阻塞態:等待使用資源;如等待外設傳輸;等待人工干預。
阻塞態→就緒態:申請資源被分配,或等待的事件已經發生了
就緒態→終止態:未在狀態轉換圖中顯示,但某些操作系統允許父進程終結子進程。
阻塞態→終止態:未在狀態轉換圖中顯示,但某些操作系統允許父進程終結子進程。
終止態→NULL:完成善後操作。
接下來,我們引入了兩個操作:掛起和激活
當掛起操作作用於某個進程時,該進程將被將被掛起,意味着此時該進程處於靜止狀態;
假如進程正在執行,他將暫停執行。
假如進程原本就處於就緒狀態,則該進程此時暫不接受調度。
與掛起操作對應的就是激活啦。
引入創建和終止——七態模型:
引起進程狀態轉換的具體原因如下:
進程控制的主要功能是對系統中的所有進程實施有效的管理,它具有創建新進程,撤銷已有進程,實現進程狀態轉換等功能;
簡單來說,進程控制→實現進程狀態轉換。
簡單的流程圖:
與硬件緊密相關的模塊、各種常用的設備的驅動程序以及運行頻率較高的模塊,安排在緊靠硬件的軟件層次中,將它們常駐內存,通常被稱爲OS內核;也就是OS內核其實本質上是各個模塊。
創建原語:
哪裏會用到進程創建呢?
終止/撤銷原語:
哪裏會用到進程終止呢?
被什麼事件所阻塞就會被該事件所喚醒
切換原語:
這裏有一個地方:進程所需的運行環境是什麼東西呢?
首先回顧一下我們程序是如何運行的:是通過把我們的代碼保存到硬盤然後轉入內存,然後CPU去從內存中讀取一條條指令,然後我們的程序就跑起來了。那麼CPU中有個東西 叫做寄存器。它們有不同的功能,比如可以存放下一條指令地址,也可以存放正在執行的指令,也可以保存暫時運算得到的結果;然而我們知道寄存器並不是很專一的,他有可能會隨時被其他的進程使用,那我們之前運算的結果啊,什麼保存的指令啊,豈不是都不見了嗎?這個時候就會用到我們的PCB了,它能夠保持關鍵的一些信息,也就是運行環境,這樣等我們的寄存器又空閒下來了的時候,我們就可以繼續我們未完成的指令啦。
首先,我們回顧一下我們之前學的進程異步問題,由於併發執行的進程以各自獨立,不可預知速度向前推進,我們所得到的結果往往也會不一樣,而我們往往有時候需要控制一個事件的發生在一個事件前,那麼就需要進程同步啦
同步也稱爲直接制約關係,是指爲了完成某種任務而建立的兩個或多個進程,這些進程因爲需要在某些位置上協調他們的工作次序而產生的制約關係。
有進程同步就有進程互斥,那麼進程互斥又是什麼呢?
要明白互斥,就引入了一個概念:臨界資源
臨界資源,即一個時間段內只允許一個進程使用的資源。對於該資源我們必須互斥的訪問,也就是我訪問,你不能訪問,反之亦然;因此,進程互斥,即指當一個進程訪問某臨界資源時,另一個想訪問此臨界資源的進程必須要等待,只有當我正在訪問該資源的進程訪問結束了,釋放掉了,下一個進程才能去訪問該資源。
那麼我們一般是如何進行對臨界資源的訪問的呢?
ps:臨界區是進程中訪問臨界資源的代碼段;進入區和退出區是負責實現互斥的代碼段;臨界區也被稱爲」臨界段"
讓硬件同步即爲進程互斥的硬件實現方法:中斷屏蔽方法,TestAndSet,Swap指令
簡稱TS指令,也有稱TestAndSetLock指令,或TSL指令
用TS指令管理臨界區的時候,爲每個臨界資源設置一個布爾變量lock;
用lock的布爾值就可以判斷資源是否空閒,進程能否訪問。
有的地方稱爲Exchange指令,或XCHG指令;Swap指令用硬件實現,不允許被中斷
Swap指令與TS指令在邏輯上其實差不多,但Swap需要兩個參數,不需要返回值,TS需要一個共享的變量實現互斥,因此在不同的地方就要用不同的方式去進行進程互斥。
由於之前的措施方案無法實現進程的「讓權等待"問題,因此我們引出了信號量這個概念進行解決;
ps:記錄型信號量可實現進程互斥、進程同步;如果出現了P(S),V(S)的操作,除非默認說明,默認S爲記錄型信號量
現在P1,P2併發執行,由於存在異步性,二者交替推進次序無法控制,是不確定的;
假如我P2的代碼4需要用到P1的代碼1、2、3運行結果才能執行的話,我就得保證代碼4是在代碼3後執行;
此即進程同步問題:讓本異步併發的進程互相配合,有序推進。
重點:在前操作之後執行V(S),在後操作之前執行P(S);
每一對的前趨關係都是一個進程同步的問題(爲了保證一前一後的操作)
爲了實現這個目標,我們需要做的事情
代表資源的數據結構以及由對該共享數據結構實施操作的一組過程所造成的資源管理程序共同構成了一個操作系統的資源管理模塊——管程。
管程是一種特殊的軟件模塊,由以下部分組成:
發現了嗎,管程和我們面向對象的類有點相似——可以定義一些數據,可以定義一些對這些數據操作的函數,對屬性初始化的語句。
什麼意思呢?通過1+2我們可以知道,假如我們要修改管程內的數據結構,我們只能夠通過調用管程內封裝好的方法(函數)去修改數據結構;而3則實現了進程互斥;
我們使用管程實現進程同步需要用到同步工具,如wait,signal;
但僅僅有這兩個是不夠的,我們知道,每次僅能有一個進程進入管程,假如某進程在管程中被掛起或阻塞就得等很久了,那麼解決這問題就引入了——條件變量 condition。
怎麼用呢?管程中對每個條件變量以說明**:condition x,y**;條件變量的操作是wait,signal;
每個條件變量保存一個鏈表,用以記錄因爲這條件變量所阻塞的所有進程,提供2個操作:
x.wait 和 x.signal
Java中,如果用關鍵字【synchronized】描述一個函數,那麼這個函數同一個時間段只能被一個線程調用。
得出結論了:實現互斥的P操作必須放在實現同步的P操作之後;由於V操作並不會導致進程阻塞,因此兩個V操作順序可以交換;
注意 這裏的多生產者的多 代表的不是數量 而是多個類型
以父親和女兒舉例:
父親首先應該P盤子,查看是否爲空,如果爲空,則V蘋果(蘋果++);女兒首先P蘋果,查看是否準備好了,有的話就取出,V盤子(盤子++);爲了保證互斥,必須在P、V操作之中加入對互斥信號量mutex 的 P、V操作。
可不可以不要互斥信號量mutex?
由於緩衝區大小爲1,因此orange,apple,plate三者中最多隻有一個是1;這樣的話最多隻有一個進程的P操作不會被阻塞,可以順利進入臨界區,因此可以順利執行;
那麼假如緩衝區(plate)數量爲2呢?
那麼父親和母親都能訪問盤子,有可能出現不同進程寫入緩衝區的數據相互覆蓋的問題;
得出結論:如果緩衝區的大小大於1,那麼就必須專門設置一個互斥信號量mutex來保證互斥的訪問緩衝區
以smoker1爲例,首先P(offer1)檢查是否有需要的組合1,有的話就拿走去抽,並且告訴供給者抽完了,然後供給者i++,p一下finish,並將下一個組合放在桌上然後v下一個組合;
然而我們發現 這樣子會導致死鎖的現象
按照之前的方法會發生死鎖現象,那我們怎麼解決呢?
有三種方法:
下面以第三種方法爲例,進行解決
前提:兩個進程對於共享空間的訪問必須是互斥的。
進程通過【格式化的消息】爲單位,將通信的數據封裝在消息中,通過OS提供的發送接收原語,在進程間進行消息傳遞,完成進程的數據交換。是一種高級通信方式。
直接通信方式:發送進程利用OS提供的發送原語直接把消息發給接收進程/消息直接掛到接收方的消息隊列中。
間接通信方式/信箱通信方式:發送進程先發送到中間實體(信箱)中,接受進程再去接收,完成進程間的通信。
下列是三個進程,他們所佔用不同的空間內存和系統資源;假如我們要切換進程的時候,需要用保存/恢復運行環境,還需要切換內存地址空間(更新快表、更新緩存)開銷非常大,因此,人們引入了線程機制。
進程間併發,開銷很大;線程間併發,開銷很小
引入線程機制之後,併發帶來的系統開銷降低,系統併發性提升
ps:從屬於不同進程的線程間切換,也會導致進程間切換,開銷也會很大。
高級調度/長程調度/作業調度,調度對象爲作業;
高級調度主要用於多道批處理系統中,什麼是多道批系統呢?雖然前面講過了 再複習一遍吧:
高級調度根據某種算法/一定的原則從處於後備隊列的作業中挑選一個/多個作業,分配內存等資源,建立PCB,使他們獲得競爭處理機的權利。
高級調度是外存與內存之間的調度,每個作業只調入一次,調出一次。調入時創建相應PCB,作業調出時又撤銷PCB。由於調出的時機一定是作業運行結束的時候,因此高級調度主要是解決調入的問題。
中級調度/內存調度,引入這個調度的目的是爲了提高內存的利用率和系統的吞吐量。
引入虛擬存儲技術後,將那些暫時不能運行的進程調至外存等待,此時進程的狀態稱爲:就緒駐外存狀態(掛起狀態),等它們已具備運行條件且內存又稍有空閒時,由中級調度決定,重新調入內存,並修改狀態爲就緒狀態,掛在就緒隊列上等待。
ps:PCB並不會一起被調到外存,而是常駐內存。OS通過內存中的PCB保持對各進程的監控和管理。
這個地方有人會說:那麼進程處於臨界區時,不能進行處理機調度咯? 這個說法是錯的 爲什麼呢?
在採用這種方式時,可能引起進程調度的因素歸結爲:
搶佔並非是任意的,必須遵循一定原則。包括:
對於每個用戶而言,都希望自己作業的週轉時間短一點,然而對於OS,則向作業週轉時間平均值小;那麼引入了概念:帶權週轉時間,平均帶權週轉時間;
FCFS例題:
SJF例題:
非搶佔式:
在0時刻,只有P1進來了,在他運行的時間7內,P2,P3,P4都進來了,在P1結束後選擇運行時間最短的P3執行,後續同理;
搶佔式:
RR例題
時間片大小爲2情況:
最後的運行流程圖:
時間片大小爲5情況:
補充:
例題
非搶佔式的優先級調度算法:
搶佔式的優先級調度算法:
extra:
例題:
整體思路:破壞死鎖產生的四個必要條件中的一個或幾個
正因爲這種方法缺點太明顯,因此衍生出了第二種方法:
它允許一個進程只獲得初期所需的資源後,便開始運行。在運行過程中逐步釋放已分配給自己的、且用畢的全部資源,然後再請求新的所需資源。
安全序列:是指如果系統按照這種序列分配資源,則每個進程都能順利完成。只要能找出一個安全序列,系統就是安全狀態。當然,安全序列可能會有多個
那麼對於上述這個例子,OS是怎麼做的呢?
準備的數據結構:
銀行家算法步驟:
安全性算法步驟:
檢查當前剩餘的可用資源是否能夠滿足某個進程的最大需求,如果可以,就把該進程加入安全序列,並把該進程持有的資源全部回收
簡單來說就是依次消除與不阻塞進程相連的邊,直到無邊可消;但你要是非說嚴謹的話就是下面幾步
解除死鎖的方法:
什麼是內存?內存是用於存放數據的硬件。程序執行前需要先放到內存中才能被CPU處理。
由 x = x + 1這個代碼爲例,它被編譯後爲三條指令;
第一條指令是讓CPU進行數據傳送,把內存單元爲01001111的數據取出來取到地址爲00000011的寄存器當中
第二條指令是讓地址爲00000011的寄存器上的數據+1
第三條指令是讓CPU進行數據傳送,把地址爲00000011上的數據傳送到地址爲01001111的地方.
於是實現了 x = x + 1操作
ps:上述指令不是嚴謹的二進制指令,僅供參考。
由於後續的學習,經常要進行內存之間的運算,而我們的單位往往需要統一,那麼接下來就講講單位換算
1B=8b=2^3b
1KB=1024B=2^10B
1MB=1024KB=210KB=220B
1GB=1024MB=210MB=220KB=2^30B
1TB=1024GB=210GB=220MB=230KB=240B
上面的指令操作提到了邏輯地址,那麼什麼是邏輯地址呢?
eg. 0號同學入住的是房號爲5(N=5)的房間,那麼3(M=3)號同學入住的就是8(N+M=5+3=8)號房間;
那麼固定分區分配又是如何實現的呢?
操作系統需要建立一個數據結構 —— 分區說明表,實現各個分區的分配與回收。每個表象對應一個分區,通常按照分區大小排列。每個表包含對應分區的:大小、起始地址、狀態
當某用戶程序要裝入內存的時候,由OS內核程序根據用戶程序大小檢索該表,從中找到一個能滿足大小、未分配的分區。將之分配給該程序,然後修改狀態爲「已分配」
優點:實現簡單,無外部碎片
缺點:
動態分區分配又稱爲可變分區分配。
這種分配方式不會預先劃分內存分區,而是在進程裝入內存的時候,根據進程的大小動態地建立分區,並使分區的大小正好適合進程的需要。
系統分區的大小和數目是可變的
缺點:會產生很多外部碎片,雖然可以用【緊湊】技術去處理,但緊湊的時間代價很高
下面思考三個問題:
系統要用什麼樣的數據結構記錄內存的使用情況?
通常使用 空閒分區表或者是空閒分區鏈
空閒分區表:每個空閒分區對應一個表項
空閒分區鏈:每個分區的起始部分和末尾部分分別設置前向指針和後向指針
當很多個空閒分區都能滿足需求的時候,應該選擇哪個分區進行分配呢?
把一個新作業裝入內存的時候,需要按照一定的動態分區分配算法,從空閒分區表(空閒分區鏈)中選出一個分區分配給該作業。
如何進行分區的分配與回收操作?
分配:
在上面的圖示中,假如我們把一個4mb進程分配在了20MB處的話,我們只需要修改分區大小和起始地址即可
假如我們分配在了4MB處的話,狀態由空閒變爲忙碌,則該行應該被刪除,假如用空閒分區鏈的話,就把該節點刪除
回收:
假設一開始有個進程佔據了14MB處(10+4),跑完了需要回收,回收區的後面/前面有一個相鄰的空閒分區,那麼就合併
假如回收區的前、後各由一個相鄰的空閒分區的話
例:在20和10mb中間有一個4mb的進程需要進行回收
假如回收區的前後都沒有相鄰的空閒分區的話
假設有一個進程佔滿了14mb的地方,此進程需要被回收
內部碎片,外部碎片
爲了解決上述出現的 產生很多外部碎片 這個問題,我們衍生出了新的與之相對的算法:最壞適應算法
我們每次算法講到最後一個都是綜合類的算法,結合了前面算法的特點綜合的算法
不例外,我們這次也一樣:臨近時應算法
回想我們之前所學的,進程在內存中連續存放的時候,OS是如何實現邏輯地址到物理地址的轉換的呢?
是通過重定位寄存器去保存 裝入模塊存放的 起始位置 + 目標內存單元相對於起始位置的偏移量
我們就能得到該在物理地址(絕對地址)中,我們的目標存放的地址了,同理,我們把這種思想轉移到了分頁技術中地址的轉換
以下面爲例:
爲了方便計算頁號、業內偏移量,頁面大小一般取2的整數冪,那麼接下來我們就來看看這種情況是什麼樣子的
紅色部分前20位,表示了是第幾頁;(這的前值的是從左往右數,如果嚴格按照二進制來說應該是後20位
後面12位是偏移值(這的前值的是從左往右數,如果嚴格按照二進制來說應該是前12位
加入我們知道了N號頁在內存中的起始地址(假設爲X),那麼我就知道我們已知的邏輯地址所對應的物理地址了
分頁存儲管理的邏輯地質結構由:頁內偏移量和頁號組成
若由K位表示頁內偏移量,說明系統中一個頁面大小是2^K個內存單元
若由M位表示頁號,說明系統中,一個進程最多允許2^M個頁面
上述我們有個遺留問題,我們如何知道頁號對應頁面 在 內存中的起始地址呢?
其實是通過頁表知道的,下面看看什麼是頁表
一個進程對應一張頁表
進程的每一頁對應一個頁表項
每個頁表項由【頁號】和【塊號】組成
頁表記錄進程頁面和實際存放的內存塊之間的對應關係
每個頁表項的長度是相同的,頁號是隱含的
這句話是說明意思呢?意思是說 我們能夠通過頁表存放的起始地址和頁表項長度,就可以找到各頁號所對應的頁表存放的位置
(頁面大小爲2的整數冪)
設頁面大小爲L,邏輯地址A到物理地址E的變換過程:
計算頁號P和頁內偏移量W(以十進制爲例:**頁號P = 邏輯地址A / 頁面大小L ;頁內偏移量W = 邏輯地址A % 頁面大小L ** 但計算機實際運行的時候,邏輯地址結構是固定不變的,因此計算機硬件可以更快得到二進制表示的頁號和頁內偏移量)
比較頁號P和頁表長度M,如果P>=M,就產生越界中斷,否則繼續執行 (爲什麼等號也會算作越界中斷呢?因爲頁號是從0開始的,而頁表長度至少是1,因此P = M也會中斷哦 類似於數組越界)
頁表中頁表P對應的頁表項地址 = 頁表起始地址F + 頁號P * 頁表項長度;取出該頁表項內容b,即爲內存塊號。
頁表長度:指的是這個頁表中總共有幾個頁表項,就是有多少頁
頁表項長度:指的是每個頁表項佔據了多大的存儲空間
頁面大小:一個頁面佔多大的存儲空間
計算物理地址E = 內存塊號b * 頁面大小L + 頁內偏移量W ,用得到的物理地址E去訪存
說了那麼多,感覺是不是雲裏霧裏的,知道了一堆名詞,計算方式,但真正計算的時候仍然不會用?下面就來一道例題去實踐一下
內存保護可採取兩種辦法
方法一:在CPU種設置一對上、下限寄存器,寄存進程的上、下限地址。進程的指令要訪問某個地址的時候,CPU檢查是否越界
方法二:採用重定位寄存器(基址寄存器)和界地址寄存器(限長寄存器)進行越界檢查。其中,重定位寄存器中存放的是進程的起始物理地址,界地址寄存器中存放的是進程的最大邏輯地址。
覆蓋是子啊同一個進程或程序中的
思想:將程序分爲多個段(多個模塊),常用的段常駐內存,不常用的段在需要的時候才調入內存
內存分爲一個固定去和若干個覆蓋區
需要常駐內存的段放在固定區中,調入後就不再調出
不常用的段放在覆蓋區,需要用的時候調入內存,用不到的時候調出內存
交換是在不同進程(作業)之間的
設計思想:內存空間緊張的時候,系統將內存中某些進程暫時換出外存,把外存中某些已具備運行條件的進程換入內存(進程在內存與磁盤間動態調度)
這種技術其實在上面的處理機調度一節層次調度中的中級調度我們也有了解過了
暫時換出外存等待的進程狀態爲掛起狀態(掛起態)
掛起態可以細分爲就緒掛起和阻塞掛起兩種狀態 - 複習下7態模型吧
下面思考三個問題
應該在外存(磁盤)的什麼位置保存被換出的進程?
答:具有兌換功能的操作系統中,通常把磁盤空間分爲文件區和對換區兩部分;
文件區主要用於存放文件,主要追求存儲空間的利用率,因此對文件區空間的管理採用離散分配方式
對換區空間只佔磁盤空間的小部分,被換出的進程數據就存放在對換區,由於對換的速度直接影響到系統的整體速度,因此對換區空間的管理主要追求換入換出速度,因此通常採用連續分配方式
對換區的I/O速度比文件區的更快
什麼時候應該交換?
答:交換通常在許多進程運行且內存吃緊時進行,而系統負荷降低就暫停。例如:在發現許多進程運行時經常發生缺頁,就說明內存緊張,此時可以換出一些進程;如果缺頁率明顯下降,就可以暫停換出。
應該換出哪些進程?
越界
內存保護可採取兩種辦法
覆蓋是子啊同一個進程或程序中的
思想:將程序分爲多個段(多個模塊),常用的段常駐內存,不常用的段在需要的時候才調入內存
內存分爲一個固定去和若干個覆蓋區
需要常駐內存的段放在固定區中,調入後就不再調出
不常用的段放在覆蓋區,需要用的時候調入內存,用不到的時候調出內存
交換是在不同進程(作業)之間的
設計思想:內存空間緊張的時候,系統將內存中某些進程暫時換出外存,把外存中某些已具備運行條件的進程換入內存(進程在內存與磁盤間動態調度)
這種技術其實在上面的處理機調度一節層次調度中的中級調度我們也有了解過了
暫時換出外存等待的進程狀態爲掛起狀態(掛起態)
掛起態可以細分爲就緒掛起和阻塞掛起兩種狀態 - 複習下7態模型吧
下面思考三個問題
應該在外存(磁盤)的什麼位置保存被換出的進程?
答:具有兌換功能的操作系統中,通常把磁盤空間分爲文件區和對換區兩部分;
文件區主要用於存放文件,主要追求存儲空間的利用率,因此對文件區空間的管理採用離散分配方式
對換區空間只佔磁盤空間的小部分,被換出的進程數據就存放在對換區,由於對換的速度直接影響到系統的整體速度,因此對換區空間的管理主要追求換入換出速度,因此通常採用連續分配方式
對換區的I/O速度比文件區的更快
什麼時候應該交換?
答:交換通常在許多進程運行且內存吃緊時進行,而系統負荷降低就暫停。例如:在發現許多進程運行時經常發生缺頁,就說明內存緊張,此時可以換出一些進程;如果缺頁率明顯下降,就可以暫停換出。
應該換出哪些進程?