作業系統一遍過

2022-02-09 21:18:55 字數 4551 閱讀 7644

寫一點os的基礎知識,面試中持續更新...

基基礎知識

1.計算機硬體:輸入/輸出裝置,儲存器,運算器,控制器。

2.三種基本os型別

批處理os:單道批處理(cpu利用率低),多道批處理(缺乏互動性)

分時os:時間片輪轉分配;

實時os:及時響應,高可靠性

3.最基本特徵:併發和共享

4. 並行與併發:並行:真正意義上的同時執行,而併發還是乙個接乙個的執行,在一段時間內得到時間片輪轉進行執行,一段時間後執行完畢,巨集觀上並行。

程序&執行緒相關

1. 概念:程式在乙個資料集合上的一次執行過程,是os資源分配的基本單位;

2. 動態、併發、獨立、非同步,乙個程式可以包含多個程序;

3. 組成:程式、資料、pcb(識別符號、狀態-阻塞、就緒、執行)、優先順序、cpu現場保護區、家族聯絡(父子自之間的關係)、占有資源的清單

4. 狀態:就緒阻塞和執行,三個佇列。當就緒狀態發生程序排程是,進入執行狀態,執行狀態請求資源(比如io操作)無法滿足是發生阻塞,被丟入阻塞佇列,當資源被滿足時完成功能後進入就緒狀態;

5. 核心態和使用者態:核心態擁有搞特權,可以執行所有指令,訪問所有暫存器和儲存區;使用者態低特權,只能訪問部分儲存區,執行部分指令。

6.建立:一般使用fork()函式建立子程序,要注意殭屍程序的出現,如何解決?在unp中有說明:使用訊號函式signal捕獲sigchld訊號,使用相應函式處理(使用waitpid)。

7.執行緒:os進行排程的基本單位,同意程序內的所有縣城共享程序的記憶體空間(資源),他們只擁有自己的程式計數器、棧和少量暫存器。

8. 建立:pthread_create(tid, 函式,引數)

程序執行緒的不同:

9.1. 排程的基本單位和資源分配的基本單位;

9.2. 是否擁有資源:程序擁有,執行緒只擁有少量暫存器和程式計數器還有棧;

9.3. 開銷:建立開銷,程序要涉及分配記憶體空間,所以要比執行緒慢,撤銷也類似;特別的切換開銷,程序的現場保護要比執行緒複雜,程序要切換記憶體空間,然後切換棧和相關寄存 器,而執行緒只需要後面的步驟,不需要切換記憶體空間,所以快。(unp說執行緒建立可能要比程序快10~100倍)。

9.4. 通訊:程序間由於記憶體空間隔離,所以要跨記憶體空間來通訊(使用管道,訊息佇列,共享記憶體,訊號量,socket套接字),而執行緒通過全域性便來個就可進進行通訊。

9.5.適用場景:多執行緒適用於多機,而多執行緒適用於多核;

10.程序間通訊(ipc)

管道:匿名管道和命名管道,匿名管道只能用於具有親緣關係的程序之間,而命名管道可以用於一般的程序之間;linux標頭檔案

訊息佇列:建立訊息佇列,乙個程序去讀,另乙個去寫;標頭檔案:,mq_open()和mq_clos();

共享記憶體:最快的一種ipc方式,為什麼快?因為他直接將程序的程序空間對映到要使用的記憶體空間中,這樣就避免了其他方式中的與核心緩衝區互動的時間開銷。(其他的方式一般都是將設局寫入程序緩衝區,而後進入核心緩衝區,然後另乙個程序再從核心緩衝區中將資料讀到自己的程序緩衝區中)

socket:一種可以實現遠端程序通訊的一種方式。linux標頭檔案

(tcp/udp各有程式設計正規化)

11.程序同步:

互斥鎖:pthread_mutex_t,pthread_mutex_lock/trylock/unlock

讀寫鎖:讀鎖和寫鎖,讀鎖共享,寫鎖互斥。和資料庫的讀寫鎖類似。

訊號量:sem_open()/wait/trywait(),例項就是作業系統都做過的生產者消費者這問題

條件變數:pthread_cond_t signal()和wait()函式,通常和互斥量一起使用。

記錄鎖:對記錄上鎖,典型例子時檔案鎖。

12. 作業排程演算法

12.1 先來先服務fcfs:就是先來的(在就緒佇列頭部的)先排程執行,後面的統統等著。(這讓我想起了今早上宿舍中一舍友上廁所上了半個小時...我也很急,但又不能搶占資源...無奈的我只得尋找另一台主機,成為他的乙個臨時程序)

12.2 短作業優先sjf:就是短的先執行。對長作業非常不友好,導致長作業「飢餓」。

12.3 優先順序排程psa:為作業確定優先順序,從後備佇列中選取優先順序高的裝入記憶體。

12.4 高響應比優先:每次選取響應比較高的作業裝入記憶體(響應比:(等待時間+執行時間)/等待時間),這種演算法考慮了等待時間的因素。

13. 死鎖

一組程序佇列中,每個程序都等待其他程序所持有的資源,造成迴圈等待的局面。

4個條件:互斥條件、請求與保持、不可剝奪、環路條件

如何預防:從234條件下手,請求需要先釋放、可以高優先順序剝奪、為每一類資源進行編號,請求高的需要先釋放低的。

如何避免:銀行家演算法,搞清需求,進行預分配,判斷是否能找到乙個安全狀態。

如何檢測:資源分配圖能否完全化簡;

如何解決:1.終止程序(全部終止;按照次序終止,直到死鎖狀態解除);2. 付出代價最小的解除演算法

(這裡我又想起了,innodb儲存引擎處理死鎖的方法:rollback持有最多互斥鎖的事務)

14. 虛擬儲存器

在我看來,虛擬儲存器並未從實際上擴充物理記憶體。而是通過換頁技術「看起來像是」擴充了物理記憶體。用到的原理涉及時間區域性性和空間區域性性。

在執行初始,只把必要的程式裝入記憶體頁,執行時如果發生缺頁再進行缺頁置換,置換的演算法著名的有lru(最近最少使用演算法),原理是使用過的程式和資料,很有可能會在一段時間後繼續訪問。

這樣就可以將乙個非常大的軟體或程式執行起來,只不過是換頁技術在其作用而已。

15. 物理記憶體與虛擬記憶體

物理記憶體對應於實體地址,虛擬記憶體對應於邏輯位址,它們之間存在乙個對映關係。

1. cpu訪問乙個邏輯位址時,需要將邏輯位址分解成為乙個組號和組內位址;根據組號去查位址轉換表,確定該組資訊是否在記憶體中;

2. 如果該組號已經在記憶體(主存)中,那麼從位址轉換表中讀出對應的物理組號;並根據物理組號和組內邏輯位址,訪問必要的資訊;

3. 如果該組號不在記憶體中,那麼發生缺頁中斷,需要將儲存在磁碟(輔存)上的資訊讀入記憶體中,如果有空閒頁,直接讀入,否則需要選定頁置換出記憶體,再把需要的資訊換入記憶體中,並更新位址轉換表。

缺頁置換的演算法

1.隨機演算法:生成乙個隨機數,來確定將那一頁換出記憶體;

2.先進先出演算法:將最先進入的頁換出;

3.最近最少使用演算法:替換最近最不常使用的頁;lru

4.最優演算法:替換最長時間以後才使用的頁面(乙個理想演算法)。

16。程式編譯的過程

17.靜態鏈結和動態鏈結的比較

1. 靜態鏈結庫需要裝配入可執行檔案中,而動態鏈結庫不需要;

2. 靜態鏈結庫函式直接在可執行檔案中你,所以執行速度快;而動態鏈結庫,則是需要臨時去庫中尋找,所以執行速度稍慢;

3. 靜態鏈結導致可執行檔案臃腫,而使用動態鏈結庫的可執行檔案清爽,節約儲存空間;

4. 此外靜態鏈結庫還存在重複裝配的問題(#ifndef之流就是來解決他這類問題的),動態鏈結庫不存在此問題;

5. 靜態鏈結庫更新和擴充套件麻煩(已經鏈結入可執行檔案了),需要重新編譯軟體,而使用動態鏈結庫,只需要替換動態鏈結庫檔案即可。

18.虛擬記憶體

作業系統對於記憶體(主存)的一種管理方式。作業系統給每乙個程序都分配位址空間,但此位址空間是虛擬記憶體空間,通常比其所對應的物理空間要大許多。

當cpu要訪問某資料時,生成乙個邏輯位址,然後用邏輯位址去查「頁表」,頁表上儲存著所有儲存在記憶體和磁碟上的資料的位址,頁表每一條記錄都至少有兩個表項,乙個是有效位,另乙個是實體地址或者是磁碟位址。如果發現有效位置1,那麼證明資料在物理記憶體中(dram命中),根據另乙個表項上的實體地址去物理記憶體中查詢讀取即可。如果,有效位置0,那麼資料不在物理記憶體上(未命中,發生缺頁異常)。這時,需要將磁碟上的資料載入到物理記憶體中來。如果物理記憶體有空閒頁,那麼直接讀進來即可,然後更新頁表即可,然後重新查詢頁表,去讀取需要的資料。如果,物理記憶體頁都被占用,那麼需要「頁面置換」,採用「先進先出,lru,理想方法」等方法可以將合適的頁面調換出物理記憶體,而將磁碟上的資料頁換到記憶體中來,同樣更新頁表,重新查詢讀取資料。

(圖源baidu)

作業系統第一遍

前言 有了兩次自考的經歷了,第三次自考就覺得不是那麼的慌,方法也是了然於心了,恩恩了解但是放在心中了!努力在運用啦 正文作業系統概論雖然有需要理解的計算機的東西,但是大部分還是需要去記憶的東西,都是為以後的飛打基礎,基礎紮實了,以後的專案才好運用的。所以這一科要好好地學習。畫思維導圖的六大原則 一....

作業系統概論第一遍總結(三)

思維導圖 作業系統概論共六章,總結為兩部分。第一部分為概念,第二部分為功能。概念 概念無非可以用3w1h來總結。what 作業系統是什麼?where 發生地的介紹 how 現狀是怎樣發展的?階段性是怎樣發展的?核心概念是什麼?程序和作業系統的關係?功能 功能將456三章概括的說了。每一章從細節講述了...

MySQL中索引一遍過

mysql中ddl的操作方法 mysql中的dml操作 點了五根煙,終於把mysql中查詢操作 dql 搞懂了!mysql中資料完整性徹底解析 mysql多表查詢一遍打通 mysql中子查詢看不明白?那就得好好練 一些我們在mysql中常用的函式 讓我們來聊聊mysql中的許可權操作 mysql中關...