參考:
1、操作系統的四個特性
並發:同一段時間內多個程序執行(與並行區分,並行指的是同一時刻有多個事件,多處理器系統可以使程序並行執行)
共享:系統中的資源可以被內存中多個並發執行的進線程共同使用
虛擬:通過分時復用(如分時系統)以及空分復用(如虛擬內存)技術把一個物理實體虛擬為多個
異步:系統進程用一種走走停停的方式執行,(並不是一下子走完),進程什么時候以怎樣的速度向前推進是不可預知的
2、多線程相較單線程的好處
3、使用多線程的可能帶來的問題
4、知道多線程和多進程的區別嗎?各自有什么優點呢
多進程優點:
1、每個進程互相獨立,不影響主程序的穩定性,子進程崩潰沒關系;
2、通過增加CPU,可以容易得擴充性能;
3、可以盡量減少線程加鎖/解鎖操作,極大提高性能,就算是線程運行的模塊算法效率低也沒關系;
多進程缺點:
1、邏輯控制復雜,需要和主程序交互;
2、多進程調度開銷比較大,需要跨進程邊界,如果有大數據量傳送,就不太好,適合小數據量傳送、密集運算 ;
多線程的優點:
1、程序邏輯和控制方式簡單;
2、擁有資源少,線程調度開銷小,無需跨進程邊界;
3、同一個進程的所有線程可以直接共享內存和變量;
4、因為cpu調度的粒度更細,所以cpu利用率更高
多線程缺點:
1、線程之間的同步和加鎖控制比較麻煩;
2、一個線程的崩潰可能影響到整個程序的穩定性;因為線程沒有地址空間,它只是一個進程的執行路徑,進程是比較健壯的。
3、到達一定的線程數程度后,即使再增加CPU也無法提高性能,,而且線程多了之后,線程本身的調度也需要消耗較多的CPU
進程和線程的區別:
1. 基本單位:進程是分配資源的基本單位,而線程是獨立運行和獨立調度的基本單位。也就是說 進程不能執行,真正執行的是進程里的線程。
2. 健壯性:進程有獨立的地址空間,有獨立的資源,子進程崩潰不會對主進程造成影響;而線程沒有自己的地址空間,只是進程的一個執行路徑,所以一個線程的崩潰可能會影響整個進程的穩定性。
3. 調度開銷:進程因為擁有的資源多,所以調度開銷大,線程的調度開銷小。
5、線程與協程的區別
協程
線程和協程的區別:
2、線程是協程的資源。協程通過 可以關聯任意線程或線程池的執行器(Interceptor)來間接使用線程的資源的。
協程相較於多線程的優勢:
6、什么是死鎖,產生死鎖的四個條件,怎么避免死鎖
四個條件:
- 互斥條件:該資源任意一個時刻只由一個線程占用。
- 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
- 不剝奪條件:線程已獲得的資源在末使用完之前不能被其他線程強行剝奪,只有自己使用完畢后才釋放資源。
- 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系
如何避免:
我們只要破壞產生死鎖的四個條件中的其中一個就可以了。
破壞互斥條件
這個條件我們沒有辦法破壞,因為我們用鎖本來就是想讓他們互斥的(臨界資源需要互斥訪問)。
破壞請求與保持條件
一次性申請所有的資源。
破壞不剝奪條件(Synchronized無法破壞這個條件,所以引入了ReetrantLock)
占用部分資源的線程進一步申請其他資源時,如果申請不到,可以主動釋放它占有的資源。
破壞循環等待條件
靠按序申請資源來預防。按某一順序申請資源,釋放資源則反序釋放。破壞循環等待條件。
7、虛擬內存+內存分頁
虛擬內存
Linux下,進程不能直接讀寫內存物理地址,只能訪問【虛擬內存地址】 操作系統會把 虛擬內存地址-->物理地址 虛擬內存解決 有限的內存空間加載較大的應用程序 根據需要在內存和磁盤之間來回傳送數據 通過段頁表的形式,虛擬內存中取一段連續的內存空間映射到主內存中,主內存空間的程序段可以不連續
缺頁異常
進程在訪問某個虛擬內存地址時, 操作系統翻譯虛擬內存地址兩種{ 1. 沒有缺頁,獲取到內存物理地址 2. 磁盤,發生缺頁異常。 進程中斷,讀取磁盤內的對應頁進入內存。進程進入就緒狀態 }
內存分頁
若按照【字節】為單位,進行 虛擬內存和物理內存的映射,【內存空間不足以存儲這么多映射關系】 因此linux提出【內存分頁】,以每頁4kb為單位進行映射 使得內存中的記錄變為原先的四千分之一 虛擬內存地址{ 1. 前20位 【頁編號】 2. 后12位 【偏移量】 }
8、基本分頁儲存管理方式
把主存空間划分為大小相等且固定的頁,作為主存的基本單位,每個進程也以頁為單位進行划分,進程執行時,以頁為單位逐個申請主存中的葉空間。用頁表記錄分散的內存分布情況。
頁表:
用來記錄邏輯地址和實際存儲地址之間的映射關系,以實現從頁號到物理塊號的映射。
訪問分頁系統中內存數據需要兩次內存訪問,一次從內存中訪問頁表,找到實際物理地址,第二次根據得到的物理地址訪問指定的內存塊。
邏輯空間->頁表->物理空間
快表機制:
可以說是存儲在寄存器中的頁表,功能和頁表一樣,也是提供一個邏輯地址到物理地址的映射關系,但是它的容量更小,查詢速度也更快。所以快表中存儲的是訪問最頻繁的那些頁,訪問內存數據的時候先在快表里查詢,如果查到了就可以直接讀取相應的物理塊號,如果沒找到再訪問頁表,得到物理地址並訪問,同時把該頁表中的該映射項添加到快表中
兩級頁表或多級頁表
9、基本分段儲存管理方式
分段管理:每個段內部連續內存分配,但段與段之間是離散的,因此會用到段表,記錄每段在內存中的起始地址和該段長度。
段表可以放在內存或寄存器中。
10、分頁和分段的比較
頁是信息的物理單位,是出於系統內存利用率的角度提出的離散分配機制;
段是信息的邏輯單位,每個段存儲一段意義完整的信息,是出於用戶角度提出的內存管理機制
頁的大小是固定的,由系統決定;
段的大小是不確定的,由用戶決定
頁面置換算法
為什么要頁面置換:
因為應用程序是分多次裝入內存的,所以運行到一定的時間,一定會發生缺頁。地址映射的過程中,如果頁面中發現要訪問的頁面不在內存中,會產生缺頁中斷。此時操作系統必須在內存里選擇一個頁面把他移出內存,為即將調入的頁面讓出空間。選擇淘汰哪一頁的規則就是頁面置換算法
分類:
最佳置換算法(理想):將當前頁面中在未來最長時間內不會被訪問的頁置換出去
先進先出:淘汰最早調入的頁面
最近最久未使用 LRU:每個頁面有一個t來記錄上次頁面被訪問直到現在,每次置換時置換t值最大的頁面(用寄存器或棧實現)
時鍾算法clock(也被稱為最近未使用算法NRU):頁面設置訪問為,將頁面鏈接為一個環形列表,每個頁有一個訪問位0/1, 1表示又一次獲救的機會,下次循環指針指向它時可以免除此次置換,但是會把訪問位置為0, 代表他下次如果碰到循環指針就該被置換了。頁面被訪問的時候訪問位設為1。頁面置換的時候,如果當前指針的訪問位為0,置換,否則將這個值置為0,循環直到遇到訪問位為0的頁面。
改進型Clock算法:在clock算法的基礎上添加一個修改位,優先替換訪問位和修改位都是0的頁面,其次替換訪問位為0修改位為1的頁面。
最少使用算法LFU:設置寄存器記錄頁面被訪問次數,每次置換當前訪問次數最少的
11、操作系統中進程和線程的同步和通信機制
進程間的通信方式
信號:編寫自己的信號響應函數或者調用系統的信號響應函數做出相應的響應
匿名管道(半雙工,讀寫端固定,只能父子進程通信,管道文件內存中)
有名管道(FIFO):(任何進程通信,順序寫入,服務器監視FIFO文件,讀出清除)
消息隊列(異步通信機制,存放在內核中並由消息隊列標識符標識,消息含隊列ID支持隨機讀取,獨立於發送、接收進程 進程終止時消息不清空)
信號量(本質是計數器,實現進程【同步互斥】,PV原子性操作),用來控制多個進程對資源的訪問,它通常作為一種鎖機制。
共享內存區(直接對【內存】讀取,通過信號量實現多線程安全)
socket(創建套接字,然后綁定一個端口,監聽套接字,可以通過網絡連接不同計算機上的進程進行通信)
12、線程有哪些狀態?
13、Java 中用到的線程調度
搶占式調度:
協同式調度:
JVM 的線程調度實現(搶占式調度)
14、進程調度的算法
先來先服務、短作業優先;優先權(搶占式,非搶占式、高響應比);時間片輪轉、多級反饋隊列
優先級調度算法
高優先權優先調度算法
基於時間片的輪轉調度算法
多級反饋隊列調度算法
15、用戶態和核心態
內核態:cpu可以訪問內存的所有數據,包括外圍設備,例如硬盤,網卡,cpu也可以將自己從一個程序切換到另一個程序。
用戶態:只能受限的訪問內存,且不允許訪問外圍設備,占用cpu的能力被剝奪,cpu資源可以被其他程序獲取。
最大的區別就是權限不同,在運行在用戶態下的程序不能直接訪問操作系統內核數據結構和程序。
指令分為 特權指令和非特權指令 其中 特權指令必須在核心態執行,如 啟動IO /內存清零 /修改程序狀態字 內核速度快但是資源有限,能控制的進程數不多,所以需要速度少慢一些的用戶態協助 內核調度、非內核調度
為什么要有這兩態:
內核速度快但是資源有限,能控制的進程數不多,所以需要速度慢一些的用戶態協助,但是為了避免用戶態被惡意利用,所以限制了用戶態程序的權限。
需要限制不同的程序之間的訪問能力,防止他們獲取別的程序的內存數據,或者獲取外圍設備的數據,並發送到網絡,CPU划分出兩個權限等級 -- 用戶態和內核態。
什么時候轉換
1、系統調用:
用戶進程主動發起的。用戶態進程通過系統調用申請使用操作系統提供的服務程序完成工作,比如fork()就是執行一個創建新進程的系統調用
用戶程序使用系統調用,系統調用會轉換為內核態並調用操作系統
2、發生異常:
會從當前運行進程切換到處理次此異常的內核相關程序中
用戶接口程序(GUI或shell)
GUI,Graphical User Interface,圖形用戶界面,帶有圖形界面的操作系統;基於文本、命令行的叫shell,處於用戶態中,位於用戶態的最底層,允許用戶運行其他程序(而操作系統運行在內核態中)