歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> 操作系統學習-1-操作系統概論及存儲器管理

操作系統學習-1-操作系統概論及存儲器管理

日期:2017/3/1 12:08:13   编辑:關於Linux

!:什麼是操作系統?
操作系統沒有一個完整、精確、公認的定義,因為操作系統是一個復雜的系統軟件,其外沿或邊界不是很清楚。但是可以從功能的角度對其進行定義,從功能的角度來說的話,可以分為對內和對外,對外即對應用程序:對應用程序來說,操作系統是一個控制軟件:能夠管理應用程序,包括對應用程序的啟動、中斷、掛起、殺死等,並且能夠為應用程序提供各種各樣的服務,譬如:網卡服務,聲卡服務,io服務等。對內即對硬件資源:對硬件資源來說,操作系統是一個資源管理軟件:能夠協調的為各種應用程序分配相應的資源,這些資源包括:CPU資源,內存資源,各種外設資源等。
!:軟件的分類?
軟件可以分為應用軟件和系統軟件,常見的應用軟件如辦公軟件,影音娛樂軟件等。系統軟件分為兩種:工具類系統軟件,如編譯器,動態程序庫等;操作系統軟件,如kernel,shell等(題外話:kernel主要是對計算機硬件資源的管理,那其中主要是哪三大部分管理呢?CPU資源管理、內存資源管理、硬盤資源管理。這三部分在操作系統層面分別抽象為:進程管理、地址空間管理和文件管理)
!:操作系統(內核)的特征?
並發性(區別於並行,並發是指一段時間內有多個進程在運行,並行是指在某一個時間點上有多個進程在運行,一般呢,在CPU一個單核心內部是並發,在一個CPU的多個核心中進程的執行是並行的)
共享姓(表面上看起來是多個程序『同時』訪問硬件資源,而實際上是互斥共享的,即對於互斥資源來說,某個時間點只能有一個進程在訪問資源,譬如內存資源的訪問:對於整個內存資源來說是並行訪問的,但是對於內存中某一個最小粒度的內存單元來說,是互斥訪問的)
虛擬性(利用多道程序設計技術,使每個用戶(進程/程序)都覺得這個計算機好像單獨為他服務)
異步性(程序的執行不是一貫到底的,而是走走停停,向前推進的速度不可預知,但是只要程序運行的操作系統環境相同,OS需要保證程序運行的結果相同)
!:學習操作系統應該注意的問題?
當前的許多課本或者教學內容存在一定的老化性,許多之前需要操作系統管理的內容,現在已經差不多不用考慮了,譬如進程調度、磁盤IO管理等,課本的知識是滯後於我們當前硬件發展的,課本上講的很重要的問題,現在已經不那麼重要了
!:一條雞湯~
我聽過的我會忘記
我看過的我會記住
只有我做過的我才能理解
!:操作系統家族?
Unix家族:Mac OS等
Linux家族:Ubuntu,Fedora,andriod等
Windows家族:Windows 10,WPH等
其他操作系統:工控領域,自動化領域,大型機操作系統等
===============================================================================
!:操作系統的啟動?
當你摁下電源的時候,會進行接下來的一系列操作:
BIOS(Basic Input/Output System)加電自檢(檢查各種硬件設備是否能正常工作,譬如檢查顯卡在不在啊什麼的)
設備檢查正常後,由BIOS加載bootloader(用來加載OS)到內存中
由bootloader將OS從硬盤加載至內存,CPU的控制權交給OS
系統啟動
!:什麼是系統調用?
所謂系統調用,即是應用程序向操作系統發出的服務請求,具體就是應用程序向操作系統發出的一條操作指令(操作系統對底層硬件的訪問進行了封裝,並提供了對外訪問的接口,那這些接口API就是系統調用API,通常在這些系統調用API之上還有一層更好層次的API,應用程序是通過訪問這更高層次的API(譬如Windows的win32 API,POSIX API用於POSIX-based System(包括Unix,Linux,Mac OS X的所有版本等)),來實現系統調用的)
!:什麼是異常?
所謂異常,即是應用程序產生的意想不到的指令導致發生了錯誤,譬如非法指令或者其他壞的處理狀態(如:內存出錯)等,不得不由操作系統出面處理的場景
!:什麼是中斷?
所謂中斷,(中斷來源於外設,有待商榷)即是需要時,CPU停止當前程序的執行轉而去執行或處理新情況的過程
!:為什麼應用程序被設計稱為不能直接訪問硬件系統的?
首先是出於安全的考慮,對於計算機硬件來說,操作系統是可以被信任的,而第三方的應用程序是不被信任的,這些應用程序可能會去惡意破壞計算機的軟硬件系統
再者是出於應用程序開發方便的考慮,如果讓應用程序直接訪問硬件,會額外的增加應用程序的開發和維護成本,如果建立在操作系統之上,則會大大減少開發成本,因為操作系統已經對底層硬件做了很好的封裝,應用程序只需調用系統調用,請求操作系統服務即可
!:操作系統如何處理中斷和異常呢?
操作系統內部維護了一個處理中斷和異常的表,操作系統為每個中斷和異常都編了號,這張表的key是這些號碼,Value是處理中斷和異常的服務程序的起始地址,發生中斷時,直接查表,然後由響應的中斷處理程序進行處理即可
中斷的處理過程詳細如下(中斷的過程對用戶來說是透明的):
*設置中斷標記:將內部或外部事件設置中斷標記,並get到中斷的ID
*保存當前的處理狀態:程序的執行進度(下一條指令的地址),相關寄存器內容
*根據中斷ID查表,找到中斷處理程序,處理中斷
*清除中斷標記
*恢復之前保存好的處理現場,繼續程序的執行
異常的處理過程如下:
*get到異常ID
*保存當前處理狀態:程序的執行進度(即下一條指令地址),相關寄存器內容
*異常處理:要麼殺死異常的程序、要麼重新執行剛才的指令
*恢復現場,並且繼續中斷錢程序的執行
!:操作系統軟件結構?
內核:)系統調用:)高層API:)
系統調用是對內核服務的封裝,高層API是對系統調用API的封裝
通常,應用程序通過使用高層API來實現系統調用,但是也可以直接訪問系統調用API,也可以直接訪問內核,只不過後兩種在應用程序中占很少一部分
!:什麼是用戶態和內核態?
用戶態:應用程序掌握CPU執行權的狀態,這種狀態下,其執行權比較低,譬如不能直接訪問IO,也不能執行一些特權指令,比如掛起一個進程什麼的
內核態:操作系統內核掌握CPU執行權的狀態,這種狀態下,CPU可以執行任何指令,因為其具有所有執行權
應用程序通過系統調用可以實現CPU從用戶態到內核態的轉變
一個應用程序執行一個函數調用要比執行一次系統調用的性能要高:因為執行一個函數調用是在程序當前堆棧中完成的,而執行系統調用,需要切換到內核堆棧,並且還要完成特權級的轉換,即要從用戶態轉換成內核態,切換堆棧和特權級是需要很大開銷的,所以性能比起一般函數調用要略低的。
=============================================================================
!:內存的層次結構?
(寄存器::L1高速緩存::L2高速緩存)::L3高速緩存::內存::磁盤
從前到後,訪問速度依次降低
從前到後,單位存儲單元造價依次降低
!:地址空間?
物理地址空間:直接和硬件相對應,即硬件所能支持的地址空間,譬如內存條所支持的內存大小
邏輯地址空間:一個運行程序所擁有的地址范圍,在程序看來,地址空間就是一個一維的線性地址空間
!:邏輯地址的生成?
(在C程序中,變量引用就是一塊地址空間的引用;到了匯編程序中,地址扔以一種人能看得懂但是更接近機器語言的英文標志符表示;到了機器語言中,地址就真的編程邏輯地址了,是看不出來變量名稱或者什麼的)
對於C程序來說,編譯並生成可執行文件之後,在可執行文件中,就生成了邏輯地址
這裡的邏輯地址是保存在硬盤上的,整個生成過程是不需要操作系統參與的
!:物理地址的生成?
在CPU中有一個叫MMU(Memory Management Unit)的區域,用於將邏輯地址轉換成物理地址,具體過程如下:
1.CPU的ALU(arithmatic and logic unit)要執行一條指令,需要拿到這個地址的內容,那CPU就要發出指令從內存中取出這條指令,取的時候帶的參數就是這條指令的邏輯地址
2.CPU的MMU組件就從自己的維護的映射表中查找是否有現成的映射關系,如果有直接去取,如果沒有,就去內存中找
3.從邏輯地址定位到物理地址的轉換規則是由操作系統維護的,在內存中找到這條指令後,返回給CPU
4.CPU取出這條指令,然後執行
!:操作系統如何保證運行程序之間內存空間的相對獨立性?
操作系統為每個程序設置了邏輯地址空間的基址和界限,在CPU根據邏輯地址去內存中找指令時,操作系統會對邏輯地址進行檢驗,如果超過了為這個程序設定的界限,則是非法訪問了內存,不允許
!:連續物理內存分配(使用連續內存分配有很多問題,是一開始設計計算機的時候用的,現在使用的並不多,那這個過程中產生的問題可能有其他的解決方法,也可能還了其他內存分配機制後,就沒有這樣或那樣的問題了)
1.內存碎片問題
*即內存中不能被利用的地址空間
*內部碎片:在分配單元中未被使用的內存
*外部碎片:在分配單元間未被使用的內存
2.分配策略
*首次適配:為了分配n個字節,使用第一個(從零地址往下找)可用的空閒塊(這個空閒快比n個字節要大)(容易產生大量外空間塊)
*最優適配:為了分配n個字節,從內存中未分配的空閒塊中找出和n個字節大小相差最小的空閒塊進行分配(容易產生幾乎不可用的空間塊)
*最差適配:為了分配n個字節,從內存中找到一個跟要分配內存大小差距最大的一個內存塊進行分配(破壞了大空閒塊以致大分區無法被分配)
(並不是這裡的3個算法哪個更好,這裡只是簡單的內存分配,程序分配需要大的塊也需要小的塊,談不上最優)
3.壓縮式與交換式碎片整理
*壓縮式(compact)
*就是通過已分配內存塊的挪動(重置)來使未分配的內存塊放到一起
*問題
1.什麼時候進行重置
*不能在程序運行的時候進行挪操作,可以在程序阻塞,等待,掛起的時候挪
2.內存重置開銷大不大呢
*內存拷貝的開銷還是很大的
*交換式(swap)
*就是搶占等待的程序,回收他們的內存——把他們從內存挪到硬盤,數據並沒有丟失,只是從內存挪到硬盤了
1.選擇哪一個程序換出呢(對於連續內存分配來說,換入換出的單位是程序,不是程序片段)
2.什麼時候進行換入換出
3.換入換出的開銷
(這些問題都是使用連續物理內存分配要解決的,有的還沒找到好的解決方式時,這種分配方式已經過時了)
=============================================================================
!:非連續內存分配
0.為什麼使用非連續內存分配
因為使用連續的內存分配總是不可避免的產生碎片問題從而降低了內存的利用率,使用非連續的內存分配就能避免這一問題產生
非連續內存分配的優點:
*更好的內存利用率
*允許代碼和數據共享
*支持動態加載和動態連接
非連續內存分配的缺點:
*缺點就是分配管理本身,所謂管理就是如果把邏輯地址轉化成物理地址
*使用軟件的解決方法開銷很大,因為對於每一條指令都要使用軟件進行映射,開銷太大啦
*常見的硬件解決方案有:分段和分頁
1.分段
*分段尋址方案(根據應用程序的運行特點進行分割,是有意義的分割)
1.程序中邏輯地址本身是連續的,但我們可以根據程序運行的特點對邏輯地址進行分段,譬如把邏輯地址分為:堆、運行棧、程序數據、程序txt段(庫、用戶代碼),然後把這些段分別放到不同的物理地址區域中(這就是分段映射了),以不同的操作方式的權限進行操作
2.如何進行分段映射呢?
1.在編寫和編譯應用程序的時候,內存被抽象為了一維的邏輯地址,當程序加載到內存的時候,不同的段已經映射到不同的物理內存塊中了,一個段對應一個內存塊
2.程序訪問物理內存需要一個2維的二元組(段號,段內偏移),邏輯地址就分成了兩部分,即段號和段內偏移
3.有兩種具體的實現:段寄存器+地址寄存器(X86)、單地址
4.一條邏輯地址怎麼轉化成物理地址呢?邏輯地址有兩部分組成:段號+偏移。首先,根據段號去查段表(由操作系統維護,①邏輯地址段號和物理地址塊的對應關系,即這個段號對應的內存快的起始地址②不同的段長度大小不同,這個信息也是放到段表裡面的),然後看一下偏移地址是否超出了該段的限制,內存訪問異常,正常的話是段表對應物理地址起始地址加上偏移地址得該條邏輯地址對應的物理地址
5.段表在程序運行之前就應該由操作系統建立好,怎麼建跟硬件有很強的聯系(知道到這就行了)
*現在用的還是比較少的,主要的還是分頁機制
2.分頁
*分頁尋址方案(頁的大小不變,而且是沒有意義的切割)
1.分頁和分段一樣,都需要一個頁號(段號)和頁內偏移(段內偏移)
2.如果進行頁映射呢?
1.對邏輯地址空間和物理地址空間進行分頁,分頁的大小一樣,都是2的冪次方
2.邏輯頁(Page)和物理頁(Frame:頁幀):物理地址被分為相同大小的內存塊,一個物理地址由兩部分組成:幀號和幀內偏移
3.那一條邏輯地址如何轉換成物理地址呢?物理地址=2的S次方*f+o,其中:S為頁幀的比特位數,f是幀號,o為頁內偏移
4.OK,頁內偏移和幀內偏移是一樣的,關鍵是邏輯地址中的頁號和幀號不一定相同,這就需要一個頁表了,建立起邏輯頁號和物理頁幀的對應關系
5.頁表是由操作系統建立維護的,每個運行的程序都有一個頁表
6.邏輯地址分的頁是連續的,映射到物理頁幀的時可能不連續了就:不是所有的頁在一開始就有對應的頁幀,畢竟邏輯地址空間可以大於物理地址空間
3.頁表(PageTable)
*頁表概述
1.每個運行的程序都有一個頁表,而且頁表是動態變化的,邏輯地址中頁號想要找到其對應的物理地址幀號,需要兩個東西:頁表基地址(存放在頁表基地址寄存器中,存兩部分內容,一個是頁表基址,一個是頁表長度)、頁號
2.每個頁表相當於一個大數組,索引是頁號,值是幀號
3.不是所有的頁號都對應一個頁幀號
4.頁表是位於內存上的,所以,每次尋址都要訪問兩次內存
問題:
1.頁表可能會很大,因為越發展可用的地址空間越大,如果每頁1024字節,一個64位機器的頁表內存都放不下呀
2.訪問效率問題:頁表是放到內存中的,一次尋址都要訪問兩次內存
如何處理這些問題呢?
1.(解決效率問題)可以通過緩存,把常用的頁表對應關系緩存到離CPU較近的地方,先找緩存,緩存沒有了再找實際的頁表
2.(解決空間問題)間接訪問,可以把大的空間拆分成較小的空間
*快表(TLB(Translation Look-aside Buffer):轉換後備緩沖區位於CPU的MMU單元)
1.要緩存的內容就是頁表中的內容
2.先在TLB中找頁幀號,如果找到了就直接去內存中尋址訪問,如果沒找到,不得不查頁表,尋址後並且把頁表更新到TLB中
3.由於程序的運行具有空間和時間的局部性,快表中頁表被miss掉的可能性在10%左右
*二級、多級頁表(犧牲時間換空間,犧牲的時間又可以通過TLB來緩解)
*其實無論使用二級還是多級頁表,都只是對大頁表進行了拆分,減少了大頁表占據連續的大的內存空間的可能性,而本身並不能緩解大頁表占據大內存的情景,能想到的避免大的頁表占據大的內存的策略就是不一下子把程序的全部頁表都加載到內存,即使用虛擬內存的技術
*二級頁表
1.將邏輯地址段再拆分,分為三段:一級頁表段+二級頁表段+段內偏移,根據一級頁表段查看一級頁表(存放的是對應二級頁表的基址),根據二級頁表段查看實際對應的內存頁幀號,然後這個頁幀號加上對應的幀內(頁內)偏移就是實際的物理地址
*多級頁表
1.二級頁表推廣出去就行,也是將邏輯地址再分,和二級頁表很像,只是換成多級頁表了
*反向頁表(整個系統只有一個頁表)
*不讓頁表和邏輯地址空間大小相對應,而和物理地址空間相對應(邏輯地址空間的增長速度大於物理地址空間的增長速度)
*所謂反向是指:通常的頁表是用邏輯地址的頁號去索引物理地址的頁幀號,也就是頁表是和邏輯地址相關聯的;而反向是使用物理地址的頁幀號去索引邏輯地址的頁號,那這個頁表就只和物理地址的大小有關了,不會因邏輯地址空間很大而導致了占據很大內存的大頁表
*問題也很明顯,如何去根據邏輯地址查找對應的物理地址呢?
有很多中實現方案,但是,比較好的方案是『基於哈希的查找方案』,實現是:定義一個哈希函數,輸入為Page Number輸出為Frame Number
=============================================================================
!:虛擬內存技術
1.起因
程序規模的增長速度遠大於存儲器容量的增長速度
*要讓更多的程序運行在有限的硬件內存上
*要讓更大的程序運行在有限的硬件內存上
*所以就把硬盤的一部分當成虛擬內存,程序運行的時候,並不把程序的全部內容加載到內存中,只把部分的要用的加載,等用到的時候,沒有了再從硬盤加載
2.覆蓋技術(虛存技術產生之前)
*如果程序太大,超過了內存的容量,可以采用手動覆蓋(Overlay)的技術,只把需要的指令和數據保存到內存當中,這裡的手動是指需要程序員編寫程序的時候自己處理內存的管理
*根據程序運行時函數之間的調用關系來對程序進行拆分,相互之間沒有調用關系的分開,當然有一個程序是常駐內存的,用來管理這個覆蓋技術,可以把函數之間的調用關系使用一棵樹的形式表示出來,然後同一級別的樹位於同一覆蓋區(回想以下老師上課講的例子)
*問題:
1.程序員在編寫程序的時候多了額外的考慮和負擔(主要)
2.覆蓋本身的開銷
3.交換技術(虛存技術產生之前)
*如果程序太多,超過了內存的容量,可以采用自動交換(Swapping)技術,把暫時不運行的程序送到外存中去,由操作系統完成,但是成本很高,因為每次換入換出都是整個程序(主要問題就是交換的粒度太大:整個程序 )
*這種技術是早期Unix使用的
*和交換式的連續內存分配一樣有相似的問題:
1.什麼時候進行交換?
2.交換的策略:換誰進來,換誰出去?
*整個過程由操作系統完成,對程序員是透明的
4.虛存技術
*工作情況
基於程序的局部性原理,程序運行時沒有必要把程序的全部內容加載到內存,只需把程序當前運行所需的部分片段裝入內存即可,其余部分留在硬盤上。
程序運行時,如果他索要訪問的頁(段)已經在內存了,OK,繼續執行下去,如果沒有,就會產生一個缺頁中斷,由OS把請求頁(段)調入內存,如果內存已滿,則使用特定的頁(段)置換策略,換出一部分頁(段)出來,再將所需頁(段)加載到內存,重新執行被中斷的指令,以使程序繼續運行
*程序的局部性原理
時間局部性:如果一條指令被執行了,則不久以後該條指令可能會再次執行,如果某個數據被訪問了,則不久以後,該條數據可能會在被訪問
空間局部性:一旦程序訪問了某個存儲單元,則其附近的存儲單元在不久之後也將被訪問
*基本特征
1.內存變大了(加上了硬盤呀)
2.部分交換
3.空間本身的不連續性
*虛擬頁式內存管理
1.大多數的虛擬內存管理系統都采用了頁式存儲管理技術。即在頁式存儲管理的基礎上增加了請求調頁和頁面置換的功能
2.跟一般的頁表相比,頁表表項增加了一些東西,以滿足虛擬內存的實現,譬如增加了駐留位:表示該頁是在內存則為1在外存則為0;保護位(不是1位):讀寫保護位;修改位:該頁是否被修改過;訪問位:該頁是否被訪問過(用於置換算法)
*局部頁面置換算法
1.最優頁面置換算法(OPT:Optimal Page Transfer)
由Belady提出
要換出的頁面是將永久不使用的或者將來最長時間內不會使用的。
是一種理論上的算法,因為將來哪些頁面將被調入是無法預知的,但是可以用來評價其他頁面置換算法。
2.先進先出算法(FIFO:First In First Out)
要換出的頁面是最早進入內存的頁面,即在內存中駐留時間最久的頁面要被淘汰。
最簡單,但是缺頁率略高,因為這種置換是沒有實際意義的,完全是按照時間來的,並沒有考慮到程序運行時的動態特征
3.最近最久未使用算法(LRU,Least Recently Used)
要換出的頁面是最近最少使用的頁面。對於內存中的每個頁面,都設置一個訪問字段,用來記錄自上次訪問之後所經歷的時間T,當要淘汰一個頁面時,選擇T最大的頁面淘汰。
雖然算法較好,但是支持該算法所需要的硬件支持也很多,實現起來比較麻煩,成本較高。在實際應用中使用的是近似LRU算法,而Clock算法就是一個近似LRU算法。
4.時鐘頁面置換算法(Clock)
這裡的Clock並不是輪詢的意思,二是在查找置換頁面的時候像一個鐘表
首先為每個頁面添加一個訪問位,再將所有的頁面通過鏈接指針連成一個循環隊列,當某頁被訪問的時候,該頁的訪問位設置為1(硬件完成的,當然也可以用軟件實現);置換算法在這個循環隊列中使用FIFO的方式選擇要換出的頁面,如果該頁面的訪問位是0,直接換出,如果是1,置為0並且接著往下找
對於時鐘頁面置換算法,有一個其增強的算法即增強時鐘頁面置換算法(又叫二分機會法)
這樣使髒頁總能在一次時鐘掃描中留下來,在時鐘頁面置換的基礎上又利用了dirty bit(修改位)位,其置換策略為:
\
為什麼要使髒頁先留一下,對於非髒頁(沒有被修改的頁)直接釋放就行,不用寫回硬盤,對於髒頁,還要寫會硬盤,成本較高
5.最不常用算法(LFU:Least Frequently Used)
為每個頁面記錄一段時間內被訪問的頻率,要換出的是訪問頻率最低的頁面,可以使用和LRU一樣的一套硬件來實現LFU,同樣實現成本較高。
問題很多,首先使用最不常用來淘汰頁面本身就有點問題
6.Belady現象
FIFO算法出現的現象
操作系統為每個程序分配的可用物理內存往往是小於程序運行所需的邏輯地址空間的,使用虛擬內存技術運行改程序,在程序運行的過程中肯定會產生缺頁中斷,通常來說呢,分配給該程序的可用物理內存越大,缺頁率應該越低,而Belady現象指的是對於某些頁面置換算法而言,被分配的物理內存大了,缺頁率也跟著變大的現象
7.抖動現象
產生原因:由於系統中運行的進程太多,導致進程在運行的時候大部分時間用於頁面的換入/換出,而無法做一些實際有效的工作,導致CPU的利用率急劇下降到很低並趨於0的狀況,這種狀況稱為『抖動』
8.LRU、FIFO和Clock的比較
LRU和FIFO本質上都是先進先出的策略,只是LRU考慮了程序的動態運行特征,對於程序中訪問的到的頁面,從棧中取出來重新放到棧頂,而FIFO則沒有按照程序的運行進行動態的調整
而Clock算法是對LRU的近似
如果程序沒有很好的局部性訪問特征,Clock和LRU都可能退化成FIFO算法
*全局頁面置換算法
工作集模型
(背景知識:根據程序運行的局部性原理,程序在運行期間其對頁面的訪問是不均勻的,不同段的時間內可能集中在不同的幾個頁面內)
所謂工作集:是指在某段時間間隔內,進程運行實際要訪問的頁面的集合。
工作集頁置換算法
雖然程序需要少量的幾頁就能運行,但是為了較少的產生缺頁,將程序的全部工作集裝入內存,然而我們並不知道未來將要訪問到工作集到底是哪些頁面,只能根據最近的時間內的行為作為未來時間內行為的近似了
具體就是因為工作集窗口隨著運行時間在向後平移,OK,那平移之後不在工作集中的頁要換出去,然而並不是因為內存不夠用了,而是因為不在工作集了,內存可能還很夠用
缺頁率置換算法
缺頁率=缺頁次數/訪問總數
缺頁率高的時候增加工作集的長度,缺頁率低的時候減少工作集的長度
OK,怎麼增加怎麼減少呢?
1.首先設定一個初始的窗口的大小
2.缺頁率是一個區間的值
3.可以設定這樣一個值,如果兩次缺頁中斷中間訪問的次數大於該值,表示缺頁率較低了,這時候要減少工作集的長度,減少的頁是在這個區間中沒有被訪問到的頁;如果兩次中斷中間隔得訪問次數的間隔小於該值,表示缺頁率略高,要擴容,就把缺的頁加到當前工作集中

Copyright © Linux教程網 All Rights Reserved