操作系統總結

操作系統

操作系統

 

系統調用(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. 虛擬地址、邏輯地址、線性地址、物理地址的區別。

推薦書籍:《深入理解現代操作系統》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章