https://juejin.cn/post/6844903957098151950#heading-13
https://juejin.cn/post/6850037269835808782
進(jìn)程與線程分別是什么?
1、進(jìn)程是資源分配的基本單位,線程是cpu調(diào)度的基本單位
2、一個(gè)線程只能屬于一個(gè)進(jìn)程,而一個(gè)進(jìn)程可以包含多個(gè)線程
3、進(jìn)程本身就持有系統(tǒng)資源,而線程只含有維持自身活動(dòng)的必不可少的系統(tǒng)資源,本身不擁有系統(tǒng)資源。
為什么線程的調(diào)度開(kāi)銷(xiāo)比進(jìn)程???
進(jìn)程是資源的調(diào)度的基本單位,因此在創(chuàng)建或者銷(xiāo)毀進(jìn)程時(shí),系統(tǒng)都要為它分配或者回收內(nèi)存。而且在進(jìn)程切換時(shí),系統(tǒng)需要保留當(dāng)前進(jìn)程的cpu環(huán)境,并重新設(shè)置另一個(gè)進(jìn)程的cpu環(huán)境。同時(shí)對(duì)進(jìn)程的調(diào)度也是很復(fù)雜,也需要花費(fèi)大量的時(shí)間。
而線程本身不持有資源,而且同一進(jìn)程中的線程共享進(jìn)程資源,所以線程之間的通訊也更加便捷。因此相對(duì)于進(jìn)程來(lái)說(shuō),線程的調(diào)度開(kāi)銷(xiāo)比較小的,它也被稱(chēng)為“輕型進(jìn)程”。
進(jìn)程的狀態(tài)
就緒狀態(tài):進(jìn)程已經(jīng)獲得系統(tǒng)分配的資源,等待處理器執(zhí)行
運(yùn)行狀態(tài):進(jìn)程正在被處理器執(zhí)行
阻塞狀態(tài):進(jìn)程不具備運(yùn)行條件,正在等待某個(gè)事件的完成。引起阻塞狀態(tài)的事件有:等待IO完成,等待信號(hào)等。
線程的同步方式
互斥量(加鎖):采用互斥對(duì)象機(jī)制,只有擁有這個(gè)互斥對(duì)象的線程才能訪問(wèn)共享資源,而且這個(gè)互斥對(duì)象是唯一的。會(huì)造成死鎖。
信號(hào)量:允許同一時(shí)刻多個(gè)線程來(lái)訪問(wèn)共享資源,需要一個(gè)計(jì)數(shù)器來(lái)控制同一時(shí)刻來(lái)訪問(wèn)的最大線程數(shù)量。
事件:即使用通知操作的方式來(lái)保證線程同步,某一個(gè)線程不執(zhí)行時(shí)可以主動(dòng)喚醒其他的線程執(zhí)行。
經(jīng)典的進(jìn)程同步問(wèn)題
生產(chǎn)者-消費(fèi)者問(wèn)題:
問(wèn)題描述 :一組生產(chǎn)者進(jìn)程和一組消費(fèi)者進(jìn)程共享一塊初始為空,大小確定的緩沖區(qū),只有當(dāng)緩沖區(qū)不為滿(mǎn)的時(shí)候,生產(chǎn)者進(jìn)程才可以將消息放入緩沖區(qū),否則就要等待;只有當(dāng)緩沖區(qū)不為空的時(shí)候,消費(fèi)者進(jìn)程才可以從中取出消息,否則就要等待;緩沖區(qū)一次只能被一個(gè)進(jìn)程所訪問(wèn)。
問(wèn)題分析 :生產(chǎn)者和消費(fèi)者進(jìn)程對(duì)緩沖區(qū)的訪問(wèn)是互斥關(guān)系,而生產(chǎn)者與消費(fèi)者本身又存在同步關(guān)系,即消息必須先被生產(chǎn),然后才能被消費(fèi)。因而可以對(duì)緩沖區(qū)的訪問(wèn)設(shè)置一個(gè)互斥量,再設(shè)置兩個(gè)信號(hào)量,一個(gè)記錄空閑緩沖區(qū)單元,一個(gè)記錄滿(mǎn)緩沖區(qū)單元,從而實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者的同步。
哲學(xué)家進(jìn)餐問(wèn)題:
問(wèn)題描述 :一張圓桌上坐著五名哲學(xué)家,每?jī)蓚€(gè)哲學(xué)家之間擺一根筷子,哲學(xué)家只有同時(shí)拿起左右兩根筷子才可以用餐,用餐完成后將筷子放回原處。
問(wèn)題分析 :為防止哲學(xué)家各取一根筷子而出現(xiàn)死鎖,需要添加一定的限制條件。
幾種解決方案如下 :
限制至多只允許有四位哲學(xué)家同時(shí)去拿左邊的筷子,最終能保證至少有一位哲學(xué)家能夠進(jìn)餐,并在用畢時(shí)能釋放出他用過(guò)的筷子,從而使更多的哲學(xué)家能夠進(jìn)餐
限制僅當(dāng)哲學(xué)家左右手兩邊的筷子都可用時(shí),才允許拿起筷子進(jìn)餐;即使用AND信號(hào)量機(jī)制解決問(wèn)題
讀者-寫(xiě)者問(wèn)題:
問(wèn)題描述 :有讀者和寫(xiě)者兩個(gè)并發(fā)進(jìn)程共享一個(gè)數(shù)據(jù),多個(gè)讀進(jìn)程可以同時(shí)訪問(wèn)數(shù)據(jù),但寫(xiě)進(jìn)程的數(shù)據(jù)訪問(wèn)與其他進(jìn)程都互斥
問(wèn)題分析 :讀者與寫(xiě)者互斥,寫(xiě)者與寫(xiě)者互斥,讀者與讀者共享。所以需要一個(gè)互斥量實(shí)現(xiàn)讀寫(xiě)進(jìn)程與寫(xiě)寫(xiě)進(jìn)程的互斥,此外還需要引入一個(gè)計(jì)數(shù)器對(duì)讀線程進(jìn)行計(jì)數(shù),使得讀讀同步,讀寫(xiě)互斥。
幾種解決方案如下 :
讀者優(yōu)先 :但只要讀者源源不斷,寫(xiě)者就得不到資源,容易造成寫(xiě)者饑餓
讀寫(xiě)公平 :讀者與寫(xiě)者公平競(jìng)爭(zhēng)資源,但只要之前有已經(jīng)排好隊(duì)的讀者,就算寫(xiě)者獲取到了資源,也要等待所有讀者線程結(jié)束
寫(xiě)者優(yōu)先 :雖然之前已經(jīng)排好隊(duì)的讀者可以?xún)?yōu)先訪問(wèn)資源,但在這之后的讀者則需要等待寫(xiě)者進(jìn)程結(jié)束。只要寫(xiě)者源源不斷,后面的讀者就得不到資源,容易造成讀者饑餓。
進(jìn)程間的通信方式
1、管道(匿名管道)
2、命名管道
管道是一種半雙工的通訊方式,數(shù)據(jù)只能在進(jìn)程間單向流動(dòng),而且如果讀進(jìn)程(接收數(shù)據(jù)的一方)來(lái)不及接收數(shù)據(jù)會(huì)造成數(shù)據(jù)丟失。匿名管道與命名管道的區(qū)別在于匿名管道只允許在有親緣關(guān)系的進(jìn)程之間通訊,而命名管道沒(méi)有這個(gè)約束。
3、消息隊(duì)列
寫(xiě)進(jìn)程將數(shù)據(jù)寫(xiě)入到信息緩沖區(qū)中,讀進(jìn)程直接從緩存區(qū)中拿數(shù)據(jù),避免了數(shù)據(jù)丟失問(wèn)題。但是數(shù)據(jù)的復(fù)制過(guò)程會(huì)帶來(lái)較大的性能消耗
4、信號(hào)量
信號(hào)量解決了多個(gè)進(jìn)程同時(shí)訪問(wèn)多個(gè)相同資源的問(wèn)題。通過(guò)對(duì)訪問(wèn)進(jìn)程的計(jì)數(shù)來(lái)保證當(dāng)前訪問(wèn)進(jìn)程數(shù)小于最大允許進(jìn)程數(shù)。
5、共享內(nèi)存區(qū)
通過(guò)開(kāi)辟一塊共享內(nèi)存區(qū),多個(gè)進(jìn)程都通過(guò)虛擬內(nèi)存映射到這一塊共享內(nèi)存區(qū)中,實(shí)現(xiàn)進(jìn)程通信。
6、Socket套接字
上面進(jìn)程的通訊方式針對(duì)的都是本地主機(jī)進(jìn)程間的通訊方式,而Socket可以實(shí)現(xiàn)遠(yuǎn)程進(jìn)程間的網(wǎng)絡(luò)通信。
操作系統(tǒng)中的進(jìn)程調(diào)度算法有哪些
https://juejin.cn/post/6931957287040843784
當(dāng) CPU 有一堆任務(wù)要處理時(shí),由于其資源有限,這些事情就沒(méi)法同時(shí)處理。這就需要確定某種規(guī)則來(lái)決定處理這些任務(wù)的順序,這就是 “調(diào)度” 研究的問(wèn)題。除了接下來(lái)將要說(shuō)的進(jìn)程調(diào)度,還有作業(yè)調(diào)度、內(nèi)存調(diào)度等。
從就緒隊(duì)列中選擇一個(gè)進(jìn)程來(lái)執(zhí)行,有如下調(diào)度算法。
一、非搶占式進(jìn)程調(diào)度算法:當(dāng)進(jìn)程正在運(yùn)行時(shí),它就會(huì)一直運(yùn)行,直到該進(jìn)程完成或發(fā)生某個(gè)事件發(fā)生而被阻塞時(shí),才會(huì)把 CPU 讓給其他進(jìn)程??捎糜趯?duì)實(shí)時(shí)性要求不嚴(yán)格的系統(tǒng)中。
1)先來(lái)先服務(wù)的調(diào)度算法:每次選擇最先進(jìn)入隊(duì)列的進(jìn)程執(zhí)行(對(duì)短進(jìn)程不利)
2)最短作業(yè)優(yōu)先的調(diào)度算法:每次選擇預(yù)計(jì)執(zhí)行時(shí)間最短的進(jìn)程來(lái)執(zhí)行(按照預(yù)計(jì)執(zhí)行時(shí)間對(duì)進(jìn)程進(jìn)行排序)(對(duì)長(zhǎng)進(jìn)程不利)
3)高響應(yīng)比優(yōu)先的調(diào)度算法:調(diào)度時(shí)計(jì)算所有就緒進(jìn)程的響應(yīng)比,先執(zhí)行響應(yīng)比最高的進(jìn)程。響應(yīng)比 = (進(jìn)程的等待時(shí)間 + 進(jìn)程需要的運(yùn)行時(shí)間) / 進(jìn)程需要的運(yùn)行時(shí)間
二、搶占式優(yōu)先權(quán)算法:處理機(jī)先分配給高優(yōu)先權(quán)的進(jìn)程,在它執(zhí)行過(guò)程中如果有更高優(yōu)先權(quán)的進(jìn)程加入進(jìn)來(lái),則立即停止當(dāng)前進(jìn)程的執(zhí)行,并重新將處理機(jī)讓給更高優(yōu)先權(quán)的進(jìn)程。通常用于要求比較嚴(yán)格的實(shí)時(shí)系統(tǒng)中。
1)最短剩余時(shí)間優(yōu)先的調(diào)度算法:當(dāng)一個(gè)新的進(jìn)程到達(dá)時(shí),把它所需要的整個(gè)運(yùn)行時(shí)間與當(dāng)前進(jìn)程的剩余運(yùn)行時(shí)間作比較。如果新的進(jìn)程需要的時(shí)間更少,則掛起當(dāng)前進(jìn)程,運(yùn)行新的進(jìn)程,否則新的進(jìn)程等待。
2)輪轉(zhuǎn)調(diào)度算法(時(shí)間片):就緒隊(duì)列中的每個(gè)進(jìn)程輪流地運(yùn)行一個(gè)時(shí)間片,當(dāng)時(shí)間片耗盡時(shí)就強(qiáng)迫當(dāng)前運(yùn)行進(jìn)程讓出 CPU 資源,轉(zhuǎn)而排到就緒隊(duì)列尾部,等待下一輪調(diào)度。所以,一個(gè)進(jìn)程一般都需要多次輪轉(zhuǎn)才能完成。
三、最高優(yōu)先級(jí)調(diào)度算法:從就緒隊(duì)列中選擇最高優(yōu)先級(jí)的進(jìn)程進(jìn)行運(yùn)行。最高優(yōu)先級(jí)算法并非是固定的搶占式策略或非搶占式,系統(tǒng)可預(yù)先規(guī)定使用哪種策略。
1)搶占式:當(dāng)就緒隊(duì)列中出現(xiàn)優(yōu)先級(jí)高的進(jìn)程,則立即強(qiáng)制剝奪當(dāng)前運(yùn)行進(jìn)程的 CPU 資源,分配給優(yōu)先級(jí)更高的進(jìn)程運(yùn)行。
2)非搶占式:當(dāng)就緒隊(duì)列中出現(xiàn)優(yōu)先級(jí)高的進(jìn)程,則運(yùn)行完當(dāng)前進(jìn)程后,再選擇該優(yōu)先級(jí)高的進(jìn)程。
死鎖的四個(gè)必要條件
互斥條件:同一份資源同一個(gè)時(shí)刻只能被同一進(jìn)程訪問(wèn)
不可剝奪條件:在進(jìn)程使用資源時(shí),另一進(jìn)程不能強(qiáng)行占用
請(qǐng)求與保持條件:一個(gè)進(jìn)程已經(jīng)拿到了資源1,正在請(qǐng)求資源2。同時(shí),另一個(gè)進(jìn)程已經(jīng)拿到了資源2,正在請(qǐng)求資源1。這種情況下兩個(gè)進(jìn)程都拿不到他們想要的資源。
循環(huán)等待條件:多個(gè)進(jìn)程形成一種循環(huán)等待資源的情況。(類(lèi)似于哲學(xué)家就餐問(wèn)題)
解決死鎖的基本方法有哪些
預(yù)防死鎖:
1、資源一次性分配:破壞請(qǐng)求與保持條件
2、可剝奪資源:當(dāng)某個(gè)進(jìn)程遲遲沒(méi)有拿到新資源時(shí),就釋放已經(jīng)獲得的資源。(破壞了不可剝奪條件)
3、資源有序分配:給每個(gè)資源賦予一個(gè)編號(hào),多個(gè)進(jìn)程按照編號(hào)順序獲得資源。(破壞循環(huán)等待條件)
避免死鎖:
1、銀行家算法:按照系統(tǒng)當(dāng)前剩余資源去逐個(gè)檢查每個(gè)進(jìn)程要申請(qǐng)的資源,如果該進(jìn)程還需要的資源小于系統(tǒng)剩余資源就將資源分配給它,并更新剩余資源數(shù)量。如果一個(gè)隊(duì)列中的進(jìn)程都能拿到資源并完成工作,則系統(tǒng)是安全的。
動(dòng)態(tài)連續(xù)分配有哪些算法
連續(xù)動(dòng)態(tài)分區(qū)分配又稱(chēng)為可變分區(qū)分配,是一種動(dòng)態(tài)規(guī)劃的內(nèi)存分配方法。這種方法不預(yù)先分配內(nèi)存,而是在進(jìn)程裝入內(nèi)存時(shí),根據(jù)進(jìn)程的需要來(lái)分配大小剛好夠他用的內(nèi)存。
主要有以下算法:
1)首次適應(yīng)算法:空閑分區(qū)按照內(nèi)存地址遞增的順序連接,分配時(shí)進(jìn)行順序查找,找到第一個(gè)大小滿(mǎn)足要求的分區(qū)。
2)最佳適應(yīng)算法:空閑分區(qū)按照容量遞增鏈接,找到第一個(gè)滿(mǎn)足要求的空閑分區(qū),即找到第一個(gè)剛好夠用的空閑分區(qū)。
3)最壞適應(yīng)算法:空閑分區(qū)按照容量遞減的順序鏈接,找到第一個(gè)滿(mǎn)足要求的空閑分區(qū),即找到最大空閑分區(qū)。
分頁(yè)和分段存儲(chǔ)管理以及段頁(yè)式存儲(chǔ)管理
https://juejin.cn/post/6845166890709417998
1)頁(yè)是一個(gè)物理單位,頁(yè)是為了合理利用空間,減少內(nèi)存碎片,提高內(nèi)存的利用率。以頁(yè)面為單位,把進(jìn)程空間裝進(jìn)物理內(nèi)存中分散的物理塊中(可能存在內(nèi)存碎片,取決于頁(yè)的大小,因此選擇一個(gè)合適的頁(yè)的大小很關(guān)鍵,太大了難以分配,太小了內(nèi)存碎片過(guò)多且一個(gè)邏輯被分到多個(gè)頁(yè)中嚴(yán)重影響執(zhí)行效率)。
2)而段是一種邏輯單位,它將進(jìn)程邏輯空間劃分成若干段(非等分),能夠更好地滿(mǎn)足用戶(hù)的需要。(例如對(duì)于主函數(shù)main、子程序段X、子函數(shù)Y等,會(huì)根據(jù)每一個(gè)函數(shù)的邏輯的長(zhǎng)度去分配邏輯空間)
頁(yè)的大小固定且由系統(tǒng)確定,而段的長(zhǎng)度是不確定的,取決于用戶(hù)編寫(xiě)的程序。
頁(yè)表信息中記錄了頁(yè)的編號(hào)與真實(shí)物理塊的映射(頁(yè)的大小和物理塊的大小是一樣的)。段表信息記錄了段的邏輯地址到真實(shí)物理地址的映射,即需要給出段的編號(hào)和對(duì)應(yīng)真實(shí)物理地址的基址和段長(zhǎng)(段長(zhǎng)是不固定的因此段表中需要記錄段長(zhǎng)來(lái)確定真實(shí)物理內(nèi)存的大?。?。
3)段頁(yè)式存儲(chǔ)管理:
分頁(yè)存儲(chǔ)管理可以有效提高內(nèi)存利用率,分段可以更好滿(mǎn)足用戶(hù)需求。
中和這兩種方法的優(yōu)點(diǎn)先把邏輯空間按段式管理分成若干段,在把段內(nèi)空間按頁(yè)式管理分成若干頁(yè)。
什么是虛擬內(nèi)存
如果存在一個(gè)程序,它需要的內(nèi)存超出了計(jì)算機(jī)能夠提供的實(shí)際內(nèi)存,那么由于程序無(wú)法裝入內(nèi)存,就無(wú)法運(yùn)行,因此提出了虛擬內(nèi)存。
基于局部性原理,在程序裝入時(shí)可以將程序的一部分裝入內(nèi)存,剩下的放在外存上。當(dāng)程序執(zhí)行時(shí),遇到所需要的信息是在外存中的,操作系統(tǒng)再把這部分信息調(diào)入內(nèi)存中來(lái),再執(zhí)行程序。另一方面,操作系統(tǒng)會(huì)將暫時(shí)不用的內(nèi)容移到外存中,從而移出空間存放將要調(diào)入內(nèi)存的信息。
這樣就好像操作系統(tǒng)為用戶(hù)提供了一個(gè)比實(shí)際內(nèi)存容量大得多的存儲(chǔ)器,成為虛擬內(nèi)存。
虛擬內(nèi)存有什么特點(diǎn)
多次性:一個(gè)任務(wù)可以分多次被調(diào)入內(nèi)存
對(duì)換性:指任務(wù)執(zhí)行過(guò)程中存在換進(jìn)換出的過(guò)程(在磁盤(pán)和內(nèi)存中對(duì)換,當(dāng)要使用時(shí)就從磁盤(pán)調(diào)入內(nèi)存,當(dāng)暫時(shí)不使用就從內(nèi)存移到磁盤(pán),騰出空間)
虛擬性:指它從邏輯上擴(kuò)充了內(nèi)存的容量,它是基于多次性和對(duì)換性的,而多次性和對(duì)換性又是基于內(nèi)存離散分配基礎(chǔ)上的。
虛擬地址空間
每個(gè)進(jìn)程都有屬于自己的虛擬內(nèi)存,這塊空間就叫做虛擬地址空間。
在沒(méi)有**虛擬地址空間**之前,是根據(jù)進(jìn)程的需要**按需分配**物理內(nèi)存的。但有了**虛擬地址空間**,分配策略可以變一下,先把**虛擬地址空間**分配的大些,**但不立馬建立與物理內(nèi)存的映射**,而是用到的時(shí)候,用多少,建立多少。進(jìn)程中維護(hù)一張頁(yè)表,用來(lái)保存映射關(guān)系。
內(nèi)核空間與用戶(hù)空間
操作系統(tǒng)雖然為**每個(gè)進(jìn)程**都分配了**虛擬地址空間**,但 **虛擬地址空間**中并不是所有的區(qū)域都可以為進(jìn)程所用。
操作系統(tǒng)將**虛擬地址空間** 分為**用戶(hù)空間**和**內(nèi)核空間**,對(duì)于 **32 位**的操作系統(tǒng),在 **Linux** 的**虛擬地址空間**中,**用戶(hù)空間**和**內(nèi)核空間**的大小比例為 3:1,而在 **window** 中則為 2:2。
所有的系統(tǒng)調(diào)用都要交給內(nèi)核完成,而內(nèi)核也要運(yùn)行在內(nèi)存中,為了防止用戶(hù)進(jìn)程的干擾,于是在虛擬地址空間中劃分了內(nèi)核空間用來(lái)映射物理空間上的內(nèi)核空間。
從用戶(hù)態(tài)切換到內(nèi)核態(tài)的方式
用戶(hù)態(tài)切換到內(nèi)核態(tài)都是通過(guò)函數(shù)調(diào)用的方式執(zhí)行的,因此到函數(shù)執(zhí)行完成時(shí)就會(huì)從內(nèi)核態(tài)切換到用戶(hù)態(tài)中。
1)<font color=#41729f>系統(tǒng)調(diào)用</font>:用戶(hù)態(tài)進(jìn)程主動(dòng)要求切換(實(shí)際上也是執(zhí)行一個(gè)中斷函數(shù))。用戶(hù)態(tài)進(jìn)程通過(guò)系統(tǒng)調(diào)用申請(qǐng)使用操作系統(tǒng)提供的服務(wù)程序完成工作,比如前例中fork()實(shí)際上就是執(zhí)行了一個(gè)創(chuàng)建新進(jìn)程的系統(tǒng)調(diào)用。
2)異常:在執(zhí)行用戶(hù)進(jìn)程的過(guò)程中,發(fā)生了某些異常,而這些異常只能切換到內(nèi)核態(tài)才能處理,比如缺頁(yè)異常。
3)外圍設(shè)備的中斷:當(dāng)外圍設(shè)備完成用戶(hù)請(qǐng)求后,會(huì)向CPU發(fā)出相應(yīng)的中斷信號(hào),這時(shí)CPU就會(huì)去執(zhí)行中斷信號(hào)對(duì)應(yīng)的程序,如果CPU之前是在執(zhí)行用戶(hù)線程,則處理中斷的過(guò)程就是一次用戶(hù)態(tài)到內(nèi)核態(tài)的切換。
操作系統(tǒng)常見(jiàn)的服務(wù)
http://www.vue5.com/operating_system/os_services.html
1)IO操作(操作系統(tǒng)管理用戶(hù)進(jìn)程與設(shè)備驅(qū)動(dòng)程序進(jìn)程之間的通信)
2)程序執(zhí)行
- 將程序加載到內(nèi)存中。
- 執(zhí)行程序。
- 處理程序的執(zhí)行。
- 提供進(jìn)程同步的機(jī)制。
- 提供流程溝通的機(jī)制。
- 提供了一種死鎖處理機(jī)制。
3)文件系統(tǒng)操作
4)進(jìn)程通信
5)錯(cuò)誤處理
6)資源管理和權(quán)限保護(hù)
常用的頁(yè)面置換算法有哪些?
https://juejin.cn/post/6982173572873584677
什么是頁(yè)面置換算法:在進(jìn)程運(yùn)行過(guò)程中,如果其訪問(wèn)的頁(yè)面不存在于內(nèi)存中,則會(huì)產(chǎn)生缺頁(yè)中斷。如果此時(shí)內(nèi)存中沒(méi)有空閑的頁(yè)面,則操作系統(tǒng)就需要在內(nèi)存中選擇一個(gè)頁(yè)面將其移出,從而可以將需要訪問(wèn)的頁(yè)面調(diào)入內(nèi)存中。而用來(lái)選擇淘汰哪一頁(yè)的算法就叫做頁(yè)面置換算法。好的頁(yè)面置換算法應(yīng)該有較低的頁(yè)面更換頻率。
注意:正常情況下,在產(chǎn)生缺頁(yè)中斷時(shí),是將內(nèi)存中的空閑頁(yè)面移出,這里說(shuō)的是沒(méi)有空閑頁(yè)面的情況。
1)最佳置換算法:選擇淘汰的頁(yè)面是以后永久不使用或者很長(zhǎng)一段時(shí)間內(nèi)不會(huì)再使用的,這樣可以保證最低的缺頁(yè)率(需要用到這頁(yè)的時(shí)候而內(nèi)存中沒(méi)有這頁(yè)的概率)。
2)先進(jìn)先出算法:淘汰最早進(jìn)入內(nèi)存的頁(yè)面。把調(diào)入內(nèi)存的頁(yè)面按照先后順序放入隊(duì)列中,當(dāng)需要置換頁(yè)面時(shí),選擇隊(duì)頭的頁(yè)面即可。
3)最近最久未使用算法(LRU):淘汰最近最久沒(méi)有被使用的頁(yè)面。因此需要記錄該頁(yè)面上次被使用以來(lái)經(jīng)歷的時(shí)間,并選擇淘汰一個(gè)最大的時(shí)間對(duì)應(yīng)的頁(yè)面。
4)最近最少使用算法(LFU):如果一個(gè)頁(yè)面在最近一段時(shí)間內(nèi)使用頻次很少,那么在將來(lái)該頁(yè)面也會(huì)使用很少。即淘汰最近使用次數(shù)最少的的頁(yè)面。
注意:LRU的淘汰規(guī)則是基于訪問(wèn)時(shí)間,而LFU是基于訪問(wèn)次數(shù)的。
java中常見(jiàn)的IO模型有哪些?IO多路復(fù)用中的select、poll、epoll機(jī)制?
https://juejin.cn/post/6939841279329042439#heading-6
https://juejin.cn/post/6844903687626686472#heading-3
為了保證操作系統(tǒng)的安全性與穩(wěn)定性,一個(gè)進(jìn)程的地址空間可以被劃分為用戶(hù)空間與內(nèi)核空間。
我們平常運(yùn)行的應(yīng)用程序都是工作在用戶(hù)空間,只有內(nèi)核空間才能完成系統(tǒng)級(jí)別的資源調(diào)用,比如IO操作、文件管理、進(jìn)程通信、內(nèi)存管理等。而且用戶(hù)空間是不能直接訪問(wèn)內(nèi)核空間的,因此在申請(qǐng)操作系統(tǒng)服務(wù)時(shí)只能發(fā)起系統(tǒng)調(diào)用請(qǐng)求操作系統(tǒng)來(lái)完成。
以IO操作為例,當(dāng)程序發(fā)起IO調(diào)用后,會(huì)經(jīng)歷兩個(gè)階段:操作系統(tǒng)等待IO設(shè)備準(zhǔn)備好數(shù)據(jù);操作系統(tǒng)把數(shù)據(jù)從內(nèi)核空間拷貝到用戶(hù)空間。
java中有3種常見(jiàn)的IO模型:BIO(同步阻塞IO),NIO(同步非阻塞IO),AIO(異步IO)
操作系統(tǒng)層面上有5種常見(jiàn)的IO模型:同步阻塞IO,同步非阻塞IO,IO多路復(fù)用,信號(hào)驅(qū)動(dòng)IO和異步IO。
同步阻塞IO:在應(yīng)用程序發(fā)起read調(diào)用后,會(huì)一直阻塞,直到操作系統(tǒng)將數(shù)據(jù)從內(nèi)核空間拷貝到用戶(hù)空間為止。
在并發(fā)量高的情況下,BIO模型的效率很低。
同步非阻塞IO:在應(yīng)用程序發(fā)起read調(diào)用后,內(nèi)核空間開(kāi)始準(zhǔn)備數(shù)據(jù),之后每過(guò)一段時(shí)間應(yīng)用程序就會(huì)發(fā)起一個(gè)read調(diào)用來(lái)檢查內(nèi)核是否已經(jīng)將數(shù)據(jù)準(zhǔn)備好了,若檢測(cè)到數(shù)據(jù)已經(jīng)準(zhǔn)備好了才進(jìn)入阻塞狀態(tài)執(zhí)行拷貝過(guò)程。
對(duì)于高并發(fā)量的系統(tǒng)應(yīng)該使用NIO模型,雖然在數(shù)據(jù)準(zhǔn)備過(guò)程中應(yīng)用程序是非阻塞的,但是由于要一直輪詢(xún),所以會(huì)很消耗CPU資源。
信號(hào)驅(qū)動(dòng)IO:當(dāng)應(yīng)用程序發(fā)起read調(diào)用后,操作系統(tǒng)不用馬上返回(即用戶(hù)進(jìn)程可以去做其他事),當(dāng)監(jiān)控到對(duì)應(yīng)資源可用時(shí)就通知用戶(hù)進(jìn)程進(jìn)行數(shù)據(jù)拷貝操作。IO多路復(fù)用類(lèi)似于多個(gè)信號(hào)驅(qū)動(dòng)IO。
https://juejin.cn/post/6915395956808613902
IO多路復(fù)用模型:一次性向操作系統(tǒng)發(fā)起所有調(diào)用函數(shù),操作系統(tǒng)不用馬上返回這些調(diào)用函數(shù),當(dāng)監(jiān)控到有資源可用時(shí),再返回相應(yīng)的調(diào)用,即操作系統(tǒng)一直幫應(yīng)用程序監(jiān)控資源,不用應(yīng)用程序每次都來(lái)詢(xún)問(wèn)。而在NIO中每次向操作系統(tǒng)發(fā)起調(diào)用,如果資源不可用都會(huì)直接返回,直到某次調(diào)用遇到可用的資源才進(jìn)行拷貝操作。
IO多路復(fù)用減少了許多無(wú)效的系統(tǒng)調(diào)用,減少了對(duì) CPU 資源的消耗,但它實(shí)際上在數(shù)據(jù)拷貝階段仍然是同步阻塞的。
在LINUX中IO多路復(fù)用有三種機(jī)載select、poll、epoll。不過(guò)windows中也實(shí)現(xiàn)了select、poll機(jī)制。
select機(jī)制:在select這種I/O多路復(fù)用機(jī)制下,我們需要把想監(jiān)控的文件描述集合通過(guò)函數(shù)參數(shù)的形式告訴select,然后select會(huì)將這些文件描述符集合拷貝到內(nèi)核中,我們知道數(shù)據(jù)拷貝是有性能損耗的,因此為了減少這種數(shù)據(jù)拷貝帶來(lái)的性能損耗,Linux內(nèi)核對(duì)集合的大小做了限制,并規(guī)定用戶(hù)監(jiān)控的文件描述集合不能超過(guò)1024個(gè),同時(shí)當(dāng)select返回后我們僅僅能知道有些文件描述符可以讀寫(xiě)了,但是我們不知道是哪一個(gè),因此程序員必須再遍歷一邊找到具體是哪個(gè)文件描述符可以讀寫(xiě)了。
poll機(jī)制:poll和select是非常相似的,poll相對(duì)于select的優(yōu)化僅僅在于解決了文件描述符不能超過(guò)1024個(gè)的限制,select和poll都會(huì)隨著監(jiān)控的文件描述增加而出現(xiàn)性能下降,因此不適合高并發(fā)場(chǎng)景。
epoll:相對(duì)于select和poll來(lái)說(shuō),epoll更加靈活,沒(méi)有描述符限制。epoll使用一個(gè)文件描述符管理多個(gè)描述符,將用戶(hù)相關(guān)的文件描述符的事件存放到內(nèi)核的一個(gè)事件表中,這樣在用戶(hù)空間和內(nèi)核空間的copy只需一次。
異步IO:異步IO 是基于事件和回調(diào)機(jī)制實(shí)現(xiàn)的,也就是應(yīng)用操作之后會(huì)直接返回,不會(huì)堵塞在那里,當(dāng)后臺(tái)處理完成(包括數(shù)據(jù)準(zhǔn)備與數(shù)據(jù)拷貝的操作),操作系統(tǒng)會(huì)給相應(yīng)的進(jìn)程發(fā)送一個(gè)信號(hào)告訴它read操作完成了。