筆記目錄:
- 操作系統(tǒng)結(jié)構(gòu)
- 進(jìn)程管理
- 線程
- CPU調(diào)度
- 死鎖
- 內(nèi)存管理
操作系統(tǒng)結(jié)構(gòu)
- 為了保證穩(wěn)定和安全倡缠,應(yīng)用程序和操作系統(tǒng)內(nèi)核之間通過系統(tǒng)調(diào)用接口實現(xiàn)通信胳岂,應(yīng)用程序不能直接操縱內(nèi)核的信息桶唐。
中斷服務(wù)程序一定是操作系統(tǒng)編寫的族沃。
一般很少用到的系統(tǒng)程序渠牲,如系統(tǒng)分區(qū)旋炒,磁盤碎片整理,磁盤快照签杈。系統(tǒng)級的功能有系統(tǒng)級的程序來完成瘫镇,這部分程序普通的用戶不常用,一般由系統(tǒng)管理員用芹壕。
功能和需求以及硬件和工作的環(huán)境 決定操作系統(tǒng)的結(jié)構(gòu)汇四。
操作系統(tǒng)的簡單結(jié)構(gòu)
聚內(nèi)核(無結(jié)構(gòu)內(nèi)核)
UNIX的系統(tǒng)構(gòu)造-內(nèi)核部分無結(jié)構(gòu)
微內(nèi)核
MINIX3的結(jié)構(gòu)
LINUX的誕生:
Torvalds在閱讀了他當(dāng)時操作系統(tǒng)老師寫的MINIX操作系統(tǒng)后,完成了LINUX系統(tǒng)踢涌,但是他的老師覺得他寫的LINUX一團(tuán)糟通孽,因為他認(rèn)為LINUX仍然沒有擺脫UNIX的設(shè)計范疇,仍然使用大內(nèi)核睁壁。后來他的老師提出了微內(nèi)核
的概念背苦,并在MINIX3系統(tǒng)中實現(xiàn)。
內(nèi)核做盡量少的事情潘明,把更多的任務(wù)放到用戶空間(如磁盤操作等)行剂。(效率問題是微內(nèi)核的死穴)
Solaris System
運用了面向?qū)ο蟮乃枷耄瑢⒋疟P操作钳降,文件讀寫等功能仍然放在內(nèi)核部分厚宰,但劃分了不同的模塊。
混合結(jié)構(gòu)-MacOS
MacOS系統(tǒng)有兩個內(nèi)核遂填,一個BSD內(nèi)核(聚內(nèi)核)铲觉,一個Mach內(nèi)核(微內(nèi)核)。
虛擬機結(jié)構(gòu)
未來虛擬機的結(jié)構(gòu):
硬件之上直接是虛擬機吓坚,虛擬機上面再分各種內(nèi)核撵幽。
進(jìn)程管理
計算機系統(tǒng)在啟動后,會進(jìn)入兩種模式礁击,一個叫用戶模式盐杂,一個叫內(nèi)核模式逗载。用戶程序在用戶模式下運行,不能隨意讀寫任意內(nèi)存链烈。
系統(tǒng)引導(dǎo)
計算機通了電之后都經(jīng)歷了哪些事情厉斟?
- (加電自檢)當(dāng)我們按下開機鍵之后,首先BIOS會加電自檢(Power On Self Test -post)强衡。BIOS執(zhí)行內(nèi)存地址為FFFF:0000H處的跳轉(zhuǎn)指令捏膨,跳轉(zhuǎn)到固化在ROM中的自檢程序,對系統(tǒng)硬件(顯卡食侮,CPU及硬盤号涯、內(nèi)存、光驅(qū)信息锯七,主板信息)進(jìn)行檢查链快。
- (磁盤引導(dǎo))自檢完成后,ROM BIOS會按照系統(tǒng)CMOS設(shè)置中的啟動順序搜索裝有操作系統(tǒng)的磁盤驅(qū)動器眉尸。(ps:從磁盤加載操作系統(tǒng)的原因有二:一是操作系統(tǒng)升級簡單容易域蜗,二是使用戶擁有選擇操作系統(tǒng)的自由。)BIOS將相應(yīng)啟動設(shè)備的第一個扇區(qū)(MBR扇區(qū)(存儲著磁盤分區(qū)等信息噪猾,大小固定為512字節(jié)))讀入內(nèi)存地址為
0000:7C00H
霉祸。 - (執(zhí)行MBR程序)檢查0000:7DFEH-0000:7DFFH(MBR的結(jié)束標(biāo)志位)是否等于55AAH,若不等于則轉(zhuǎn)去嘗試其他啟動設(shè)備袱蜡,如果沒有啟動設(shè)備滿足要求則顯示"NO ROM BASIC"然后死機丝蹭。
- 當(dāng)檢測到有啟動設(shè)備滿足要求后,BIOS將控制權(quán)交給相應(yīng)啟動設(shè)備坪蚁。啟動設(shè)備的MBR將自己復(fù)制到0000:0600H處, 然后繼續(xù)執(zhí)行奔穿。
- 根據(jù)MBR中的引導(dǎo)代碼啟動引導(dǎo)程序。
- 此時的機器才是真正意義上的計算機敏晤。
當(dāng)操作系統(tǒng)內(nèi)核被加載贱田,開始運行內(nèi)核時,就不是boot的內(nèi)容了嘴脾。
加載操作系統(tǒng)的程序叫bootstrap
男摧。
在計算機的ROM(計算機主板ROM芯片)里會有一段引導(dǎo)的初始程序。計算機在加電后最先運行的程序就是存放在ROM中的引導(dǎo)程序译打。
百度百科:
BIOS(Basic Input Output System)耗拓。是個人電腦啟動時加載的第一個軟件。它是一組固化到計算機內(nèi)主板上的一個ROM芯片上的程序扶平。它保存著計算機最重要的基本輸入輸出程序帆离,開機后自檢程序和系統(tǒng)自啟動程序蔬蕊,它可以從CMOS中讀寫系統(tǒng)設(shè)置的具體信息结澄。其主要功能是為計算機提供最底層的哥谷、最直接的硬件設(shè)置和控制。此外麻献,BIOS還向作業(yè)系統(tǒng)提供一些系統(tǒng)參數(shù)们妥。系統(tǒng)硬件的變化是由BIOS隱藏,程序使用BIOS功能而不是直接控制硬件∶阄牵現(xiàn)代作業(yè)系統(tǒng)會忽略BIOS提供的抽象層并直接控制硬件組件监婶。
BIOS中主要存放:
- 自診斷程序:通過讀取CMOSRAM中的內(nèi)容識別硬件配置,并對其進(jìn)行自檢和初始化齿桃;
- CMOS設(shè)置程序:引導(dǎo)過程中惑惶,用特殊熱鍵啟動,進(jìn)行設(shè)置后短纵,存入CMOS RAM中带污;
- 系統(tǒng)自舉裝載程序:在自檢成功后將磁盤相對0道0扇區(qū)上的引導(dǎo)程序裝入內(nèi)存,讓其運行以裝入DOS系統(tǒng)香到;
- 主要I/O設(shè)備的驅(qū)動程序和中斷服務(wù):由于BIOS直接和系統(tǒng)硬件資源打交道鱼冀,因此總是針對某一類型的硬件系統(tǒng),而各種硬件系統(tǒng)又各有不同悠就,所以存在各種不同種類的BIOS千绪,隨著硬件技術(shù)的發(fā)展,同一種BIOS也先后出現(xiàn)了不同的版本梗脾,新版本的BIOS比起老版本來說荸型,功能更強。
CMOS(Complementary Metal Oxide Semiconductor)互補金屬氧化物半導(dǎo)體炸茧。CMOS是主板上一塊可讀寫的RAM芯片帆疟,用于保存當(dāng)前系統(tǒng)的硬件配置信息和用戶設(shè)定的某些參數(shù)。CMOS RAM由主板上的鈕扣電池供電宇立,即使系統(tǒng)斷電信息也不會丟失踪宠。對CMOS中各項參數(shù)的設(shè)定和更新可通過開機時特定的按鍵實現(xiàn)(一般是Del鍵)。進(jìn)入BIOS設(shè)置程序可對CMOS進(jìn)行設(shè)置妈嘹。一般CMOS設(shè)置習(xí)慣上也被叫做BIOS設(shè)置柳琢。有時人們會把CMOS和BIOS混稱,其實CMOS是主板上的一塊可讀寫的并行或串行FLASH芯片润脸,是用來保存BIOS的硬件配置和用戶對某些參數(shù)的設(shè)定柬脸。
參考: 磁盤引導(dǎo)程序原理及簡介
進(jìn)程的定義
簡單來說,運行起來的程序叫進(jìn)程毙驯。
進(jìn)程在內(nèi)存中:
進(jìn)程的幾個狀態(tài):
進(jìn)程各個狀態(tài)轉(zhuǎn)換圖:
- 處于
running
態(tài)的進(jìn)程擁有CPU - 當(dāng)處于
running
態(tài)的進(jìn)程需要等待I/O操作或者等待某個點擊事件后才能進(jìn)行下一步操作倒堕,則此時會進(jìn)入waiting
態(tài),讓出CPU爆价。 - 當(dāng)處于
waiting
態(tài)的進(jìn)程獲得點擊事件或者I/O資源時垦巴,則會進(jìn)入ready
態(tài)媳搪。 - 處于
ready
態(tài)的進(jìn)程獲得CPU后,便會運行起來骤宣,進(jìn)入running
態(tài)秦爆。
PCB
操作系統(tǒng)通過PCB來控制進(jìn)程的狀態(tài)。
進(jìn)程的切換:
系統(tǒng)切換進(jìn)程有兩種方式:中斷和系統(tǒng)調(diào)用
中斷的作用就是CPU暫時停止當(dāng)前程序的執(zhí)行轉(zhuǎn)而執(zhí)行處理新情況憔披。
比如等限,當(dāng)一個進(jìn)程運行了比較長的時間,操作系統(tǒng)會發(fā)出一個中斷信號(如通過晶振發(fā)出)芬膝,這時CPU會暫停當(dāng)前進(jìn)程的執(zhí)行望门,來到操作系統(tǒng)中的代碼塊,此時操作系統(tǒng)占有CPU锰霜,操作系統(tǒng)利用CPU將當(dāng)前進(jìn)程的狀態(tài)置為ready
怒允,切換到其他進(jìn)程的執(zhí)行。
操作系統(tǒng)進(jìn)入到等待態(tài)是應(yīng)用程序主動通過一些操作進(jìn)入到等待態(tài):
而running
態(tài)的到waiting
態(tài)的進(jìn)程狀態(tài)切換锈遥,則是通過當(dāng)前進(jìn)程通過主動發(fā)起系統(tǒng)調(diào)用纫事,將CPU的使用權(quán)轉(zhuǎn)給操作系統(tǒng),再由操作系統(tǒng)改變進(jìn)程的狀態(tài)所灸。
PCB表的組織形式:
丽惶??下面這一塊不太懂
進(jìn)程間的協(xié)作:獨立與合作
進(jìn)程合作的優(yōu)點:
-
信息共享
計算速度加快
-
進(jìn)程間的通信方式:消息傳遞和共享內(nèi)存
消息傳遞效率更高爬立。因為共享內(nèi)存的方式會進(jìn)行大量的系統(tǒng)調(diào)用钾唬。
阻塞方式指的是,在該進(jìn)程沒得到自己所需資源時侠驯,就會被阻塞抡秆,被置為waiting
態(tài)。
接收方不拿走這個消息就會被丟棄
會被緩存一會吟策,收的慢的情況下也會丟失
沒有限制
線程
線程的下面這些資源是獨享的儒士,每個線程會有自己:
- 線程ID
- 程序計數(shù)器 (存放下一條指令的地址)
- 寄存器集
-
棧 (記錄程序的執(zhí)行路徑)
其他的進(jìn)程的大部分資源會被線程們共享。
單線程與多線程:單線程只有一條執(zhí)行路線檩坚。多線程有各自的執(zhí)行路線着撩。
為什么要創(chuàng)建多線程,而不是選擇創(chuàng)建多進(jìn)程匾委。(比如把耗時的操作拖叙,fork一個進(jìn)程放到里面):
多線程的好處是資源共享(協(xié)作起來更方便),經(jīng)濟(jì)實惠赂乐。進(jìn)程與進(jìn)程之間是完全分隔的薯鳍,不共享(也可以共享,但比較麻煩)挨措,進(jìn)程的創(chuàng)建挖滤,銷毀崩溪,切換開銷都大于線程。
線程分為用戶級線程和內(nèi)核級線程:
用戶級線程指的是壶辜,一個程序在自己內(nèi)部模擬出多個線程,比如担租,保存當(dāng)前正在執(zhí)行的線程的數(shù)據(jù)現(xiàn)場砸民,切換到另一個現(xiàn)場,繼續(xù)執(zhí)行奋救,這樣模擬出了多線程岭参。
用戶級線程的優(yōu)點:
用戶級線程的優(yōu)點:
而且用戶級線程還有一個缺點,就是當(dāng)模擬出多個線程中的一個發(fā)生系統(tǒng)級的阻塞時尝艘,該程序的所有(模擬出的)線程都將被阻塞演侯。因為在系統(tǒng)看來,它就是一個線程背亥。
結(jié)束線程:
- 直接強制殺死秒际。(會造成一些難以預(yù)料的錯誤,比如該保存的資料沒保存)
- 告訴線程該退出了狡汉。設(shè)置個退出條件娄徊,達(dá)到條件自己主動退出。
總結(jié)
各個進(jìn)程之間是完全獨立的
線程模型不穩(wěn)定盾戴,任何一個線程出問題寄锐,導(dǎo)致整個進(jìn)程的崩潰
從安全角度看,線程的安全性比進(jìn)程的安全性差
進(jìn)程與線程的區(qū)別:
- 進(jìn)程絕對隔離尖啡,線程完全共享
- 進(jìn)程效率低橄仆,線程效率高
CPU調(diào)度
調(diào)度的目的是最大限度的利用CPU。
CPU和I/O交替進(jìn)行:
有些進(jìn)程利用CPU比較多,有些利用I/O比較多:
CPU調(diào)度發(fā)生的情形:
CPU調(diào)度分為搶占式和非搶占式:
分配CPU(恢復(fù)上次運行狀態(tài)等處理既绩,效率靠硬件來決定):
恢復(fù)上次運行狀態(tài)
從系統(tǒng)態(tài)切換到用戶態(tài)
切換完成后跳轉(zhuǎn)到正確的地址開始執(zhí)行:
調(diào)度進(jìn)程和分配資源所花費的時間:
調(diào)度準(zhǔn)則:1.最大化利用CPU
調(diào)度準(zhǔn)則:2.大的吞吐量(單位時間運行的進(jìn)程數(shù)量)
調(diào)度準(zhǔn)則:3.盡可能小的周轉(zhuǎn)時間(從創(chuàng)建到結(jié)束一共經(jīng)過多久wall time(周轉(zhuǎn)時間))
調(diào)度準(zhǔn)則:4.盡可能小的等待時間(在就緒隊列等待時間)
調(diào)度準(zhǔn)則:5.盡可能小的響應(yīng)時間 (接收一個事件到處理該事件經(jīng)過的時間)
先來先服務(wù):
最短作業(yè)優(yōu)先:
兩種調(diào)度模式:
-
非搶占式和搶占式
最短剩余時間優(yōu)先:
優(yōu)先級調(diào)度(一種實現(xiàn)策略)
優(yōu)先級調(diào)度可能會導(dǎo)致優(yōu)先級低的進(jìn)程被餓死跪腹。
Round Robin(時間片輪轉(zhuǎn))
如果時間片太大,就變成了先來先服務(wù)
如果時間片太小椎扬,各個進(jìn)程就會被頻繁切換,進(jìn)程切換時比較耗時間的(保存當(dāng)前進(jìn)程的現(xiàn)場具温,調(diào)度算法決定下次調(diào)用哪個進(jìn)程)
將時間片輪轉(zhuǎn)和優(yōu)先級結(jié)合進(jìn)行調(diào)度:
多級隊列(將隊列分為不同的優(yōu)先級)
系統(tǒng)進(jìn)程應(yīng)該處于最高的優(yōu)先級隊列中(I/O綁定的進(jìn)程:用CPU的時間比較短蚕涤,大部分在時間用來I/O)
在隊列之間進(jìn)行調(diào)度:
固定隊列的優(yōu)先級(有可能發(fā)生饑餓):
為了降低饑餓發(fā)生的概率,在具有優(yōu)先級的隊列之間采用時間片:
現(xiàn)在操作系統(tǒng)中大多采用多級反饋隊列調(diào)度算法:
優(yōu)先級從上到下依次降低
進(jìn)程第一次運行時铣猩,都被放在優(yōu)先級最高的隊列中(quantum=8(分配的時間片)的隊列)揖铜,根據(jù)該進(jìn)程運行的狀況將其移到響應(yīng)的隊列中。如:當(dāng)進(jìn)程第一次被運行時达皿,先被放到上圖quantum=8的隊列中(優(yōu)先級從上到下依次降低)天吓,當(dāng)給該隊列分配的8個時間片全被該進(jìn)行消耗完的情況下贿肩,將該進(jìn)程移到下一個優(yōu)先級較低的隊列中;在quantum=16的隊列中時龄寞,給該隊列分配的16個時間片又全被該進(jìn)程消耗完汰规,則將其移到下一個優(yōu)先級較低的隊列。
多核處理器:
多處理器面臨的問題:
對稱多處理器:
所有處理器共享同一個就緒隊列(會存在一個問題物邑,當(dāng)進(jìn)程從一個CPU被切到另一個CPU時溜哮,會導(dǎo)致Cache刷新,有性能損耗)
CPU的親和性:(可將某個進(jìn)程與某個特定的CPU綁定)
防止兩個進(jìn)程同時訪問臨界區(qū)的方法1:
關(guān)了中斷后就不會進(jìn)行進(jìn)程切換色解,當(dāng)一個進(jìn)程進(jìn)入臨界區(qū)后關(guān)中斷
死循環(huán)等待消耗CPU茂嗓,造成性能損耗。這種方式也稱為自旋鎖科阎。
哲學(xué)家就餐問題的另外一種解決方案:
給每個就餐的哲學(xué)家按順序編號述吸,奇數(shù)號的哲學(xué)家第一次只能拿左邊的筷子,偶數(shù)號哲學(xué)家第一次只能拿右邊的筷子锣笨。這樣便可以保證至少有一個哲學(xué)家可以拿到兩只筷子蝌矛。
不死鎖:
死鎖:
不死鎖:
死鎖的四個條件:
- 互斥
- 保持和等待
- 不可剝奪
- 循環(huán)等待(我要你的,你要他的错英,他要我的)
解決死鎖:
- 預(yù)防死鎖
- 避免死鎖
- 死鎖的檢測和恢復(fù)
- 鴕鳥算法(死鎖裝作沒看見)(讓軟件開發(fā)者自己去解決)