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)度開銷比進(jìn)程小兵迅?
進(jìn)程是資源的調(diào)度的基本單位抢韭,因此在創(chuàng)建或者銷毀進(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í)對進(jìn)程的調(diào)度也是很復(fù)雜鳍贾,也需要花費(fèi)大量的時(shí)間。
而線程本身不持有資源勉抓,而且同一進(jìn)程中的線程共享進(jìn)程資源贾漏,所以線程之間的通訊也更加便捷。因此相對于進(jìn)程來說藕筋,線程的調(diào)度開銷比較小的纵散,它也被稱為“輕型進(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完成暇藏,等待信號等蜜笤。
線程的同步方式
互斥量(加鎖):采用互斥對象機(jī)制,只有擁有這個(gè)互斥對象的線程才能訪問共享資源盐碱,而且這個(gè)互斥對象是唯一的把兔。會(huì)造成死鎖。
信號量:允許同一時(shí)刻多個(gè)線程來訪問共享資源瓮顽,需要一個(gè)計(jì)數(shù)器來控制同一時(shí)刻來訪問的最大線程數(shù)量县好。
事件:即使用通知操作的方式來保證線程同步,某一個(gè)線程不執(zhí)行時(shí)可以主動(dòng)喚醒其他的線程執(zhí)行暖混。
經(jīng)典的進(jìn)程同步問題
生產(chǎn)者-消費(fèi)者問題:
問題描述 :一組生產(chǎn)者進(jìn)程和一組消費(fèi)者進(jìn)程共享一塊初始為空缕贡,大小確定的緩沖區(qū),只有當(dāng)緩沖區(qū)不為滿的時(shí)候,生產(chǎn)者進(jìn)程才可以將消息放入緩沖區(qū)晾咪,否則就要等待收擦;只有當(dāng)緩沖區(qū)不為空的時(shí)候,消費(fèi)者進(jìn)程才可以從中取出消息谍倦,否則就要等待塞赂;緩沖區(qū)一次只能被一個(gè)進(jìn)程所訪問。
問題分析 :生產(chǎn)者和消費(fèi)者進(jìn)程對緩沖區(qū)的訪問是互斥關(guān)系剂跟,而生產(chǎn)者與消費(fèi)者本身又存在同步關(guān)系减途,即消息必須先被生產(chǎn),然后才能被消費(fèi)曹洽。因而可以對緩沖區(qū)的訪問設(shè)置一個(gè)互斥量鳍置,再設(shè)置兩個(gè)信號量,一個(gè)記錄空閑緩沖區(qū)單元送淆,一個(gè)記錄滿緩沖區(qū)單元税产,從而實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者的同步。
哲學(xué)家進(jìn)餐問題:
問題描述 :一張圓桌上坐著五名哲學(xué)家偷崩,每兩個(gè)哲學(xué)家之間擺一根筷子辟拷,哲學(xué)家只有同時(shí)拿起左右兩根筷子才可以用餐,用餐完成后將筷子放回原處阐斜。
問題分析 :為防止哲學(xué)家各取一根筷子而出現(xiàn)死鎖衫冻,需要添加一定的限制條件。
幾種解決方案如下 :
限制至多只允許有四位哲學(xué)家同時(shí)去拿左邊的筷子谒出,最終能保證至少有一位哲學(xué)家能夠進(jìn)餐隅俘,并在用畢時(shí)能釋放出他用過的筷子,從而使更多的哲學(xué)家能夠進(jìn)餐
限制僅當(dāng)哲學(xué)家左右手兩邊的筷子都可用時(shí)笤喳,才允許拿起筷子進(jìn)餐为居;即使用AND信號量機(jī)制解決問題
讀者-寫者問題:
問題描述 :有讀者和寫者兩個(gè)并發(fā)進(jìn)程共享一個(gè)數(shù)據(jù),多個(gè)讀進(jìn)程可以同時(shí)訪問數(shù)據(jù)杀狡,但寫進(jìn)程的數(shù)據(jù)訪問與其他進(jìn)程都互斥
問題分析 :讀者與寫者互斥蒙畴,寫者與寫者互斥,讀者與讀者共享呜象。所以需要一個(gè)互斥量實(shí)現(xiàn)讀寫進(jìn)程與寫寫進(jìn)程的互斥膳凝,此外還需要引入一個(gè)計(jì)數(shù)器對讀線程進(jìn)行計(jì)數(shù),使得讀讀同步恭陡,讀寫互斥鸠项。
幾種解決方案如下 :
讀者優(yōu)先 :但只要讀者源源不斷,寫者就得不到資源子姜,容易造成寫者饑餓
讀寫公平 :讀者與寫者公平競爭資源,但只要之前有已經(jīng)排好隊(duì)的讀者,就算寫者獲取到了資源哥捕,也要等待所有讀者線程結(jié)束
寫者優(yōu)先 :雖然之前已經(jīng)排好隊(duì)的讀者可以優(yōu)先訪問資源牧抽,但在這之后的讀者則需要等待寫者進(jìn)程結(jié)束。只要寫者源源不斷遥赚,后面的讀者就得不到資源扬舒,容易造成讀者饑餓。
進(jìn)程間的通信方式
1凫佛、管道(匿名管道)
2讲坎、命名管道
管道是一種半雙工的通訊方式,數(shù)據(jù)只能在進(jìn)程間單向流動(dòng)愧薛,而且如果讀進(jìn)程(接收數(shù)據(jù)的一方)來不及接收數(shù)據(jù)會(huì)造成數(shù)據(jù)丟失晨炕。匿名管道與命名管道的區(qū)別在于匿名管道只允許在有親緣關(guān)系的進(jìn)程之間通訊,而命名管道沒有這個(gè)約束毫炉。
3瓮栗、消息隊(duì)列
寫進(jìn)程將數(shù)據(jù)寫入到信息緩沖區(qū)中,讀進(jìn)程直接從緩存區(qū)中拿數(shù)據(jù)瞄勾,避免了數(shù)據(jù)丟失問題费奸。但是數(shù)據(jù)的復(fù)制過程會(huì)帶來較大的性能消耗
4、信號量
信號量解決了多個(gè)進(jìn)程同時(shí)訪問多個(gè)相同資源的問題进陡。通過對訪問進(jìn)程的計(jì)數(shù)來保證當(dāng)前訪問進(jìn)程數(shù)小于最大允許進(jìn)程數(shù)愿阐。
5、共享內(nèi)存區(qū)
通過開辟一塊共享內(nèi)存區(qū)趾疚,多個(gè)進(jìn)程都通過虛擬內(nèi)存映射到這一塊共享內(nèi)存區(qū)中缨历,實(shí)現(xiàn)進(jìn)程通信。
6盗蟆、Socket套接字
上面進(jìn)程的通訊方式針對的都是本地主機(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í)喳资,由于其資源有限觉吭,這些事情就沒法同時(shí)處理。這就需要確定某種規(guī)則來決定處理這些任務(wù)的順序仆邓,這就是 “調(diào)度” 研究的問題鲜滩。除了接下來將要說的進(jìn)程調(diào)度,還有作業(yè)調(diào)度节值、內(nèi)存調(diào)度等徙硅。
從就緒隊(duì)列中選擇一個(gè)進(jìn)程來執(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)程豌汇。可用于對實(shí)時(shí)性要求不嚴(yán)格的系統(tǒng)中泄隔。
1)先來先服務(wù)的調(diào)度算法:每次選擇最先進(jìn)入隊(duì)列的進(jìn)程執(zhí)行(對短進(jìn)程不利)
2)最短作業(yè)優(yōu)先的調(diào)度算法:每次選擇預(yù)計(jì)執(zhí)行時(shí)間最短的進(jìn)程來執(zhí)行(按照預(yù)計(jì)執(zhí)行時(shí)間對進(jìn)程進(jìn)行排序)(對長進(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í)行過程中如果有更高優(yōu)先權(quán)的進(jìn)程加入進(jìn)來,則立即停止當(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)先級調(diào)度算法:從就緒隊(duì)列中選擇最高優(yōu)先級的進(jìn)程進(jìn)行運(yùn)行箱蟆。最高優(yōu)先級算法并非是固定的搶占式策略或非搶占式,系統(tǒng)可預(yù)先規(guī)定使用哪種策略刮便。
1)搶占式:當(dāng)就緒隊(duì)列中出現(xiàn)優(yōu)先級高的進(jìn)程空猜,則立即強(qiáng)制剝奪當(dāng)前運(yùn)行進(jìn)程的 CPU 資源,分配給優(yōu)先級更高的進(jìn)程運(yùn)行恨旱。
2)非搶占式:當(dāng)就緒隊(duì)列中出現(xiàn)優(yōu)先級高的進(jìn)程辈毯,則運(yùn)行完當(dāng)前進(jìn)程后,再選擇該優(yōu)先級高的進(jìn)程搜贤。
死鎖的四個(gè)必要條件
互斥條件:同一份資源同一個(gè)時(shí)刻只能被同一進(jìn)程訪問
不可剝奪條件:在進(jìn)程使用資源時(shí)谆沃,另一進(jìn)程不能強(qiáng)行占用
請求與保持條件:一個(gè)進(jìn)程已經(jīng)拿到了資源1,正在請求資源2仪芒。同時(shí)唁影,另一個(gè)進(jìn)程已經(jīng)拿到了資源2耕陷,正在請求資源1。這種情況下兩個(gè)進(jìn)程都拿不到他們想要的資源据沈。
循環(huán)等待條件:多個(gè)進(jìn)程形成一種循環(huán)等待資源的情況啃炸。(類似于哲學(xué)家就餐問題)
解決死鎖的基本方法有哪些
預(yù)防死鎖:
1、資源一次性分配:破壞請求與保持條件
2卓舵、可剝奪資源:當(dāng)某個(gè)進(jìn)程遲遲沒有拿到新資源時(shí),就釋放已經(jīng)獲得的資源膀钠。(破壞了不可剝奪條件)
3掏湾、資源有序分配:給每個(gè)資源賦予一個(gè)編號,多個(gè)進(jìn)程按照編號順序獲得資源肿嘲。(破壞循環(huán)等待條件)
避免死鎖:
1融击、銀行家算法:按照系統(tǒng)當(dāng)前剩余資源去逐個(gè)檢查每個(gè)進(jìn)程要申請的資源,如果該進(jìn)程還需要的資源小于系統(tǒng)剩余資源就將資源分配給它雳窟,并更新剩余資源數(shù)量尊浪。如果一個(gè)隊(duì)列中的進(jìn)程都能拿到資源并完成工作,則系統(tǒng)是安全的封救。
動(dòng)態(tài)連續(xù)分配有哪些算法
連續(xù)動(dòng)態(tài)分區(qū)分配又稱為可變分區(qū)分配拇涤,是一種動(dòng)態(tài)規(guī)劃的內(nèi)存分配方法。這種方法不預(yù)先分配內(nèi)存誉结,而是在進(jìn)程裝入內(nèi)存時(shí)鹅士,根據(jù)進(jìn)程的需要來分配大小剛好夠他用的內(nèi)存。
主要有以下算法:
1)首次適應(yīng)算法:空閑分區(qū)按照內(nèi)存地址遞增的順序連接惩坑,分配時(shí)進(jìn)行順序查找掉盅,找到第一個(gè)大小滿足要求的分區(qū)。
2)最佳適應(yīng)算法:空閑分區(qū)按照容量遞增鏈接以舒,找到第一個(gè)滿足要求的空閑分區(qū)趾痘,即找到第一個(gè)剛好夠用的空閑分區(qū)。
3)最壞適應(yīng)算法:空閑分區(qū)按照容量遞減的順序鏈接蔓钟,找到第一個(gè)滿足要求的空閑分區(qū)永票,即找到最大空閑分區(qū)。
分頁和分段存儲(chǔ)管理以及段頁式存儲(chǔ)管理
https://juejin.cn/post/6845166890709417998
1)頁是一個(gè)物理單位奋刽,頁是為了合理利用空間瓦侮,減少內(nèi)存碎片,提高內(nèi)存的利用率佣谐。以頁面為單位肚吏,把進(jìn)程空間裝進(jìn)物理內(nèi)存中分散的物理塊中(可能存在內(nèi)存碎片,取決于頁的大小狭魂,因此選擇一個(gè)合適的頁的大小很關(guān)鍵罚攀,太大了難以分配党觅,太小了內(nèi)存碎片過多且一個(gè)邏輯被分到多個(gè)頁中嚴(yán)重影響執(zhí)行效率)。
2)而段是一種邏輯單位斋泄,它將進(jìn)程邏輯空間劃分成若干段(非等分)杯瞻,能夠更好地滿足用戶的需要。(例如對于主函數(shù)main炫掐、子程序段X魁莉、子函數(shù)Y等,會(huì)根據(jù)每一個(gè)函數(shù)的邏輯的長度去分配邏輯空間)
頁的大小固定且由系統(tǒng)確定募胃,而段的長度是不確定的旗唁,取決于用戶編寫的程序。
頁表信息中記錄了頁的編號與真實(shí)物理塊的映射(頁的大小和物理塊的大小是一樣的)痹束。段表信息記錄了段的邏輯地址到真實(shí)物理地址的映射检疫,即需要給出段的編號和對應(yīng)真實(shí)物理地址的基址和段長(段長是不固定的因此段表中需要記錄段長來確定真實(shí)物理內(nèi)存的大小)祷嘶。
3)段頁式存儲(chǔ)管理:
分頁存儲(chǔ)管理可以有效提高內(nèi)存利用率屎媳,分段可以更好滿足用戶需求。
中和這兩種方法的優(yōu)點(diǎn)先把邏輯空間按段式管理分成若干段论巍,在把段內(nèi)空間按頁式管理分成若干頁烛谊。
什么是虛擬內(nèi)存
如果存在一個(gè)程序,它需要的內(nèi)存超出了計(jì)算機(jī)能夠提供的實(shí)際內(nèi)存环壤,那么由于程序無法裝入內(nèi)存晒来,就無法運(yùn)行,因此提出了虛擬內(nèi)存郑现。
基于局部性原理湃崩,在程序裝入時(shí)可以將程序的一部分裝入內(nèi)存,剩下的放在外存上接箫。當(dāng)程序執(zhí)行時(shí)攒读,遇到所需要的信息是在外存中的,操作系統(tǒng)再把這部分信息調(diào)入內(nèi)存中來辛友,再執(zhí)行程序薄扁。另一方面,操作系統(tǒng)會(huì)將暫時(shí)不用的內(nèi)容移到外存中废累,從而移出空間存放將要調(diào)入內(nèi)存的信息邓梅。
這樣就好像操作系統(tǒng)為用戶提供了一個(gè)比實(shí)際內(nèi)存容量大得多的存儲(chǔ)器,成為虛擬內(nèi)存邑滨。
虛擬內(nèi)存有什么特點(diǎn)
多次性:一個(gè)任務(wù)可以分多次被調(diào)入內(nèi)存
對換性:指任務(wù)執(zhí)行過程中存在換進(jìn)換出的過程(在磁盤和內(nèi)存中對換日缨,當(dāng)要使用時(shí)就從磁盤調(diào)入內(nèi)存,當(dāng)暫時(shí)不使用就從內(nèi)存移到磁盤掖看,騰出空間)
虛擬性:指它從邏輯上擴(kuò)充了內(nèi)存的容量匣距,它是基于多次性和對換性的面哥,而多次性和對換性又是基于內(nèi)存離散分配基礎(chǔ)上的。
虛擬地址空間
每個(gè)進(jìn)程都有屬于自己的虛擬內(nèi)存毅待,這塊空間就叫做虛擬地址空間尚卫。
在沒有**虛擬地址空間**之前,是根據(jù)進(jìn)程的需要**按需分配**物理內(nèi)存的尸红。但有了**虛擬地址空間**吱涉,分配策略可以變一下,先把**虛擬地址空間**分配的大些外里,**但不立馬建立與物理內(nèi)存的映射**邑飒,而是用到的時(shí)候,用多少级乐,建立多少。進(jìn)程中維護(hù)一張頁表县匠,用來保存映射關(guān)系风科。
內(nèi)核空間與用戶空間
操作系統(tǒng)雖然為**每個(gè)進(jìn)程**都分配了**虛擬地址空間**,但 **虛擬地址空間**中并不是所有的區(qū)域都可以為進(jìn)程所用乞旦。
操作系統(tǒng)將**虛擬地址空間** 分為**用戶空間**和**內(nèi)核空間**贼穆,對于 **32 位**的操作系統(tǒng),在 **Linux** 的**虛擬地址空間**中兰粉,**用戶空間**和**內(nèi)核空間**的大小比例為 3:1故痊,而在 **window** 中則為 2:2。
所有的系統(tǒng)調(diào)用都要交給內(nèi)核完成玖姑,而內(nèi)核也要運(yùn)行在內(nèi)存中愕秫,為了防止用戶進(jìn)程的干擾,于是在虛擬地址空間中劃分了內(nèi)核空間用來映射物理空間上的內(nèi)核空間焰络。
從用戶態(tài)切換到內(nèi)核態(tài)的方式
用戶態(tài)切換到內(nèi)核態(tài)都是通過函數(shù)調(diào)用的方式執(zhí)行的戴甩,因此到函數(shù)執(zhí)行完成時(shí)就會(huì)從內(nèi)核態(tài)切換到用戶態(tài)中。
1)<font color=#41729f>系統(tǒng)調(diào)用</font>:用戶態(tài)進(jìn)程主動(dòng)要求切換(實(shí)際上也是執(zhí)行一個(gè)中斷函數(shù))闪彼。用戶態(tài)進(jìn)程通過系統(tǒng)調(diào)用申請使用操作系統(tǒng)提供的服務(wù)程序完成工作甜孤,比如前例中fork()實(shí)際上就是執(zhí)行了一個(gè)創(chuàng)建新進(jìn)程的系統(tǒng)調(diào)用。
2)異常:在執(zhí)行用戶進(jìn)程的過程中畏腕,發(fā)生了某些異常缴川,而這些異常只能切換到內(nèi)核態(tài)才能處理,比如缺頁異常描馅。
3)外圍設(shè)備的中斷:當(dāng)外圍設(shè)備完成用戶請求后把夸,會(huì)向CPU發(fā)出相應(yīng)的中斷信號,這時(shí)CPU就會(huì)去執(zhí)行中斷信號對應(yīng)的程序流昏,如果CPU之前是在執(zhí)行用戶線程扎即,則處理中斷的過程就是一次用戶態(tài)到內(nèi)核態(tài)的切換吞获。
操作系統(tǒng)常見的服務(wù)
http://www.vue5.com/operating_system/os_services.html
1)IO操作(操作系統(tǒng)管理用戶進(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ù)
常用的頁面置換算法有哪些?
https://juejin.cn/post/6982173572873584677
什么是頁面置換算法:在進(jìn)程運(yùn)行過程中傻盟,如果其訪問的頁面不存在于內(nèi)存中速蕊,則會(huì)產(chǎn)生缺頁中斷。如果此時(shí)內(nèi)存中沒有空閑的頁面娘赴,則操作系統(tǒng)就需要在內(nèi)存中選擇一個(gè)頁面將其移出规哲,從而可以將需要訪問的頁面調(diào)入內(nèi)存中。而用來選擇淘汰哪一頁的算法就叫做頁面置換算法诽表。好的頁面置換算法應(yīng)該有較低的頁面更換頻率唉锌。
注意:正常情況下,在產(chǎn)生缺頁中斷時(shí)竿奏,是將內(nèi)存中的空閑頁面移出袄简,這里說的是沒有空閑頁面的情況。
1)最佳置換算法:選擇淘汰的頁面是以后永久不使用或者很長一段時(shí)間內(nèi)不會(huì)再使用的泛啸,這樣可以保證最低的缺頁率(需要用到這頁的時(shí)候而內(nèi)存中沒有這頁的概率)绿语。
2)先進(jìn)先出算法:淘汰最早進(jìn)入內(nèi)存的頁面。把調(diào)入內(nèi)存的頁面按照先后順序放入隊(duì)列中候址,當(dāng)需要置換頁面時(shí)吕粹,選擇隊(duì)頭的頁面即可。
3)最近最久未使用算法(LRU):淘汰最近最久沒有被使用的頁面岗仑。因此需要記錄該頁面上次被使用以來經(jīng)歷的時(shí)間昂芜,并選擇淘汰一個(gè)最大的時(shí)間對應(yīng)的頁面。
4)最近最少使用算法(LFU):如果一個(gè)頁面在最近一段時(shí)間內(nèi)使用頻次很少赔蒲,那么在將來該頁面也會(huì)使用很少泌神。即淘汰最近使用次數(shù)最少的的頁面毒费。
注意:LRU的淘汰規(guī)則是基于訪問時(shí)間恢筝,而LFU是基于訪問次數(shù)的。
java中常見的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)程的地址空間可以被劃分為用戶空間與內(nèi)核空間浑槽。
我們平常運(yùn)行的應(yīng)用程序都是工作在用戶空間蒋失,只有內(nèi)核空間才能完成系統(tǒng)級別的資源調(diào)用,比如IO操作桐玻、文件管理篙挽、進(jìn)程通信、內(nèi)存管理等镊靴。而且用戶空間是不能直接訪問內(nèi)核空間的铣卡,因此在申請操作系統(tǒng)服務(wù)時(shí)只能發(fā)起系統(tǒng)調(diào)用請求操作系統(tǒng)來完成。
以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)核空間拷貝到用戶空間踊谋。
java中有3種常見的IO模型:BIO(同步阻塞IO)蝉仇,NIO(同步非阻塞IO),AIO(異步IO)
操作系統(tǒng)層面上有5種常見的IO模型:同步阻塞IO殖蚕,同步非阻塞IO量淌,IO多路復(fù)用,信號驅(qū)動(dòng)IO和異步IO嫌褪。
同步阻塞IO:在應(yīng)用程序發(fā)起read調(diào)用后,會(huì)一直阻塞胚股,直到操作系統(tǒng)將數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間為止笼痛。
在并發(fā)量高的情況下,BIO模型的效率很低琅拌。
同步非阻塞IO:在應(yīng)用程序發(fā)起read調(diào)用后缨伊,內(nèi)核空間開始準(zhǔn)備數(shù)據(jù),之后每過一段時(shí)間應(yīng)用程序就會(huì)發(fā)起一個(gè)read調(diào)用來檢查內(nèi)核是否已經(jīng)將數(shù)據(jù)準(zhǔn)備好了进宝,若檢測到數(shù)據(jù)已經(jīng)準(zhǔn)備好了才進(jìn)入阻塞狀態(tài)執(zhí)行拷貝過程刻坊。
對于高并發(fā)量的系統(tǒng)應(yīng)該使用NIO模型,雖然在數(shù)據(jù)準(zhǔn)備過程中應(yīng)用程序是非阻塞的党晋,但是由于要一直輪詢谭胚,所以會(huì)很消耗CPU資源。
信號驅(qū)動(dòng)IO:當(dāng)應(yīng)用程序發(fā)起read調(diào)用后未玻,操作系統(tǒng)不用馬上返回(即用戶進(jìn)程可以去做其他事)灾而,當(dāng)監(jiān)控到對應(yīng)資源可用時(shí)就通知用戶進(jìn)程進(jìn)行數(shù)據(jù)拷貝操作。IO多路復(fù)用類似于多個(gè)信號驅(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)用程序每次都來詢問。而在NIO中每次向操作系統(tǒng)發(fā)起調(diào)用耕餐,如果資源不可用都會(huì)直接返回凡傅,直到某次調(diào)用遇到可用的資源才進(jìn)行拷貝操作。
IO多路復(fù)用減少了許多無效的系統(tǒng)調(diào)用蛾方,減少了對 CPU 資源的消耗像捶,但它實(shí)際上在數(shù)據(jù)拷貝階段仍然是同步阻塞的。
在LINUX中IO多路復(fù)用有三種機(jī)載select桩砰、poll拓春、epoll。不過windows中也實(shí)現(xiàn)了select亚隅、poll機(jī)制硼莽。
select機(jī)制:在select這種I/O多路復(fù)用機(jī)制下,我們需要把想監(jiān)控的文件描述集合通過函數(shù)參數(shù)的形式告訴select煮纵,然后select會(huì)將這些文件描述符集合拷貝到內(nèi)核中懂鸵,我們知道數(shù)據(jù)拷貝是有性能損耗的,因此為了減少這種數(shù)據(jù)拷貝帶來的性能損耗行疏,Linux內(nèi)核對集合的大小做了限制匆光,并規(guī)定用戶監(jiān)控的文件描述集合不能超過1024個(gè),同時(shí)當(dāng)select返回后我們僅僅能知道有些文件描述符可以讀寫了酿联,但是我們不知道是哪一個(gè)终息,因此程序員必須再遍歷一邊找到具體是哪個(gè)文件描述符可以讀寫了。
poll機(jī)制:poll和select是非常相似的贞让,poll相對于select的優(yōu)化僅僅在于解決了文件描述符不能超過1024個(gè)的限制周崭,select和poll都會(huì)隨著監(jiān)控的文件描述增加而出現(xiàn)性能下降,因此不適合高并發(fā)場景喳张。
epoll:相對于select和poll來說续镇,epoll更加靈活,沒有描述符限制销部。epoll使用一個(gè)文件描述符管理多個(gè)描述符摸航,將用戶相關(guān)的文件描述符的事件存放到內(nèi)核的一個(gè)事件表中,這樣在用戶空間和內(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è)信號告訴它read操作完成了。