操作系統
操作系統
系統調用(API接口)
內核,用戶
中斷服務程序一定是操作系統編寫的
內核分類:
微內核
聚內核
內核中再分(面向對象內核)
混合結構:Macos
虛擬機結構
系統的引導過程:BIOS——>BOOT
room
進程管理:
進程控制塊PCB:結構體
進程絕對隔離,線程完全共享
進程效率低,線程效率高
CPU調度:
CPU-IO突發:
進程分類:
CPU綁定的進程,IO綁定的進程
調度:
進程運行-》等待
等待-》就緒
就緒-》運行
退出
搶佔式:非自願的(主流),通用操作系統
非搶佔式:自願的,嵌入式
分配:
恢復狀態(切換上下文),切換到用戶狀態,找到合適的位置
分配消耗時間由硬件決定
調度的評價指標:
CPU的利用率,吞吐率,週轉時間(進程的所有時間),等待時間,響應時間。
CPU的利用率,吞吐率:評價整個系統
週轉時間(進程的所有時間),等待時間,響應時間:針對進程,一般採取平均值
優先級調度:多級隊列:同一個隊列中的優先級相同
常用的數據結構:多級反饋隊列——>現在的操作系統常用的處理方式
反饋的實現:基本的策略:所有線程先放在最高優先級,當CPU用的較多的時候優先級下降。動態判斷,當從等待狀態變爲準備狀態時,優先級就會上升一點。一般IO綁定的再高優先級。
多核CPU:每一個核心同時只能運行一個進程
特點:負載均衡
核心需均衡:進程遷移,刷新cpu cache
進程的同步:當同時訪問共享的數據時,有可能破壞數據。
生產者-消費者問題
進程的切換是隨機的,即在一條CPU指令執行完畢之後都會有可能進行中斷響應(進程切換)。
解決辦法要求:
競爭條件——>臨界區:一段代碼對共享的數據進行了訪問,那這段代碼就是臨界區
解決的辦法:對臨界區的保護,在任意時刻只有一個進程可以訪問臨界區。
策略:鎖
怎麼給臨界區加鎖:
必須符合三大定律:互斥條件、進度的條件、有限等待(公平性)
終極解決辦法:硬件可以控制中斷——>關中斷(要求時間間隔短),原子硬件指令。
常見兩種指令:
Test memory word and set value:testAndSet
Swap countents of tow memory words
加鎖,性能下降
信號量:一個整數,P(),V()操作。wait,signal(原子操作)。
計數信號量:特殊:二制信號量(互斥鎖)
硬件支持:開關中斷 或 TestAndSet
實現中的問題:忙等——>自旋。解決的辦法:將其放入等待態。信號量維護了一個等待隊列,當有資源時喚醒。
Block,wakeup
經典進程通信問題:
生產者-消費者問題:緩衝區,定義三個信號量:互斥信號量(保護緩衝區),空餘緩衝區量,緩衝區中有多少個滿的
讀者-寫者問題:一些進程屬於讀者,讀不會破壞數據。一些進程屬於寫者,會破壞數據。同一時刻只能有一個寫者操作,且不能對讀者有影響(只能在沒有讀者的情況下寫)。解決:三個信號量——>讀寫者互斥信號量、
存儲:文件系統、數據庫(事務解決了讀者寫者問題)。策略:更改了指針的指向,回收舊內存
哲學家就餐問題:——>死鎖
管程:一種更高階的對臨界區進行保護的方法,實現於語言層面。
Java中的關鍵字:synchronized
Solaris實現:自適應互斥鎖(互斥鎖基本分爲迴旋鎖,非迴旋鎖)
條件變量:——>信號量的另一種表現
linux實現:開關內核的搶先式——>禁止在內核搶佔
多處理器:迴旋鎖
信號量 信號(兩者完全不同)
死鎖:
進程與資源的關係
操作系統對資源要求:
申請
使用
釋放
死鎖條件:互斥、不可剝奪、循環等待、非搶佔
資源分配圖:
解決死鎖的方法:
死鎖的阻止:策略:攻擊互斥條件——>共享
操作系統:分時、虛擬合併(例如屏幕中的窗口的覆蓋、聲卡播放多程序資源)、Spooling(緩衝池)(常用於一些穿行的設備,例如打印機)
死鎖的避免:要求的前提:在進程開始之前,要得到其對資源的要求數。
策略:釋放安全狀態,阻止非安全狀態
算法:1.資源分配圖(圖論的方法)複雜度n^2複習*、2.銀行家算法
銀行家算法:
死鎖的檢測和恢復:
週期性的執行死鎖檢測算法,出現則恢復
檢測算法:圖論/銀行家算法;實際的檢測方式:看門狗進程&喂狗進程
恢復問題:容錯技術:對於進程——>丟棄(全部丟棄&丟棄部分)
丟棄的選擇:核心:最小化代價
回滾策略:容錯技術的一種。(回滾到上次安全狀態)
鴕鳥算法(不理,假裝沒看見)基本上的操作系統都是這樣乾的
死鎖的問題都是交給開發人員解決的
內存管理:目的——>安全,高效
內存的意義:
信息隱藏:接口
可以直接訪問的:寄存器
寄存器和內存的區別:
catch:寄存器和catch存儲的是內存的鏡像
內存對進程的分配:bath和limit寄存器,進程的最小地址和地址的長度。結果:慢,解決思路:硬件解決
nop指令:什麼都不幹
多進程內存的切換:編譯時期的指令和內存的綁定問題
加載時刻:
執行時的處理:(常見使用),需要硬件支持
概念:
邏輯地址(虛擬地址/偏移地址):這個地址都是由CPU發出的地址;
物理地址:真實存在的地址
編譯時期,或加載時期使用的地址爲物理地址;
當操作系統比較強大的時候,使用虛擬地址;經過操作系統進行地址翻譯(實質使用MMU(內存管理單元)硬件設備)
bath,limit:重新定位寄存器
內存空間利用率最大化(動態鏈接)動態鏈接庫DLL(特點:容易更新):希望只加載當前會用到的代碼,而不是全部代碼(局部原理)
存根:
交換技術Swapping:在內存空間中不使用的進程交換到外存當中。
具體實現:
1.連續分配算法:現在以經很少使用了,基本思路:bath,limit,MMU。問題:如何提高內存利用率:內存碎片(內存空洞)問題
四種適應法:對於內存的使用是隨機
首次適應法:最常使用
next-fait(下次適應法):
最佳適應法:
最差適應法:每次找最大的
外部碎片:
內部碎片:
2.***頁式內存管理:物理地址非連續性,且會導致內部碎片。
將固定的物理內存劃分爲固定的物理頁面,爲2的整數次冪。對於每一個進程的內存劃分爲邏輯頁面。
頁表:
地址的處理:邏輯地址砍一刀,爲物理地址頁號,和頁內偏移量。得到物理地址。
頁表:佔據內存
頁面的大小:決定內存碎片的大小
頁表的實現:
頁表起始寄存器,頁表長度寄存器(存儲的是絕對的物理地址)
TLB:快表,硬件支持的catch,用來存儲部分頁表(局部性原理)解決了訪問一次數據需兩次訪問內存。硬件查找方式——>並行查找
程序中輸出的地址爲虛擬地址;
全局變量每次運行的地址是相同的,局部變量是不同的。(基於安全考慮的)
地址轉換的過程:
內存保護:
1.頁式管理天然支持:不同的進程有不同的頁表
2.讀寫權限保護:
段錯誤的捕捉:有效無效位;
頁是存儲的好處:共享內存的實現(fock()的實現,fork之前的代碼只是被複制了虛擬內存地址,實際指向了同一塊物理內存,私有部分指向了不同的物理地址)
fock:實現中:copy-on-write(寫時複製)
進程的地址分配:
進程的邏輯地址大小是變化的,所以頁表在設計時
計算:預留式一個頁表有多大?(數組)
頁面大小:4K=2^12
則:有2^32/2^12=2^20——>1M(因爲按2^n分配內存所以爲4M)
一個進程頁表佔4M內存
鏈表也不可以;
實際存儲方式:散列表(兩級頁表的實現(外層頁表,內層頁表(內層頁表動態增加)))導致翻譯地址時,砍兩刀
64位計算機繼續分級(三級頁表):(64位機的系統開銷大於32位機器)
或者hash表:(鏈地址解決衝突)
反表:頁表,整個系統只有一個,其邏輯地址爲:pid+虛頁號(控制64位機器與實際內存(達不到64位的理論大小)的關係)
系統請求:pid+偏移+虛頁號(三者共同構成邏輯地址)
現在的CPU只支持多級頁表;
段式內存管理:常用於16位內存管理
現代CPU常用段頁式內存管理:
linux:三層頁表結構,32位機忽略中間頁表層
虛擬內存:(黑盒的封裝)
原理:程序只有一部分需要同時在內存當中
實現方式:請求頁,請求段
有效無效位:無效位的處理(缺頁錯處理)——>操作系統判斷真的無效,還是當前不在內存當中(讀入+重置頁表),再進行相應操作
缺頁錯:p(缺頁錯概率)
寫時複製策略:
頁面置換算法:儘量減少錯頁錯
需要考慮與上次是否發生變化,未改變的置換代價特別少(髒位)
最近最少訪問的置換:實現——>(訪問位)
置換標記位不會帶來額外開銷
頁面置換:
1.先入先出(物理頁面越多,產生的缺頁錯越多;會產生大量的缺頁錯)
2.優化算法(實際中不可用,因爲無法預測下一個被訪問的頁面,但是可以作爲一個標杆存在)
3.最近最少使用算法LRU:最常用,count+clock時鐘(實現)但是效率較低,真正的實現LRU的近似算法——>週期清零計數器(只有0/1),清零算法:時鐘算法
modify/dirty位四種狀態的優先順序:(0,0)<(0,1)<(1,0)<(1,1)(最小的先置換)
實踐問題:
1.頁面緩衝:緩衝池:特點利用了系統空閒的時間,來進行家務勞動(swap)。
2.全局置換:缺點:
局部置換:
3.抖動:如果一個頁面頻繁的進行頁面置換時出現
4.局部性原理:頁面置換的核心的問題是找到所有進程當前的局部在哪裏。
5.工作集:一個進程當前包含的頁面(對於系統來說統一化管理,你要多少,給你多少,不抖動,不多給)特點:△的選擇,系統可以利用工作集總量和實際內存量關係來檢測系統健康值。
實現:時間中斷+標記位
6.缺頁錯頻率:統計出來後,動態的調整分配給進程物理頁面(現在的實現方式)
7.內存影像文件(文件訪問策略):思路:和以前的buffer類似,liunx下系統調用:mmap();實現:映像文件在磁盤上。利用的是虛擬內存;特點:也可以實現共享內存
文件管理:
文件:連續的
文件的分類:文本文件,二進制文件
文件類型:
文件結構:
虛擬化:
虛擬化技術的產生和發展:
1.傳統虛擬化:IBM公司
2.VMware
分類:
1.Full-virtualization:所有的都要轉化,沒有硬件支持
2.Para-virtualization:半虛擬化,修改windows內核
3.HardwareAssist-virtualization:硬件支持的虛擬化,性能最好的,KVM
虛擬化的硬件支持:
虛擬機磁盤管理:
虛擬磁盤格式:
Raw Disk:與物理磁盤格式;
Physical Mode:可以添加磁盤,速度最快
Vm image(VirtualBox)
VHD(VirtualPC)
VMDK(VMWare)
Qcow qcow2(qemu-kvm):自由定製的能力強
快照管理信息:
虛擬外設:
網卡,聲卡,USB設備,CD/DVD,軟驅,顯卡/Display
調度:
虛擬化:爲了解耦,硬件與軟件之間的耦合;
桌面虛擬化:
文件系統的實現:
常見文件系統:FAT32(U盤),NTFS(windows),EXT1/2/3/4,reiserFS,XFS
文件系統的特點:穩定,速度,節約空間,安全
定義:存儲在外存的數據結構
FCB:文件塊,存了文件的一切,除了具體數據
層次:應用程序——>邏輯文件系統(虛擬文件系統)——>轉化——>具體文件系統——>I/O控制——>磁盤
整體的實現:內存上,磁盤上
引導控制塊,卷,分區
磁盤上:目錄結構,文件控制塊
catch,
具體操作思路:
open()系統調用——>內核打開catch目錄(根據文件名判斷打開哪個目錄)——>磁盤上找到目錄,緩存在內存上,
讀:利用open()的返回值得到唯一標識,利用read(標識)在每個進程中打開的文件(指針指向整個系統打開的文件)中找到,然後再在整個系統打開的文件(表)中找FCB,利用FCB找到磁盤的物理位置。
分區:(分區,格式化)
分區:(原始分區)不能存文件
格式化:決定採用哪種文件格式
卷:比分區大的一個單位(常用於服務器管理)
引導:
根分區:自動引導
虛擬文件系統:(遠程文件系統)
實現:
目錄的實現:線性列表(線性鏈表):缺點:線性查找,改進:Hash表,用的最多的是B樹,B+樹
磁盤塊的分配:
塊的大小視情況而定,塊:512字節(最小單位,一個扇區的大小),塊=N*扇區大小
分配方法:
1.連續分配:每一個文件都佔用連續的磁盤空間(塊)。特點:簡單 ,FCB只需要存儲起點,長度。seek(隨機訪問)非常容易,連續訪問的性能也好。缺點:會造成空間的浪費(碎片),文件不能變化(變大)。不太常見(光盤,CDROM,只讀性,可變光盤的實現:重寫或者追加新的文件(讀的時候讀新的(重新追加的)))。
2.線性分配(鏈表):塊幾個字節存指針,其餘的存數據。特點:解決了文件的動態增長,解決了外部碎片,但是存在內部碎片。缺點:慢,尤其是隨機讀取。破壞了工程美感:2的整數次冪(因爲有幾個字節存了指針),系統處理時比較慢。可靠性差。
分配內存時存在字節對齊(內部優化:按n字節分配):
FAT32(很古老的一種):(線性分配(鏈表)改進爲文件分配表,將塊中的所有指針提取出來形成一個表),有一個備份,來提高可靠性。
3.索引式分配(iNode):每一個文件有一個iNode(數據塊,其存放的是指針,指向blocks(數據塊的位置),和頁表很像,擴容:分級方式)UNIX,linux方式(當前的主流)
iNode的數量控制:
df:linux看剩餘空間
鏈接文件的實現:
硬鏈接:只是將目錄項指向的iNode指向同一個,刪除時利用一個計數器
軟連接:
空閒空間的管理:
Bitmap位圖法:佔用額外空間,可找連續空間
鏈式管理:空閒塊的next指向下一個空閒塊,特點:不佔用額外空間,分配回收麻煩;優化:提取出來一個空閒塊存指針。
面對的問題:效率(降低文件系統額外佔用的空間),性能(降低尋道,catch的管理)
catch的管理:
同步寫:
異步寫:快,但是數據有可能出問題(斷電);
優化的策略:
free-behand
Read-ahead:預先讀取,跟磁盤的工作特性有關。
恢復:
磁盤檢測:Windows Chkdsk命令:思路比較文件分配表和空閒塊的使用情況;
備份:完全備份/增量備份
通過直接訪問磁盤來恢復;
FAT在刪除時,只是標記文件目錄項表
現在的需求:穩定,速度
基於日誌的文件系統:(日誌文件系統)提升文件的可靠性
NTFS,Ext3/4,ZFS,R
引入一個概念(Transactions)事務:實現:日誌區:每當有更改的時候將操作寫入日誌,合適的時候(系統空閒時間)執行操作後從日誌中刪除。
引入的問題:性能
SSD的缺點:每塊區域寫的次數是固定的(壽命固定)
日誌空間同步寫,合適的時間異步寫,讀:利用大catch來解決性能
具體文件系統設計結構:
CD-ROM:
FAT16:
FAT32:利用多個文件目錄項合併實現長文件名
NTFS:windows系統的使用,ADS,Quter(配額),Sparse files,
ZFS:UNIX,128位的文件系統。
大容量存儲系統:
\1. 進程和線程的區別。
\2. 死鎖的必要條件,怎麼處理死鎖。
\3. Window內存管理方式:段存儲,頁存儲,段頁存儲。
\4. 進程的幾種狀態。
\5. IPC幾種通信方式。
\6. 什麼是虛擬內存。
\7. 虛擬地址、邏輯地址、線性地址、物理地址的區別。
推薦書籍:《深入理解現代操作系統》