操作系统:操作系统知识点总结
操作系統(tǒng)知識(shí)點(diǎn)總結(jié)
1. 基礎(chǔ)知識(shí)
1.1 內(nèi)核態(tài)和用戶態(tài)
多數(shù)計(jì)算機(jī)有兩種運(yùn)行模式,用戶態(tài)和內(nèi)核態(tài)。軟件中最基礎(chǔ)的部分是操作系統(tǒng),它運(yùn)行在內(nèi)核態(tài)。在這個(gè)模式中,操作系統(tǒng)具有對(duì)所有硬件的完全訪問(wèn)權(quán),可以執(zhí)行機(jī)器能夠運(yùn)行的任何指令。軟件的其余部分運(yùn)行在用戶態(tài),在用戶態(tài)下,只使用了機(jī)器指令中的一個(gè)子集。
核心態(tài)和用戶態(tài)各有優(yōu)勢(shì):運(yùn)行在核心態(tài)的程序可以訪問(wèn)更多資源,但可靠性、安全性要求高,維護(hù)管理都較復(fù)雜;用戶態(tài)程序訪問(wèn)資源受限,但可靠性、安全性要求低,編寫維護(hù)較簡(jiǎn)單。
為了從操作系統(tǒng)中獲得服務(wù),用戶程序必須使用系統(tǒng)調(diào)用陷入內(nèi)核并調(diào)用操作系統(tǒng)。TRAP指令把用戶態(tài)切換成內(nèi)核態(tài)(上下文切換),并啟用操作系統(tǒng)。當(dāng)有關(guān)工作完成之后,在系統(tǒng)調(diào)用后面的指令把控制權(quán)返回給用戶程序。
1.2 什么是操作系統(tǒng)
操作系統(tǒng)是一種運(yùn)行在內(nèi)核態(tài)的軟件,執(zhí)行以下兩個(gè)基本任務(wù):為應(yīng)用程序提供一個(gè)資源集的清晰抽象,并管理這些硬件資源。
1.3 計(jì)算機(jī)硬件
計(jì)算機(jī)硬件包括:CPU、內(nèi)存以及IO設(shè)備。
CPU負(fù)責(zé)從內(nèi)存中取出指令并執(zhí)行。由于用來(lái)訪問(wèn)內(nèi)存以及得到指令或數(shù)據(jù)的時(shí)間要比執(zhí)行指令花費(fèi)的時(shí)間長(zhǎng)得多,因此所有的CPU內(nèi)都有一些用來(lái)保存關(guān)鍵變量和臨時(shí)數(shù)據(jù)的寄存器。除此之外,計(jì)算機(jī)還有一些對(duì)程序員可見(jiàn)的專用寄存器:
·????????程序計(jì)數(shù)器:用于保存下一條指令的內(nèi)存地址。
·????????堆棧指針:指向內(nèi)存中當(dāng)前棧的頂端。
·????????PSW程序狀態(tài)字寄存器:包含了條件碼位,CPU優(yōu)先級(jí),模式(用戶態(tài)或內(nèi)核態(tài)),以及各種控制位。
2. 進(jìn)程與線程
2.1 進(jìn)程與線程的區(qū)別
進(jìn)程:進(jìn)程是一個(gè)正在執(zhí)行程序的示例,擁有自己的程序計(jì)數(shù)器和內(nèi)部狀態(tài),是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位(具有動(dòng)態(tài)、并發(fā)、獨(dú)立、異步的特性,以及就緒、執(zhí)行、阻塞3種狀態(tài),資源擁有單位等屬性);引入進(jìn)程是為了使多個(gè)程序可以并發(fā)的執(zhí)行,以提高系統(tǒng)的資源利用率和吞吐量。
線程:是比進(jìn)程更小的可獨(dú)立運(yùn)行的基本單位,可以看做是輕量級(jí)的進(jìn)程(具有輕型實(shí)體,獨(dú)立調(diào)度分派單位,可并發(fā)執(zhí)行,共享進(jìn)程資源等屬性);引入目的是為了減少程序在并發(fā)執(zhí)行過(guò)程中的開(kāi)銷,使OS的并發(fā)效率更高。
兩者的對(duì)比:
1.???調(diào)度方面:在引入線程的OS中,線程是獨(dú)立的調(diào)度和分派單位,而進(jìn)程作為資源的擁有單位(相當(dāng)于把未引入線程的傳統(tǒng)OS中的進(jìn)程的兩個(gè)屬性分開(kāi)了)。由于線程不擁有資源,因此可以顯著的提高并發(fā)度以及減少切換開(kāi)銷。
2.???并發(fā)性:引入了線程的OS中,進(jìn)程間可以并發(fā),而且一個(gè)進(jìn)程內(nèi)部的多個(gè)線程之間也是可以并發(fā)的,這就使OS具有更好的并發(fā)性,有效的提高了系統(tǒng)資源利用率和吞吐量。
3.????擁有資源:處于安全和方便管理的因素,一個(gè)進(jìn)程往往會(huì)獨(dú)占一些資源,如地址空間、全局變量、打開(kāi)的文件、子進(jìn)程、信號(hào)和賬戶信息等;而為了處理各自的任務(wù),線程也會(huì)獨(dú)占一些資源,如棧、寄存器、程序計(jì)數(shù)器和狀態(tài)等。
4.????系統(tǒng)開(kāi)銷:創(chuàng)建或者撤銷進(jìn)程的時(shí)候,系統(tǒng)要為之創(chuàng)建或回收PCB,系統(tǒng)資源等,切換時(shí)也需要保存和恢復(fù)CPU環(huán)境。而線程的切換只需要保存和恢復(fù)少量的寄存器,不涉及存儲(chǔ)器管理方面的工作,所以開(kāi)銷較小。此外,同一個(gè)進(jìn)程中的多個(gè)線程由于共享地址空間,所以通信同步等都比較方便。
例題:同一個(gè)進(jìn)程中的線程不共享的部分是(F)。(2017阿里巴巴實(shí)習(xí)生筆試題)
?????A、信號(hào)????B、堆????C、文件描述符????D、進(jìn)程組id????E、代碼段????F、棧空間
2.2 進(jìn)程的三種狀態(tài)
1.???就緒狀態(tài):進(jìn)程獲得了除了CPU之外的所有的必要資源,只要獲得CPU就可以立即執(zhí)行,此時(shí)的進(jìn)程處于就緒態(tài)。
2.???運(yùn)行狀態(tài):進(jìn)程已經(jīng)獲得CPU,正在運(yùn)行,在多處理其系統(tǒng)中,會(huì)有多個(gè)進(jìn)程同時(shí)處于運(yùn)行狀態(tài)。
3.???阻塞狀態(tài):處于執(zhí)行狀態(tài)的進(jìn)程由于發(fā)生某些事件而暫時(shí)無(wú)法繼續(xù)執(zhí)行,放棄處理機(jī)而處于暫停狀態(tài),此時(shí)進(jìn)程就處于阻塞(執(zhí)行受到阻塞)狀態(tài)。
進(jìn)程的三種狀態(tài)之間有4種可能的轉(zhuǎn)換關(guān)系:
?
2.3 線程的實(shí)現(xiàn)方式
在用戶空間中實(shí)現(xiàn)線程
? ? 一個(gè)線程阻塞會(huì)導(dǎo)致整個(gè)進(jìn)程(包括進(jìn)程里的所有線程)都阻塞
? ?頁(yè)面失效也會(huì)導(dǎo)致整個(gè)進(jìn)程被掛起
用戶級(jí)線程指不需要內(nèi)核支持而在用戶程序中實(shí)現(xiàn)的線程,其不依賴于操作系統(tǒng)核心,應(yīng)用進(jìn)程利用線程庫(kù)提供創(chuàng)建、同步、調(diào)度和管理線程的函數(shù)來(lái)控制用戶線程。不需要用戶態(tài)/核心態(tài)切換,速度快,操作系統(tǒng)內(nèi)核不知道多線程的存在,因此一個(gè)線程阻塞將使得整個(gè)進(jìn)程(包括它的所有線程)阻塞。由于這里的處理器時(shí)間片分配是以進(jìn)程為基本單位,所以每個(gè)線程執(zhí)行的時(shí)間相對(duì)減少。
在內(nèi)核中實(shí)現(xiàn)線程
內(nèi)核級(jí)線程由操作系統(tǒng)內(nèi)核創(chuàng)建和撤銷。內(nèi)核維護(hù)進(jìn)程及線程的上下文信息以及線程切換。一個(gè)內(nèi)核線程由于I/O操作而阻塞,不會(huì)影響其它線程的運(yùn)行。
在用戶空間中實(shí)現(xiàn)線程的優(yōu)勢(shì)
·????????可以在不支持線程的操作系統(tǒng)中實(shí)現(xiàn)。
·????????創(chuàng)建和銷毀線程、線程切換代價(jià)等線程管理的代價(jià)比內(nèi)核線程少得多。
·????????允許每個(gè)進(jìn)程定制自己的調(diào)度算法,線程管理比較靈活。(每個(gè)線程自定義線程調(diào)度算法)
·????????線程能夠利用的表空間和堆棧空間比內(nèi)核級(jí)線程多。
在用戶空間中實(shí)現(xiàn)線程的缺點(diǎn)
?
·????????同一進(jìn)程中只能同時(shí)有一個(gè)線程在運(yùn)行,如果有一個(gè)線程使用了系統(tǒng)調(diào)用而阻塞,那么整個(gè)進(jìn)程都會(huì)被掛起。
·????????頁(yè)面失效也會(huì)導(dǎo)致整個(gè)進(jìn)程都會(huì)被掛起。
?
內(nèi)核線程的優(yōu)缺點(diǎn)剛好跟用戶線程相反。實(shí)際上,操作系統(tǒng)可以使用混合的方式來(lái)實(shí)現(xiàn)線程。
2.4 線程同步
(數(shù)據(jù)爭(zhēng)用導(dǎo)致線程之間的不同步問(wèn)題,使得系統(tǒng)紊亂)
競(jìng)爭(zhēng)條件:兩個(gè)或多個(gè)線程讀寫某些共享數(shù)據(jù),而最后的結(jié)果取決于線程運(yùn)行的精確時(shí)序。為避免競(jìng)爭(zhēng)條件,需要找到某種途徑組織多個(gè)線程同時(shí)讀寫共享的數(shù)據(jù)。這里,我們把對(duì)共享數(shù)據(jù)(共享內(nèi)存)進(jìn)行訪問(wèn)的程序片段稱之為臨界區(qū),只要我們能夠使兩個(gè)線程不可能同時(shí)處于臨界區(qū),就能夠避免競(jìng)爭(zhēng)條件。
同步機(jī)制需要遵循的原則:
1.???空閑讓進(jìn):當(dāng)沒(méi)有線程處于臨界區(qū)的時(shí)候,應(yīng)該許可其他線程進(jìn)入臨界區(qū)的申請(qǐng)。
2.???忙則等待:當(dāng)前如果有線程處于臨界區(qū),如果有其他線程申請(qǐng)進(jìn)入,則必須等待,保證對(duì)臨界區(qū)的互斥訪問(wèn)。
3.???有限等待:對(duì)要求訪問(wèn)臨界資源的線程,需要在有限時(shí)間內(nèi)進(jìn)入臨界區(qū),防止出現(xiàn)死等。
4.???讓權(quán)等待:當(dāng)線程無(wú)法進(jìn)入臨界區(qū)的時(shí)候,需要釋放處理機(jī),別陷入忙等。
線程同步的常用方法:互斥鎖,條件變量,信號(hào)量。
互斥鎖:同一時(shí)刻只允許一個(gè)線程進(jìn)入臨界區(qū)。互斥鎖有兩個(gè)基本操作,加鎖和解鎖。一個(gè)線程如果想要進(jìn)入臨界區(qū),它首先需要嘗試鎖住相關(guān)的互斥量。如果互斥量沒(méi)有加鎖,那么這個(gè)線程可以立即進(jìn)入,并對(duì)互斥量進(jìn)行加鎖以防止其他線程進(jìn)入。如果互斥量已經(jīng)被加鎖,則調(diào)用線程被阻塞,直至該互斥量被解鎖。
條件變量:允許線程由于一些未達(dá)到的條件而阻塞,通常與互斥鎖配合使用。條件變量的基本操作有:觸發(fā)條件(當(dāng)條件變?yōu)?true 時(shí));等待條件,掛起線程直到其他線程觸發(fā)條件。(條件變量一般需要觸發(fā)條件,這個(gè)在編寫代碼的時(shí)候,用戶自定義)
·????????在等待進(jìn)程中,需要等待該條件,即需要_cond.wait();wait()過(guò)程將會(huì)把調(diào)用線程放到等待條件的線程列表上,然后對(duì)該互斥量解鎖;此時(shí)在互斥量解鎖期間,又有新的線程進(jìn)入該臨界區(qū),條件尚未發(fā)生,wait()會(huì)繼續(xù)這一過(guò)程。
·????????在喚醒進(jìn)程中,首先會(huì)進(jìn)行條件檢查(已經(jīng)被同一個(gè)互斥量鎖住,睡眠的線程不可能錯(cuò)過(guò));如果條件成立,則喚醒等待進(jìn)程。(因此,wait()一般要放置在循環(huán)中,或者使用double check)
·????????需要使用while(_count > 0),而不是if (_count > 0),(可以使用兩個(gè)if來(lái)代替while),原因?yàn)楫?dāng)線程從_cond.wait()喚醒時(shí),此時(shí)互斥量會(huì)繼續(xù)被鎖住(此時(shí)多個(gè)線程對(duì)互斥量爭(zhēng)用的問(wèn)題),很有可能此時(shí)的條件會(huì)被其他線程修改,造成_count > 0的條件不成立,因此需要繼續(xù)判斷的。
信號(hào)量:為控制一個(gè)具有有限數(shù)量的用戶資源而設(shè)計(jì)。它允許多個(gè)線程在同一個(gè)時(shí)刻去訪問(wèn)同一個(gè)資源,但一般需要限制同一時(shí)刻訪問(wèn)此資源的最大線程數(shù)目。
Pthread中的函數(shù)調(diào)用
創(chuàng)建互斥鎖:int pthread_mutex_init(pthread_mutex_t*mutex,const pthread_mutexattr_t*restrict attr)
加鎖:int pthread_mutex_lock(pthread_mutex_t*mutex)
解鎖:int pthread_mutex_unlock(pthread_mutex_t*mutex)
銷毀互斥鎖:pthread_mutex_destroy ()
?
初始化條件變量:pthread_cond_init(pthread_cond_t*cond,pthread_condattr_t *cond_attr)
無(wú)條件等待:pthread_cond_wait(pthread_cond_t*cond,pthread_mutex_t *mutex)
計(jì)時(shí)等待:pthread_cond_timewait(pthread_cond_t*cond,pthread_mutex *mutex,const timespec *abstime)
激活一個(gè)等待該條件的線程:pthread_cond_signal(pthread_cond_t*cond)
激活所有等待線程:pthread_cond_broadcast(pthread_cond_t*cond)
銷毀條件變量:pthread_cond_destroy(pthread_cond_t*cond)
經(jīng)典的進(jìn)程同步問(wèn)題:生產(chǎn)者-消費(fèi)者問(wèn)題;
哲學(xué)家進(jìn)餐問(wèn)題;讀者-寫者問(wèn)題。
2.5 進(jìn)程間通信
進(jìn)程間通信的方式有管道、消息隊(duì)列、共享內(nèi)存、信號(hào)、信號(hào)量和套接字等。
1.???管道:管道是連接兩個(gè)一個(gè)讀進(jìn)程和一個(gè)寫進(jìn)程之間用于實(shí)現(xiàn)數(shù)據(jù)交換的一個(gè)共享文件。為了協(xié)調(diào)管道通信雙方,需要管道機(jī)制實(shí)現(xiàn)如下功能:
1)互斥:同一時(shí)刻只能有一個(gè)進(jìn)程對(duì)管道進(jìn)行讀寫;(半雙工)
2)同步:當(dāng)讀端發(fā)現(xiàn)管道為空的時(shí)候需要睡眠等待,直到有數(shù)據(jù)時(shí)候被喚醒(空了沒(méi)得讀),相應(yīng)的寫端也是在管道已滿的時(shí)候等待直到被喚醒(滿了寫不進(jìn)去);
3)確定對(duì)方的存在性:只有同時(shí)有讀端和寫端,管道才有存在意義。它包括無(wú)名管道和有名管道(FIFO)兩種,前者用于父進(jìn)程和子進(jìn)程間的通信,后者用于運(yùn)行于同一臺(tái)機(jī)器上的任意兩個(gè)進(jìn)程間的通信()。
?無(wú)名管道:int pipe(int fd);
?有名管道:int??mkfifo(const char* pathname,mode_t mode);?
2.???信號(hào)量是一個(gè)計(jì)數(shù)器,可以用來(lái)控制多個(gè)進(jìn)程對(duì)共享資源的訪問(wèn)。它常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問(wèn)共享資源時(shí),其他進(jìn)程也訪問(wèn)該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。
3.??消息隊(duì)列是由消息存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。其基本思想是根據(jù)”生產(chǎn)者-消費(fèi)者”原理,利用內(nèi)存中公用消息緩沖區(qū)實(shí)現(xiàn)進(jìn)程之間的信息交換。每當(dāng)一個(gè)進(jìn)程向另一個(gè)進(jìn)程發(fā)送消息時(shí),便申請(qǐng)一個(gè)消息緩沖區(qū),并把已準(zhǔn)備好的消息送到緩沖區(qū),然后把該消息緩沖區(qū)插入到接收進(jìn)程的消息隊(duì)列中,最后通知接收進(jìn)程。接收進(jìn)程收到發(fā)送里程發(fā)來(lái)的通知后,從本進(jìn)程的消息隊(duì)列中摘下一消息緩沖區(qū),取出所需的信息,然后把消息緩沖區(qū)不定期給系統(tǒng)。系統(tǒng)負(fù)責(zé)管理公用消息緩沖區(qū)以及消息的傳遞。
4.???信號(hào)是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生。
5.???共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問(wèn)的內(nèi)存,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪問(wèn)。共享內(nèi)存是最快的IPC方式,它是針對(duì)其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計(jì)的。它往往與其他通信機(jī)制,如信號(hào)量,配合使用,來(lái)實(shí)現(xiàn)進(jìn)程間的同步和通信。
6.???套接字也是一種進(jìn)程間通信機(jī)制,可以實(shí)現(xiàn)不同主機(jī)間的進(jìn)程通信。一個(gè)套接口可以看做是進(jìn)程間通信的端點(diǎn),每個(gè)套接口的名字是唯一的,其他進(jìn)程可以訪問(wèn),連接和進(jìn)行數(shù)據(jù)通信。
2.6 進(jìn)程調(diào)度算法
基本調(diào)度算法:
1.???先來(lái)先服務(wù)FCFS:既可以作為作業(yè)調(diào)度算法也可以作為進(jìn)程調(diào)度算法;按作業(yè)或者進(jìn)程到達(dá)的先后順序依次調(diào)度;因此對(duì)于長(zhǎng)作業(yè)比較有利。
2.???短作業(yè)優(yōu)先SPF:作業(yè)調(diào)度算法,算法從就緒隊(duì)列中選擇估計(jì)時(shí)間最短的作業(yè)進(jìn)行處理,直到得出結(jié)果或者無(wú)法繼續(xù)執(zhí)行;
缺點(diǎn):不利于長(zhǎng)作業(yè);未考慮作業(yè)的重要性;運(yùn)行時(shí)間是預(yù)估的,并不靠譜。
3.???** 高優(yōu)先權(quán)優(yōu)先HRRF**:既可以作為作業(yè)調(diào)度也可以作為進(jìn)程調(diào)度算法;調(diào)度作業(yè)時(shí),從就緒隊(duì)列中選擇優(yōu)先級(jí)最高的作業(yè)進(jìn)行處理;由于涉及到了優(yōu)先級(jí),因此可以分為搶占式和非搶占式;而且優(yōu)先級(jí)的確定也可以分為靜態(tài)優(yōu)先級(jí)(事先根據(jù)進(jìn)程類型,進(jìn)程對(duì)資源的需求,用戶要求等方面確定一個(gè)固定值);動(dòng)態(tài)優(yōu)先級(jí)(隨進(jìn)程的推進(jìn)或者等待時(shí)間而增加或者減少)。
4.???最高響應(yīng)比優(yōu)先HRN:FCFS可能造成短作業(yè)用戶不滿,SPF可能使得長(zhǎng)作業(yè)用戶不滿,于是提出HRN,選擇響應(yīng)比最高的作業(yè)運(yùn)行。(考慮等待和處理時(shí)間因素)響應(yīng)比=1+作業(yè)等待時(shí)間/作業(yè)處理時(shí)間。
5.???時(shí)間片輪轉(zhuǎn):按到達(dá)的先后對(duì)進(jìn)程放入隊(duì)列中,然后給隊(duì)首進(jìn)程分配CPU時(shí)間片,時(shí)間片用完之后計(jì)時(shí)器發(fā)出中斷,暫停當(dāng)前進(jìn)程并將其放到隊(duì)列尾部,循環(huán)。
6.???多級(jí)反饋隊(duì)列:目前公認(rèn)較好的調(diào)度算法;設(shè)置多個(gè)就緒隊(duì)列并為每個(gè)隊(duì)列設(shè)置不同的優(yōu)先級(jí),第一個(gè)隊(duì)列優(yōu)先級(jí)最高,其余依次遞減。優(yōu)先級(jí)越高的隊(duì)列分配的時(shí)間片越短,進(jìn)程到達(dá)之后按FCFS放入第一個(gè)隊(duì)列,如果調(diào)度執(zhí)行后沒(méi)有完成,那么放到第二個(gè)隊(duì)列尾部等待調(diào)度,如果第二次調(diào)度仍然沒(méi)有完成,放入第三隊(duì)列尾部…。只有當(dāng)前一個(gè)隊(duì)列為空的時(shí)候才會(huì)去調(diào)度下一個(gè)隊(duì)列的進(jìn)程。
3. 死鎖
死鎖是指多個(gè)進(jìn)程在運(yùn)行過(guò)程中,因?yàn)?strong>爭(zhēng)奪資源而造成的一種僵局,如果沒(méi)有外力推進(jìn),處于僵局中的進(jìn)程就無(wú)法繼續(xù)執(zhí)行。
3.1 死鎖原因:
1.???競(jìng)爭(zhēng)資源:請(qǐng)求同一有限資源的進(jìn)程數(shù)多于可用資源數(shù)
2.???進(jìn)程推進(jìn)順序是非法的:進(jìn)程執(zhí)行中,請(qǐng)求和釋放資源順序不合理,如資源等待鏈
3.2 死鎖產(chǎn)生的必要條件:
1.???互斥條件:進(jìn)程對(duì)所分配的資源進(jìn)行排他性的使用
2.???請(qǐng)求和保持條件:進(jìn)程被阻塞的時(shí)候并不釋放鎖申請(qǐng)到的資源
3.???不可剝奪條件:進(jìn)程對(duì)于已經(jīng)申請(qǐng)到的資源在使用完成之前不可以被剝奪
4.???環(huán)路等待條件:發(fā)生死鎖的時(shí)候存在的一個(gè)進(jìn)程-資源環(huán)形等待鏈
3.3 死鎖處理:
1.???預(yù)防死鎖:破壞產(chǎn)生死鎖的4個(gè)必要條件中的一個(gè)或者多個(gè);實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,但是如果限制過(guò)于嚴(yán)格會(huì)降低系統(tǒng)資源利用率以及吞吐量
2.???避免死鎖:在資源的動(dòng)態(tài)分配中,防止系統(tǒng)進(jìn)入不安全狀態(tài)(可能產(chǎn)生死鎖的狀態(tài))-如銀行家算法
3.???檢測(cè)死鎖:允許系統(tǒng)運(yùn)行過(guò)程中產(chǎn)生死鎖,在死鎖發(fā)生之后,采用一定的算法進(jìn)行檢測(cè),并確定與死鎖相關(guān)的資源和進(jìn)程,采取相關(guān)方法清除檢測(cè)到的死鎖。實(shí)現(xiàn)難度大
4.???解除死鎖:與死鎖檢測(cè)配合,將系統(tǒng)從死鎖中解脫出來(lái)(撤銷進(jìn)程或者剝奪資源)。對(duì)檢測(cè)到的和死鎖相關(guān)的進(jìn)程以及資源,通過(guò)撤銷或者掛起的方式,釋放一些資源并將其分配給處于阻塞狀態(tài)的進(jìn)程,使其轉(zhuǎn)變?yōu)榫途w態(tài)。實(shí)現(xiàn)難度大
例題:列舉一種死鎖發(fā)生的場(chǎng)景,并給出解決方案。(PPS2013校園招聘筆試題)
答:最經(jīng)典的場(chǎng)景就是生產(chǎn)者/消費(fèi)者,生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個(gè)空緩沖區(qū)中供消費(fèi)者線程消費(fèi)。消費(fèi)者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。由于生產(chǎn)者/消費(fèi)者都在操作緩沖區(qū),容易導(dǎo)致死鎖的發(fā)生。可以通過(guò)添加鎖的保護(hù)來(lái)對(duì)緩沖區(qū)進(jìn)行互斥的訪問(wèn),保證某一時(shí)刻只有一個(gè)線程對(duì)緩沖區(qū)進(jìn)行操作,當(dāng)緩沖區(qū)滿的時(shí)候,生產(chǎn)者線程就會(huì)掛起,同時(shí)通知消費(fèi)者線程。而緩沖區(qū)空的時(shí)候,消費(fèi)者線程就會(huì)掛起,同時(shí)通知生產(chǎn)者線程。
4. 存儲(chǔ)管理
4.1 內(nèi)存管理方式
由于連續(xù)內(nèi)存分配方式(單一連續(xù)分配,固定分區(qū)分配,動(dòng)態(tài)分區(qū)分配,動(dòng)態(tài)重定位分區(qū)分配)導(dǎo)致的內(nèi)存利用率偏低以及內(nèi)存碎片的問(wèn)題,進(jìn)而引出離散的內(nèi)存分配方式。離散內(nèi)存分配可以從OS的內(nèi)存管理角度引出頁(yè)式(離散分配的基本單位是頁(yè))管理,也可以從程序編制角度引出段式(離散分配的基本單位是段)管理。
基本分頁(yè)存儲(chǔ)管理
基本分頁(yè)存儲(chǔ)管理中不具備頁(yè)面置換功能(即沒(méi)有實(shí)現(xiàn)虛擬內(nèi)存的功能),因此需要整個(gè)程序的所有頁(yè)面都裝入內(nèi)存之后才可以運(yùn)行。因?yàn)槌绦驍?shù)據(jù)存儲(chǔ)在不同的頁(yè)面中,而頁(yè)面又離散的分布在內(nèi)存中,因此需要一個(gè)頁(yè)表來(lái)記錄邏輯地址和實(shí)際存儲(chǔ)地址之間的映射關(guān)系,以實(shí)現(xiàn)從頁(yè)號(hào)到物理塊號(hào)(頁(yè)框)的映射。由于頁(yè)表也是存儲(chǔ)在內(nèi)存中的,因此和不適用分頁(yè)管理的存儲(chǔ)方式相比,訪問(wèn)分頁(yè)系統(tǒng)中內(nèi)存數(shù)據(jù)需要兩次的內(nèi)存訪問(wèn)(一次是從內(nèi)存中訪問(wèn)頁(yè)表,從中找到指定的物理塊號(hào),加上頁(yè)內(nèi)偏移得到實(shí)際物理地址;第二次就是根據(jù)第一次得到的物理地址訪問(wèn)內(nèi)存取出數(shù)據(jù))。
為了減少兩次訪問(wèn)內(nèi)存導(dǎo)致的效率影響,分頁(yè)管理中引入了快表(或者聯(lián)想寄存器)機(jī)制(緩存TLB),包含快表機(jī)制的內(nèi)存管理中,當(dāng)要訪問(wèn)內(nèi)存數(shù)據(jù)的時(shí)候,首先將頁(yè)號(hào)在快表中查詢,如果查找到說(shuō)明要訪問(wèn)的頁(yè)表項(xiàng)在快表中,那么直接從快表中讀取相應(yīng)的物理塊號(hào);如果沒(méi)有找到,那么訪問(wèn)內(nèi)存中的頁(yè)表,從頁(yè)表中得到物理地址,同時(shí)將頁(yè)表中的該映射表項(xiàng)添加到快表中(可能存在快表?yè)Q出算法)。
基本分段存儲(chǔ)管理方式
分頁(yè)是為了提高內(nèi)存利用率,而分段是為了滿足程序員在編寫代碼的時(shí)候的一些邏輯需求(比如數(shù)據(jù)共享,數(shù)據(jù)保護(hù),動(dòng)態(tài)鏈接等)。
分段內(nèi)存管理當(dāng)中,地址是二維的,一維是段號(hào),一維是段內(nèi)地址;其中每個(gè)段的長(zhǎng)度是不一樣的,而且每個(gè)段內(nèi)部都是從0開(kāi)始編址的。由于分段管理中,每個(gè)段內(nèi)部是連續(xù)內(nèi)存分配,但是段和段之間是離散分配的,因此也存在一個(gè)邏輯地址到物理地址的映射關(guān)系,相應(yīng)的就是段表機(jī)制。段表中的每一個(gè)表項(xiàng)記錄了該段在內(nèi)存中的起始地址和該段的長(zhǎng)度。段表可以放在內(nèi)存中也可以放在寄存器中。
訪問(wèn)內(nèi)存的時(shí)候根據(jù)段號(hào)和段表項(xiàng)的長(zhǎng)度計(jì)算當(dāng)前訪問(wèn)段在段表中的位置,然后訪問(wèn)段表,得到該段的物理地址,根據(jù)該物理地址以及段內(nèi)偏移量就可以得到需要訪問(wèn)的內(nèi)存。由于也是兩次內(nèi)存訪問(wèn),所以分段管理中同樣引入了聯(lián)想寄存器。
分段和分頁(yè)的對(duì)比:
1.???頁(yè)是信息的物理單位,是出于系統(tǒng)內(nèi)存利用率的角度提出的離散分配機(jī)制;段是信息的邏輯單位,每個(gè)段含有一組意義完整的信息,是出于用戶角度提出的內(nèi)存管理機(jī)制。
2.???頁(yè)的大小是固定的,由系統(tǒng)決定;段的大小是不確定的,由用戶決定。
3.???頁(yè)地址空間是一維的,段地址空間是二維的。
段頁(yè)式存儲(chǔ)管理
先將用戶程序分為若干個(gè)段,然后再把每個(gè)段分成若干個(gè)頁(yè),并且為每一個(gè)段賦予一個(gè)段名稱。這樣在段頁(yè)式管理中,一個(gè)內(nèi)存地址就由段號(hào),段內(nèi)頁(yè)號(hào)以及頁(yè)內(nèi)地址三個(gè)部分組成。
段頁(yè)式內(nèi)存訪問(wèn):系統(tǒng)中設(shè)置了一個(gè)段表寄存器,存放段表的起始地址和段表的長(zhǎng)度。地址變換時(shí),根據(jù)給定的段號(hào)(還需要將段號(hào)和寄存器中的段表長(zhǎng)度進(jìn)行比較防止越界)以及寄存器中的段表起始地址,就可以得到該段對(duì)應(yīng)的段表項(xiàng),從段表項(xiàng)中得到該段對(duì)應(yīng)的頁(yè)表的起始地址,然后利用邏輯地址中的段內(nèi)頁(yè)號(hào)從頁(yè)表中找到頁(yè)表項(xiàng),從該頁(yè)表項(xiàng)中的物理塊地址以及邏輯地址中的頁(yè)內(nèi)地址拼接出物理地址,最后用這個(gè)物理地址訪問(wèn)得到所需數(shù)據(jù)。由于訪問(wèn)一個(gè)數(shù)據(jù)需要三次內(nèi)存訪問(wèn),所以段頁(yè)式管理中也引入了高速緩沖寄存器。
4.2 虛擬內(nèi)存
如果存在一個(gè)程序,所需內(nèi)存空間超過(guò)了計(jì)算機(jī)可以提供的實(shí)際內(nèi)存,那么由于該程序無(wú)法裝入內(nèi)存所以也就無(wú)法運(yùn)行。單純的增加物理內(nèi)存只能解決一部分問(wèn)題,但是仍然會(huì)出現(xiàn)無(wú)法裝入單個(gè)或者無(wú)法同時(shí)裝入多個(gè)程序的問(wèn)題。
虛擬內(nèi)存就是具有請(qǐng)求調(diào)入功能和置換功能,可以從邏輯上對(duì)內(nèi)存容量加以擴(kuò)充的一種存儲(chǔ)器系統(tǒng)。它使得應(yīng)用程序認(rèn)為它擁有連續(xù)可用的內(nèi)存(一個(gè)連續(xù)完整的地址空間),允許運(yùn)行比實(shí)際系統(tǒng)擁有的內(nèi)存大得多的程序。而實(shí)際上,它通常被分割成多個(gè)物理內(nèi)存碎片,還有部分暫時(shí)存儲(chǔ)在外部磁盤存儲(chǔ)器上,在需要時(shí)進(jìn)行數(shù)據(jù)交換。
虛擬內(nèi)存的基本思想:每個(gè)程序擁有自己的地址空間,這個(gè)空間被分割成很多塊,每一塊稱作一頁(yè)或頁(yè)面。每一頁(yè)有連續(xù)的地址范圍。這些也被映射到物理內(nèi)存,但并不是所有的頁(yè)都必須在內(nèi)存中才能運(yùn)行程序。當(dāng)程序引用到一部分在物理內(nèi)存中的地址空間時(shí),由硬件立刻執(zhí)行必要的映射。當(dāng)程序引用到一部分不再物理內(nèi)存中的地址空間時(shí),由操作系統(tǒng)負(fù)責(zé)將缺失部分裝入物理內(nèi)存并重新執(zhí)行失敗的指令,這個(gè)過(guò)程或陷阱稱為缺頁(yè)中斷(或頁(yè)錯(cuò)誤)。
虛存的代價(jià):
·????????虛存的管理需要建立很多數(shù)據(jù)結(jié)構(gòu),占用額外內(nèi)存。
·????????虛擬地址到物理地址的轉(zhuǎn)換,增加了指令執(zhí)行時(shí)間。
·????????頁(yè)式的換入換出需要磁盤I/O,耗費(fèi)時(shí)間。
·????????如果一頁(yè)中只有部分?jǐn)?shù)據(jù),浪費(fèi)內(nèi)存。
例題:計(jì)算缺頁(yè)中斷次數(shù)。(2014淘寶筆試題)
有一虛擬存儲(chǔ)系統(tǒng),若進(jìn)程在內(nèi)存中占3頁(yè)(開(kāi)始時(shí)內(nèi)存為空),若采用先進(jìn)先出頁(yè)面置換算法,當(dāng)執(zhí)行如下訪頁(yè)頁(yè)號(hào)序列后1,2,3,4,1,2,5,1,2,3,4,5,會(huì)產(chǎn)生(10)次缺頁(yè)?
4.3 頁(yè)面置換算法
1.???最優(yōu)頁(yè)面置換算法:只具有理論意義的算法,用來(lái)評(píng)價(jià)其他頁(yè)面置換算法。置換策略是將當(dāng)前頁(yè)面中在未來(lái)最長(zhǎng)時(shí)間內(nèi)不會(huì)被訪問(wèn)的頁(yè)置換出去。
2.???先進(jìn)先出置換算法:由操作系統(tǒng)維護(hù)一個(gè)所有當(dāng)前在內(nèi)存中的頁(yè)面的鏈表,最新進(jìn)入的頁(yè)面放在表尾,最早進(jìn)入的頁(yè)面放在表頭;當(dāng)發(fā)生缺頁(yè)中斷時(shí),淘汰表頭的頁(yè)面并將新調(diào)入的頁(yè)面追加到表尾。簡(jiǎn)單粗暴的一種置換算法,沒(méi)有考慮頁(yè)面訪問(wèn)頻率信息。
3.???最近最少使用算法LRU:算法賦予每個(gè)頁(yè)面一個(gè)訪問(wèn)字段,用來(lái)記錄上次頁(yè)面被訪問(wèn)到現(xiàn)在所經(jīng)歷的時(shí)間t,每次置換的時(shí)候把t值最大的頁(yè)面置換出去(實(shí)現(xiàn)方面可以采用寄存器或者棧的方式實(shí)現(xiàn))。
4.???時(shí)鐘置換算法(也被稱為最近未使用算法NRU):頁(yè)面設(shè)置一個(gè)訪問(wèn)位,頁(yè)面被訪問(wèn)的時(shí)候訪問(wèn)位設(shè)置為1;并將所有頁(yè)面保存在一個(gè)循環(huán)隊(duì)列中,表針指向最老的頁(yè)面。頁(yè)面置換的時(shí)候,如果當(dāng)前指針?biāo)疙?yè)面訪問(wèn)為為0,那么置換,否則將其置為0,循環(huán)直到遇到一個(gè)訪問(wèn)為位0的頁(yè)面。
5.???改進(jìn)型Clock算法:在Clock算法的基礎(chǔ)上添加一個(gè)修改位,替換時(shí)根究訪問(wèn)位和修改位綜合判斷。優(yōu)先替換訪問(wèn)為何修改位都是0的頁(yè)面,其次是訪問(wèn)位為0修改位為1的頁(yè)面。
6.???最少使用算法LFU:設(shè)置寄存器記錄頁(yè)面被訪問(wèn)次數(shù),每次置換的時(shí)候置換當(dāng)前訪問(wèn)次數(shù)最少的。存在問(wèn)題是該訪問(wèn)寄存器并不能真正反映當(dāng)前頁(yè)面訪問(wèn)次數(shù),因?yàn)樵L問(wèn)速度比較快,所以在更新寄存器的時(shí)間間隔內(nèi)訪問(wèn)1次和訪問(wèn)100次都是一樣的。另外,LFU和LRU是很類似的,支持硬件也是一樣的,但是區(qū)分兩者的關(guān)鍵在于一個(gè)以時(shí)間為標(biāo)準(zhǔn),一個(gè)以次數(shù)為標(biāo)準(zhǔn)(例如對(duì)于寄存器 pa 001111 和pb 111000,兩個(gè)頁(yè)面,如果采用LRU,那么被淘汰的是pa,如果采用LFU那么被淘汰的是pb)。
7.???頁(yè)面緩沖算法PBA:置換的時(shí)候,頁(yè)面無(wú)論是否被修改過(guò),都不被置換到磁盤,而是先暫留在內(nèi)存中的頁(yè)面鏈表(已修改頁(yè)面鏈表和未修改頁(yè)面鏈表,也可以不區(qū)分)里面,當(dāng)其再次被訪問(wèn)的時(shí)候可以直接從這些鏈表中取出而不必進(jìn)行磁盤IO,當(dāng)鏈表中已修改也難數(shù)目達(dá)到一定數(shù)量之后,進(jìn)行依次寫磁盤操作(相當(dāng)于將多次IO合并為一次)
5. 鏈接
**靜態(tài)鏈接庫(kù)的優(yōu)點(diǎn) **
·????????代碼裝載速度快,執(zhí)行速度略比動(dòng)態(tài)鏈接庫(kù)快;
·????????只需保證在開(kāi)發(fā)者的計(jì)算機(jī)中有正確的.LIB文件,在以二進(jìn)制形式發(fā)布程序時(shí)不需考慮在用戶的計(jì)算機(jī)上.LIB文件是否存在及版本問(wèn)題,可避免DLL地獄等問(wèn)題。
動(dòng)態(tài)鏈接庫(kù)的優(yōu)點(diǎn)
·????????更加節(jié)省內(nèi)存并減少頁(yè)面交換;
·????????DLL文件與EXE文件獨(dú)立,只要輸出接口不變(即名稱、參數(shù)、返回值類型和調(diào)用約定不變),更換DLL文件不會(huì)對(duì)EXE文件造成任何影響,因而極大地提高了可維護(hù)性和可擴(kuò)展性;
·????????不同編程語(yǔ)言編寫的程序只要按照函數(shù)調(diào)用約定就可以調(diào)用同一個(gè)DLL函數(shù);
·????????適用于大規(guī)模的軟件開(kāi)發(fā),使開(kāi)發(fā)過(guò)程獨(dú)立、耦合度小,便于不同開(kāi)發(fā)者和開(kāi)發(fā)組織之間進(jìn)行開(kāi)發(fā)和測(cè)試。
不足之處
·????????使用靜態(tài)鏈接生成的可執(zhí)行文件體積較大,包含相同的公共代碼,造成浪費(fèi);
·????????使用動(dòng)態(tài)鏈接庫(kù)的應(yīng)用程序不是自完備的,它依賴的DLL模塊也要存在,如果使用載入時(shí)動(dòng)態(tài)鏈接,程序啟動(dòng)時(shí)發(fā)現(xiàn)DLL不存在,系統(tǒng)將終止程序并給出錯(cuò)誤信息。而使用運(yùn)行時(shí)動(dòng)態(tài)鏈接,系統(tǒng)不會(huì)終止,但由于DLL中的導(dǎo)出函數(shù)不可用,程序會(huì)加載失敗;速度比靜態(tài)鏈接慢。當(dāng)某個(gè)模塊更新后,如果新模塊與舊的模塊不兼容,那么那些需要該模塊才能運(yùn)行的軟件,統(tǒng)統(tǒng)撕掉。這在早期Windows中很常見(jiàn)。
?
總結(jié)
以上是生活随笔為你收集整理的操作系统:操作系统知识点总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 系统设计:负载均衡(负载均衡算法、转发实
- 下一篇: java信息管理系统总结_java实现科