每日八股:操作系統(tǒng)
用戶態(tài)和內(nèi)核態(tài)的區(qū)別?
內(nèi)核態(tài)和用戶態(tài)是操作系統(tǒng)下的兩種運(yùn)行模式。它們的主要區(qū)別在于權(quán)限和可執(zhí)行的操作:
內(nèi)核態(tài):在內(nèi)核態(tài)下,CPU可以執(zhí)行所有的指令和訪問所有的硬件資源。這種模式下的操作具有更高的權(quán)限,主要用于操作系統(tǒng)內(nèi)核的運(yùn)行。
用戶態(tài):在用戶態(tài)下,CPU只能運(yùn)行部分指令集,不能直接訪問硬件資源。這種模式下的操作權(quán)限較低,主要用于運(yùn)行用戶程序。
內(nèi)核態(tài)的底層操作主要包括:內(nèi)存管理、進(jìn)程管理、設(shè)備驅(qū)動(dòng)程序控制、系統(tǒng)調(diào)用等,這些操作通常涉及到操作系統(tǒng)的核心功能,需要較高的權(quán)限來執(zhí)行。
分為內(nèi)核態(tài)和用戶態(tài)的原因主要有以下幾點(diǎn):
1.安全性:通過對(duì)權(quán)限的劃分,用戶程序無法直接訪問硬件資源,避免了惡意程序?qū)ο到y(tǒng)資源的破壞。
2.穩(wěn)定性:用戶態(tài)程序出現(xiàn)問題時(shí),不會(huì)影響到整個(gè)系統(tǒng),避免了程序故障導(dǎo)致系統(tǒng)崩潰的風(fēng)險(xiǎn)。
3.隔離性:內(nèi)核態(tài)和用戶態(tài)的劃分使得操作系統(tǒng)內(nèi)核與用戶程序之間有了明確的邊界,有利于系統(tǒng)的模塊化和維護(hù)。
線程和進(jìn)程的區(qū)別是什么?
1.本質(zhì)區(qū)別:進(jìn)程是操作系統(tǒng)資源分配的基本單位,線程是任務(wù)調(diào)度和執(zhí)行的基本單位。
2.在開銷方面:每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(程序上下文),程序之間的切換會(huì)有較大的開銷;線程可以看作是輕量級(jí)的進(jìn)程,同一類線程共享代碼和數(shù)據(jù)空間,每個(gè)線程都有自己獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器,線程之間切換的開銷小。
3.穩(wěn)定性方面:進(jìn)程中的某個(gè)線程崩潰了,可能導(dǎo)致整個(gè)進(jìn)程都崩潰。而進(jìn)程中的某個(gè)子進(jìn)程崩潰了,并不會(huì)影響其他的進(jìn)程。
4.內(nèi)存分配方面:系統(tǒng)在運(yùn)行的時(shí)候會(huì)為每個(gè)進(jìn)程分配內(nèi)存空間;而對(duì)線程而言,除了CPU之外,系統(tǒng)不會(huì)為線程分配內(nèi)存(線程所使用的資源來自所屬進(jìn)程的資源),線程組之間只能共享資源。
5.包含關(guān)系:沒有線程的進(jìn)程可以看作是單線程的;如果一個(gè)進(jìn)程內(nèi)有多個(gè)線程,則執(zhí)行過程不是一條線的,而是多條線。
進(jìn)程,線程,協(xié)程的區(qū)別是什么?
進(jìn)程是操作系統(tǒng)中資源分配和調(diào)度的基本單位,它擁有自己獨(dú)立的內(nèi)存空間和系統(tǒng)資源。每個(gè)進(jìn)程都有獨(dú)立的堆和棧,不與其他進(jìn)程共享。進(jìn)程間通信需要通過特定的機(jī)制,如管道、消息隊(duì)列、信號(hào)量等。由于進(jìn)程擁有獨(dú)立的內(nèi)存空間,因此其穩(wěn)定性和安全性相對(duì)較高,但同時(shí)上下文切換的開銷也較大,因?yàn)樾枰4婧突謴?fù)整個(gè)進(jìn)程的狀態(tài)。
線程是進(jìn)程內(nèi)的一個(gè)執(zhí)行單元,也是CPU調(diào)度和分派的基本單位。與進(jìn)程不同,線程共享進(jìn)程的內(nèi)存空間,包括堆和全局變量。線程之間的通信更加高效,因?yàn)樗鼈兛梢灾苯幼x寫共享內(nèi)存。線程的上下文切換開銷較小,因?yàn)橹恍枰4婧突謴?fù)線程的上下文,而不是整個(gè)進(jìn)程的狀態(tài)。然而,由于多個(gè)線程共享內(nèi)存空間,因此存在數(shù)據(jù)競(jìng)爭(zhēng)和線程安全問題,需要通過同步和互斥機(jī)制來解決。
協(xié)程是一種用戶態(tài)的輕量級(jí)線程,其調(diào)度完全由用戶程序控制,不需要內(nèi)核的參與。協(xié)程擁有之間的寄存器上下文和棧,但與其他協(xié)程共享堆內(nèi)存。協(xié)程的切換開銷非常小,因?yàn)橹恍枰4婧突謴?fù)協(xié)程的上下文,而無需進(jìn)行內(nèi)核級(jí)的上下文切換。這使得協(xié)程在處理大量并發(fā)任務(wù)時(shí)具有非常高的效率。然而,協(xié)程需要程序員顯式的進(jìn)行調(diào)度和管理,相對(duì)于線程和進(jìn)程來說,其編程模型更為復(fù)雜。
為什么進(jìn)程崩潰不會(huì)對(duì)其他進(jìn)程產(chǎn)生很大影響
1.進(jìn)程隔離性:每個(gè)進(jìn)程都有自己獨(dú)立的內(nèi)存空間,當(dāng)一個(gè)進(jìn)程崩潰時(shí),其內(nèi)存空間會(huì)被操作系統(tǒng)收回,不會(huì)影響其他進(jìn)程的內(nèi)存空間。這種進(jìn)程間的隔離性保證了一個(gè)進(jìn)程崩潰不會(huì)直接影響其他進(jìn)程的執(zhí)行。
2.進(jìn)程獨(dú)立性:每個(gè)進(jìn)程都是獨(dú)立運(yùn)行的,它們之間不會(huì)共享資源,如文件、網(wǎng)絡(luò)連接等。因此,一個(gè)進(jìn)程的崩潰通常不會(huì)對(duì)其他進(jìn)程的資源產(chǎn)生影響。
多線程比單線程的優(yōu)勢(shì),劣勢(shì)?
優(yōu)勢(shì):提高程序的運(yùn)行效率,可以充分利用多核處理器的資源,同時(shí)處理多個(gè)任務(wù),加快程序的執(zhí)行速度。
劣勢(shì):存在多線程數(shù)據(jù)競(jìng)爭(zhēng)訪問的問題,需要通過鎖機(jī)制來保證線程安全,增加了加鎖的開銷,可能會(huì)存在死鎖的風(fēng)險(xiǎn)。多線程會(huì)消耗更多的系統(tǒng)資源,如CPU和內(nèi)存,因?yàn)槊總€(gè)線程都需要占用一定的內(nèi)存和處理時(shí)間。
多線程是不是越多越好,太多會(huì)有什么問題?
多線程不一定是越多越好,太多的線程可能會(huì)導(dǎo)致一些問題。
1.切換開銷:線程的創(chuàng)建和切換會(huì)消耗系統(tǒng)資源,包括內(nèi)存和CPU。如果創(chuàng)建過多的線程,會(huì)占用大量的系統(tǒng)資源,導(dǎo)致系統(tǒng)負(fù)載過高,某個(gè)線程崩潰后,可能會(huì)導(dǎo)致進(jìn)程崩潰。
2.死鎖的問題:過多的線程可能會(huì)導(dǎo)致競(jìng)爭(zhēng)條件和死鎖。競(jìng)爭(zhēng)條件是指多個(gè)線程同時(shí)訪問和修改共享資源,如果沒有合適的同步機(jī)制,可能會(huì)導(dǎo)致數(shù)據(jù)不一致或錯(cuò)誤的結(jié)果。而死鎖則是多個(gè)線程相互等待對(duì)方先釋放資源,導(dǎo)致程序無法繼續(xù)執(zhí)行。
線程切換為什么比進(jìn)程切換快,節(jié)省了什么資源?
線程切換比進(jìn)程切換快是因?yàn)榫€程共享同一進(jìn)程的地址空間和資源,在線程切換時(shí)只需要切換堆棧、寄存器和程序計(jì)數(shù)器等少量信息,而不需要切換地址空間,避免了進(jìn)程切換時(shí)需要切換內(nèi)存映射表等大量資源的開銷,從而節(jié)省了時(shí)間和系統(tǒng)資源。
管道有幾種方式?
管道在Linux中有兩種方式:匿名管道和命名管道。
匿名管道:是一種在父子進(jìn)程或兄弟進(jìn)程之間進(jìn)行通信的機(jī)制,只能用于具有親緣關(guān)系的進(jìn)程間通信,通常通過pipe系統(tǒng)調(diào)用創(chuàng)建。
命名管道:是一種允許無關(guān)的進(jìn)程間進(jìn)行通信的機(jī)制,基于文件系統(tǒng),可以在不相關(guān)的進(jìn)程之間進(jìn)行通信。
信號(hào)和信號(hào)量有什么區(qū)別?
信號(hào):一種處理異步事件的方式。信號(hào)是比較復(fù)雜的通信方式,用于通知接收進(jìn)程有某種事件發(fā)生,除了用于進(jìn)程外,還可以發(fā)送信號(hào)給進(jìn)程本身。
信號(hào)量:進(jìn)程間通信處理同步互斥的機(jī)制。是在多線程環(huán)境下使用的一種設(shè)施,它負(fù)責(zé)協(xié)調(diào)各個(gè)線程,以保證它們能夠正確、合理的使用公共資源。
為什么并發(fā)執(zhí)行線程要加鎖?
并發(fā)執(zhí)行線程需要加鎖主要是為了保護(hù)共享數(shù)據(jù),防止出現(xiàn)競(jìng)態(tài)條件。
競(jìng)態(tài)條件是指當(dāng)多個(gè)線程同時(shí)訪問和操作同一塊數(shù)據(jù)時(shí),最終結(jié)果依賴于線程的執(zhí)行順序,這可能導(dǎo)致數(shù)據(jù)的不一致性。
通過加鎖,我們可以確保在任何時(shí)刻只有一個(gè)線程能夠訪問共享數(shù)據(jù),從而避免競(jìng)態(tài)條件,確保數(shù)據(jù)的一致性和完整性。
死鎖發(fā)生條件是什么?
死鎖只有同時(shí)滿足以下四個(gè)條件才會(huì)發(fā)生:
1.互斥條件:互斥條件是指多個(gè)線程不能同時(shí)使用同一資源。
2.持有并等待條件:當(dāng)線程A持有了資源1,又想申請(qǐng)資源2,但資源2已經(jīng)被線程B持有了,所以線程A就會(huì)處于等待狀態(tài),但是線程A在等待資源2的同時(shí)并不會(huì)釋放資源1.
3.不可剝奪條件:當(dāng)線程已經(jīng)持有了資源,在自己使用完之前不能被其他線程所獲取。
4.環(huán)路等待條件:在死鎖發(fā)生的時(shí)候,兩個(gè)線程獲取資源的順序構(gòu)成了環(huán)形鏈。
如何避免死鎖?
避免死鎖問題就只需要破壞其中的一個(gè)條件就可以,最常見的并且可行的就是使用資源有序分配法,來破壞環(huán)路等待條件。
資源有序分配法:線程A和線程B獲取資源的順序要一樣,當(dāng)線程A嘗試獲取資源A,然后嘗試獲取資源B的時(shí)候,線程B同樣也是先嘗試獲取資源A,然后嘗試獲取資源B。也就是說,線程A和線程B總是以相同的順序申請(qǐng)自己想要的資源。
樂觀鎖和悲觀鎖有什么區(qū)別?
樂觀鎖:樂觀鎖假設(shè)多個(gè)事物之間很少發(fā)生沖突,因此在讀取數(shù)據(jù)時(shí)不會(huì)加鎖,而是在更新數(shù)據(jù)時(shí)檢查數(shù)據(jù)的版本(如使用版本號(hào)或時(shí)間戳),如果版本匹配則執(zhí)行更新操作,否則認(rèn)為發(fā)生了沖突。
使用場(chǎng)景:適用于讀多寫少的場(chǎng)景,可以減少鎖的競(jìng)爭(zhēng),提高并發(fā)性能。
悲觀鎖:悲觀鎖假設(shè)多個(gè)事務(wù)之間會(huì)頻繁的發(fā)生沖突,因此在讀取數(shù)據(jù)時(shí)會(huì)加鎖,防止其他事務(wù)對(duì)數(shù)據(jù)進(jìn)行修改,直到當(dāng)前事務(wù)完成操作后才會(huì)釋放鎖。
使用場(chǎng)景:適用于寫多的場(chǎng)景,通過加鎖保證數(shù)據(jù)的一致性。
#八股##操作系統(tǒng)面試總結(jié)##Java選手#