對(duì)計(jì)算機(jī)系統(tǒng)而言,操作系統(tǒng)充當(dāng)著基石的作用,它是連接計(jì)算機(jī)底層硬件與上層利用軟件的橋梁,控制其他程序的運(yùn)行,并且管理系統(tǒng)相干資源,同時(shí)提供配套的系統(tǒng)軟件支持。對(duì)專業(yè)的程序員而言,掌握1定的操作系統(tǒng)知識(shí)比不可少,由于不管面對(duì)的是底層嵌入式開(kāi)發(fā),還是上層的云計(jì)算開(kāi)發(fā),都需要使用到1定的操作系統(tǒng)相干知識(shí)。
常見(jiàn)的內(nèi)存管理方式有塊式管理、頁(yè)式管理、段式和段頁(yè)式管理。
(1)塊式管理:把主存分為1大塊1大塊的,當(dāng)所需的程序片斷不在主存時(shí)就分配1塊主存空間,把程序片斷l(xiāng)oad入主存,就算所需的程序片斷只有幾個(gè)字節(jié)也只能把這1塊分配給它。這樣會(huì)造成很大的浪費(fèi),平均浪費(fèi)了50%的內(nèi)存空間,但是易于管理。
(2)頁(yè)式管理:把主存分為1頁(yè)1頁(yè)的,每頁(yè)的空間要比1塊1塊的空間小很多,這類方法的空間利用率要比塊式管理高很多
(3)段式管理:把主存分為1段1段的,每段的空間又要比1頁(yè)1頁(yè)的空間小很多,這類方法在空間利用率上又比頁(yè)式管理高很多,但是也有另外1個(gè)缺點(diǎn)。1個(gè)程序片斷可能會(huì)被分為幾10段,這樣很多時(shí)間就會(huì)被浪費(fèi)在計(jì)算每段的物理地址上。
(4)段頁(yè)式管理:結(jié)合了段式管理和頁(yè)式管理的優(yōu)點(diǎn)。把主存先分成若干段,每一個(gè)段又分成若干頁(yè)。段頁(yè)式管理每取1護(hù)具,要訪問(wèn)3次內(nèi)存。
頁(yè)是信息的物理單位,分頁(yè)是為了實(shí)現(xiàn)離散分配方式,以消減內(nèi)存的外零頭,提高內(nèi)存的利用率;或說(shuō),分頁(yè)僅僅是由于系統(tǒng)管理的需要,而不是用戶的需要。
段是信息的邏輯單位,它含有1組其意義相對(duì)完全的信息。分段的目的是為了能更好地滿足用戶的需要。頁(yè)的大小固定且由系統(tǒng)肯定,把邏輯地址劃分為頁(yè)號(hào)和頁(yè)內(nèi)地址兩部份,是由機(jī)器硬件實(shí)現(xiàn)的,因此1個(gè)系統(tǒng)只能有1種大小的頁(yè)面。段的長(zhǎng)度卻不固定,決定于用戶所編寫的程序,通常由編譯程序在對(duì)源程序進(jìn)程編輯時(shí),根據(jù)信息的性質(zhì)來(lái)劃分。
分頁(yè)的作業(yè)地址空間是1維的,即單1的線性空間,程序員只需利用1個(gè)記憶符,便可表示1地址。分段的作業(yè)地址空間是2維的,程序員在標(biāo)識(shí)1個(gè)地址時(shí),既需給出段名,又需給出段內(nèi)地址。
虛擬內(nèi)存簡(jiǎn)稱虛存,是計(jì)算機(jī)系統(tǒng)內(nèi)存管理的1種技術(shù)。它是相對(duì)物理內(nèi)存而言的,可以理解為“假的”內(nèi)存。它使得利用程序認(rèn)為它具有連續(xù)可用的內(nèi)存(1個(gè)連續(xù)完全的地址空間),允許程序員編寫并允許比實(shí)際系統(tǒng)具有的內(nèi)存大很多的程序,這使得許多大型軟件項(xiàng)目能夠在具有有限內(nèi)存資源的系統(tǒng)上實(shí)現(xiàn)。而實(shí)際上,它通常被分割成多個(gè)物理內(nèi)存碎片,還有部份暫時(shí)存儲(chǔ)在外部磁盤存儲(chǔ)器上,在需要時(shí)進(jìn)行數(shù)據(jù)交換。虛存比實(shí)存有以下好處:
(1) 擴(kuò)大地址空間。不管段式虛存,還是頁(yè)式虛存,或是段頁(yè)式虛存,尋址空間都比實(shí)存大。
(2)內(nèi)存保護(hù)。每一個(gè)進(jìn)程運(yùn)行在各自的虛擬內(nèi)存地址空間,相互不能干擾對(duì)方。另外,虛存還對(duì)特定的內(nèi)存地址提供寫保護(hù),可以避免代碼或數(shù)據(jù)被歹意篡改
(3)公平分配內(nèi)存。采取了虛存以后,每一個(gè)進(jìn)程都相當(dāng)于有太陽(yáng)大小的虛存空間。
(4)當(dāng)進(jìn)程需要通訊時(shí),可采取虛存同享的方式實(shí)現(xiàn)。
不過(guò),使用虛存也是有代價(jià)的,主要表現(xiàn)在以下幾個(gè)方面:
(1)虛存的管理需要建立很多數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)要占用額外的內(nèi)存
(2)虛擬地址到物理地址的轉(zhuǎn)換,增加了指令的履行時(shí)間
(3)頁(yè)面的換入換出需要磁盤I/O,這是很耗時(shí)間的。
(4)如果1頁(yè)中只有1部份數(shù)據(jù),會(huì)很浪費(fèi)內(nèi)存。
內(nèi)存碎片是由于屢次進(jìn)行內(nèi)存分配釀成的,當(dāng)進(jìn)行內(nèi)存分配時(shí),內(nèi)存格式1般為:(用戶使用段)(空白段)(用戶使用段),當(dāng)空白段很小的時(shí)候可能不能提供給用戶足夠需要的空間,可能夾在中間的空白段的大小為5,而用戶需要的內(nèi)存大小為6,這樣會(huì)產(chǎn)生很多的間隙造成使用效力的降落,這些很小的空隙叫碎片。
內(nèi)碎片:分配給程序的存儲(chǔ)空間沒(méi)有用完,有1部份是程序不使用,但其他程序也沒(méi)法用的空間。內(nèi)碎片是處于區(qū)域內(nèi)部或頁(yè)面內(nèi)部的存儲(chǔ)塊,占有這些區(qū)域或頁(yè)面的進(jìn)程其實(shí)不使用這個(gè)存儲(chǔ)塊,而在進(jìn)程占有這塊存儲(chǔ)塊時(shí),系統(tǒng)沒(méi)法利用它,直到進(jìn)程釋放它,或進(jìn)程結(jié)束時(shí),系統(tǒng)才有可能利用這個(gè)存儲(chǔ)塊。。
由于空間太小,小到?jīng)]法給任何程序分配(不屬于任何進(jìn)程)的存儲(chǔ)空間是外碎片。外部碎片是處于任何已分配區(qū)域或頁(yè)面外部的空閑存儲(chǔ)塊,這些存儲(chǔ)塊的綜合可以滿足當(dāng)前申請(qǐng)的長(zhǎng)度要求,但是由于它們的地址不連續(xù)或其他緣由,使得系統(tǒng)沒(méi)法滿足當(dāng)前申請(qǐng)。
內(nèi)碎片和外碎片是1對(duì)矛盾體,1種特定的內(nèi)存分配算法,很難同時(shí)解決好內(nèi)碎片和外碎片問(wèn)題,只能根據(jù)利用特點(diǎn)進(jìn)行取舍。。。
虛擬地址是指由程序產(chǎn)生的由段選擇符合段內(nèi)偏移地址組成的地址。這兩部份組成的地址并沒(méi)有直接訪問(wèn)物理內(nèi)存,而是要通過(guò)分段地址的變換處理后才會(huì)對(duì)應(yīng)到相應(yīng)的物理內(nèi)存地址。
邏輯地址指由程序產(chǎn)生的段內(nèi)偏移地址。有時(shí)直接把邏輯地址當(dāng)做虛擬地址,二者并沒(méi)有明確的界限。。
線性地址是指虛擬地址到物理地址變換之間的中間層,是處理器可尋址的內(nèi)存空間(稱為線性地址空間)中的地址。程序代碼會(huì)產(chǎn)生邏輯地址,或說(shuō)是段中的偏移地址,加上相應(yīng)段基址就生成了1個(gè)線性地址。如果啟用了分頁(yè)機(jī)制,那末線性地址可以再經(jīng)過(guò)變換產(chǎn)生物理地址。若沒(méi)有采取分頁(yè)機(jī)制,那末線性地址就是物理地址。
物理地址是指限制CPU外部地址總線上的尋址物理內(nèi)存的地址信號(hào),是地址變換的終究結(jié)果。
虛擬地址到物理地址的轉(zhuǎn)化方法是與體系結(jié)構(gòu)相干的,1般有分段與分頁(yè)兩種方式。以x86CPU為例,分段分頁(yè)都是支持的。內(nèi)存管理單元負(fù)責(zé)從虛擬地址到物理地址的轉(zhuǎn)化。邏輯地址是段標(biāo)識(shí)+段內(nèi)偏移量的情勢(shì),MMU(Memory Management Unit內(nèi)存管理單元)通過(guò)查詢段表,可以把邏輯地址轉(zhuǎn)化為線性地址。如果CPU沒(méi)有開(kāi)啟分頁(yè)功能,那末線性地址就是物理地址;如果CPU開(kāi)啟了分頁(yè)功能,MMU還需要查詢頁(yè)表來(lái)將線性地質(zhì)轉(zhuǎn)化為物理地址:邏輯地址(段表)-》線性地址(頁(yè)表)-》物理地址。
映照是1種多對(duì)1的關(guān)系,即不同的邏輯地址可以映照到同1個(gè)線性地址上;不同的線性地址也能夠映照到同1個(gè)物理地址上。而且,同1個(gè)線性地址在產(chǎn)生換頁(yè)以后,也可能被重新裝載到另外1個(gè)物理地址上,所以這類多對(duì)1的映照關(guān)系也會(huì)隨時(shí)間產(chǎn)生變化。。
數(shù)據(jù)可以寄存在CPU或是內(nèi)存中。CPU處理快,但是容量小;內(nèi)存容量大,但是轉(zhuǎn)交給CPU處理的速度慢。為此需要Cache(緩存)來(lái)做1個(gè)折衷。最有可能的數(shù)據(jù)先從內(nèi)存調(diào)入Cache,CPU再?gòu)腃ache讀取數(shù)據(jù),這樣會(huì)快許多。但是,Cache中所寄存的數(shù)據(jù)不是100%有用的。CPU從Cache總讀取到有用的數(shù)據(jù)稱為“命中”。
Cache替換算法有隨機(jī)算法、FIFO算法、LRU算法、LFU算法和OPT算法。
(1)隨機(jī)算法(RAND)。隨機(jī)算法就是用隨機(jī)數(shù)產(chǎn)生器產(chǎn)生1個(gè)要替換的塊號(hào),將該塊替換出去,此算法簡(jiǎn)單、易于實(shí)現(xiàn),而且它不斟酌Cache塊過(guò)去、現(xiàn)在及將來(lái)的使用情況。但是由于沒(méi)有益用上層存儲(chǔ)器使用的“歷史信息”、沒(méi)有根據(jù)訪存的局部性原理,故不能提高Cache的命中率,命中率較低。
(2)先進(jìn)先出(FIFO)算法。先進(jìn)先出(First In First Out,F(xiàn)IFO)算法是將最早進(jìn)入Cache的信息塊替換出去。FIFO算法按調(diào)入Cache的前后決定淘汰的順序,選擇最早調(diào)入Cache的字塊進(jìn)行替換,它不需要記錄各字塊的使用情況,比較容易實(shí)現(xiàn),系統(tǒng)開(kāi)消小,其缺點(diǎn)是可能會(huì)把1些需要常常使用的程序可(如循環(huán)程序)也作為最早進(jìn)入Cache的塊替換掉,而且沒(méi)有根據(jù)訪存的局部性原理,故不能提高Cache的命中率。由于最早調(diào)入的信息可能以后還要用到,或常常要用到,如循環(huán)程序。此法簡(jiǎn)單、方便,利用了主存的“歷史信息”,但其實(shí)不能說(shuō)最早進(jìn)入的就不常常使用,其缺點(diǎn)是不能正確反應(yīng)程序局部性原理,命中率不高,可能出現(xiàn)1種異常現(xiàn)象。
(3)近期最少使用(LRU)算法。近期最少使用(Least Recently Used,LRU)算法是將近期最少使用的Cache中的信息塊替換出去。該算法較先進(jìn)先出算法要好1些,但此法也不能保證過(guò)去不經(jīng)常使用將來(lái)也不經(jīng)常使用。
LRU算法是根據(jù)各塊使用的情況,總是選擇那個(gè)最近最少使用的塊被替換。這類方法雖然比較好地反應(yīng)了程序局部性規(guī)律,但是這類替換方法需要隨時(shí)記錄Cache中各塊的使用情況,以便肯定哪一個(gè)塊是近期最少使用的塊。LRU算法相對(duì)公道,但實(shí)現(xiàn)起來(lái)比較復(fù)雜,系統(tǒng)開(kāi)消較大。通常需要對(duì)每塊設(shè)置1個(gè)稱為計(jì)數(shù)器的硬件或軟件模塊,用以記錄其被使用的情況。
實(shí)現(xiàn)LRU策略的方法有很多種。簡(jiǎn)單介紹計(jì)數(shù)器法、寄存器棧法及硬件邏輯比較對(duì)法的設(shè)計(jì)思路。
計(jì)數(shù)器法:緩存的每塊都設(shè)置1個(gè)計(jì)數(shù)器。計(jì)數(shù)器的操作規(guī)則以下:
(4)最優(yōu)替換算法(OPT算法)。使用最優(yōu)替換算法(OPTimal replacement Algorithm)時(shí)必須先履行1次程序,統(tǒng)計(jì)Cache的替換情況。有了這樣的先驗(yàn)信息,在第2次履行該程序時(shí)即可以用最有效的方式來(lái)替換,以到達(dá)最優(yōu)的目的。
前面介紹的幾種頁(yè)面替換算法主要是以主存儲(chǔ)器中頁(yè)面調(diào)度情況的歷史信息為根據(jù)的,它假定將來(lái)主存儲(chǔ)器中的頁(yè)面調(diào)度情況與過(guò)去1段時(shí)間內(nèi)主存儲(chǔ)器中的頁(yè)面調(diào)度情況是相同的,明顯,這類假定不總是正確的。最好的算法應(yīng)當(dāng)是選擇將來(lái)最久不被訪問(wèn)的頁(yè)面作為被替換的頁(yè)面,這類替換算法的命中率1定是最高的,它就是最優(yōu)替換算法。
要實(shí)現(xiàn)OPT算法,唯1的辦法是讓程序先履行1遍,記錄下實(shí)際的頁(yè)地址流情況。根據(jù)這個(gè)頁(yè)地址流才能找出當(dāng)前要被替換的頁(yè)面。明顯,這樣做是不現(xiàn)實(shí)的。因此,OPT算法只是1種理想化的算法,但是它也是1種很有用的算法。實(shí)際上,常常把這類算法用來(lái)作為評(píng)價(jià)其他頁(yè)面替換算法好壞的標(biāo)準(zhǔn)。在其他條件相同的情況下,哪種頁(yè)面替換算法的命中率與OPT算法最接近,那末它就是1種比較好的頁(yè)面替換算法。
(5)最少使用算法(LFU算法 Least Frequently Used Algorithm)。選擇最少訪問(wèn)的頁(yè)面作為被替換的頁(yè)面。明顯,這是1種公道的算法,由于到目前為止最少使用的頁(yè)面,極可能是將來(lái)最少訪問(wèn)的頁(yè)面。該算法既充分利用了主存中頁(yè)面調(diào)度情況的歷史信息,又正確反應(yīng)了程序的局部性。但是,這類算法實(shí)現(xiàn)起來(lái)非常困難,它要為每一個(gè)頁(yè)面設(shè)置1個(gè)很長(zhǎng)的計(jì)數(shù)器,并且要選擇1個(gè)固定的時(shí)鐘為每一個(gè)計(jì)數(shù)器定時(shí)計(jì)數(shù)。在選擇被替換頁(yè)面時(shí),要從所有計(jì)數(shù)器中找出1個(gè)計(jì)數(shù)器值最大的計(jì)數(shù)器。