作業系統常見問題解答

  計算機作業系統,是電子計算機系統中負責支撐應用程式執行環境以及使用者操作環境的系統軟體,同時也是計算機系統的核心與基石。接下來是小編為大家收集的,希望能幫到大家。

  

  ***一***程序與執行緒的區別,執行緒安全”怎麼理解?

  程序和執行緒都是由作業系統所體會的程式執行的基本單元,系統利用該基本單元實現系統對應得併發性。程序和執行緒的區別在於:

  一個程式至少有一個程序,一個程序至少有一個執行緒。

  執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高,另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。

  執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的***、順序執行序列和程式的出口。但是執行緒不能獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

  從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。

  如果你的程式碼所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。

  或者說:一個類或者程式所提供的介面對於執行緒來說是原子操作或者多個執行緒之間的切換不會導致該介面的執行結果存在二義性,也就是說我們不用考慮同步的問題。

  執行緒安全問題都是由全域性變數及靜態變數引起的。

  若每個執行緒中對全域性變數、靜態變數只有讀操作,而無寫操作,一般來說,這個全域性變數是執行緒安全的;若有多個執行緒同時執行寫操作,一般都需要考慮執行緒同步,否則就可能影響執行緒安全。

  另解

  說法一:程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位.

  執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源***如程式計數器,一組暫存器和棧***,但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源.

  一個執行緒可以建立和撤銷另一個執行緒;同一個程序中的多個執行緒之間可以併發執行

  說法二:程序和執行緒都是由作業系統所體會的程式執行的基本單元,系統利用該基本單元實現系統對應用的併發性。程序和執行緒的區別在於:

  簡而言之,一個程式至少有一個程序,一個程序至少有一個執行緒.

  執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。

  另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。

  執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的***、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

  從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。

  說法三:多執行緒共存於應用程式中是現代作業系統中的基本特徵和重要標誌。用過UNIX作業系統的讀者知道程序,在UNIX作業系統中,每個應用程式的執行都在作業系統核心中登記一個程序標誌,作業系統根據分配的標誌對應用程式的執行進行排程和系統資源分配,但程序和執行緒有什麼區別呢?

  程序和執行緒都是由作業系統所體會的程式執行的基本單元,系統利用該基本單元實現系統對應用的併發性。程序和執行緒的區別在於:

  執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。

  另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。

  執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的***、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

  從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。

  程序***Process***是最初定義在Unix等多使用者、多工作業系統環境下用於表示應用程式在記憶體環境中基本執行單元的概念。以Unix作業系統為例,程序是Unix作業系統環境中的基本成分、是系統資源分配的基本單位。Unix作業系統中完成的幾乎所有使用者管理和資源分配等工作都是通過作業系統對應用程式程序的控制來實現的。

  C、C++、Java等語言編寫的源程式經相應的編譯器編譯成可執行檔案後,提交給計算機處理器執行。這時,處在可執行狀態中的應用程式稱為程序。從使用者角度來看,程序是應用程式的一個執行過程。從作業系統核心角度來看,程序代表的是作業系統分配的記憶體、CPU時間片等資源的基本單位,是為正在執行的程式提供的執行環境。程序與應用程式的區別在於應用程式作為一個靜態檔案儲存在計算機系統的硬碟等儲存空間中,而程序則是處於動態條件下由作業系統維護的系統資源管理實體。多工環境下應用程式程序的主要特點包括:

  ●程序在執行過程中有記憶體單元的初始***點,並且程序存活過程中始終擁有獨立的記憶體地址空間;

  ●程序的生存期狀態包括建立、就緒、執行、阻塞和死亡等型別;

  ●從應用程式程序在執行過程中向CPU發出的執行指令形式不同,可以將程序的狀態分為使用者態和核心態。處於使用者態下的程序執行的是應用程式指令、處於核心態下的應用程式程序執行的是作業系統指令。

  在Unix作業系統啟動過程中,系統自動建立swapper、init等系統程序,用於管理記憶體資源以及對使用者程序進行排程等。在Unix環境下無論是由作業系統建立的程序還要由應用程式執行建立的程序,均擁有唯一的程序標識***PID***。

  說法四:應用程式在執行過程中存在一個記憶體空間的初始***點地址、一個程式執行過程中的程式碼執行序列以及用於標識程序結束的記憶體出口點地址,在程序執行過程中的每一時間點均有唯一的處理器指令與記憶體單元地址相對應。

  Java語言中定義的執行緒***Thread***同樣包括一個記憶體***點地址、一個出口點地址以及能夠順序執行的程式碼序列。但是程序與執行緒的重要區別在於執行緒不能夠單獨執行,它必須執行在處於活動狀態的應用程式程序中,因此可以定義執行緒是程式內部的具有併發性的順序程式碼流。

  Unix作業系統和Microsoft Windows作業系統支援多使用者、多程序的併發執行,而Java語言支援應用程式程序內部的多個執行執行緒的併發執行。多執行緒的意義在於一個應用程式的多個邏輯單元可以併發地執行。但是多執行緒並不意味著多個使用者程序在執行,作業系統也不把每個執行緒作為獨立的程序來分配獨立的系統資源。程序可以建立其子程序,子程序與父程序擁有不同的可執行程式碼和資料記憶體空間。而在用於代表應用程式的程序中多個執行緒共享資料記憶體空間,但保持每個執行緒擁有獨立的執行堆疊和程式執行上下文***Context***。

  基於上述區別,執行緒也可以稱為輕型程序 ***Light Weight Process,LWP***。不同執行緒間允許任務協作和資料交換,使得在計算機系統資源消耗等方面非常廉價。

  執行緒需要作業系統的支援,不是所有型別的計算機都支援多執行緒應用程式。Java程式設計語言將執行緒支援與語言執行環境結合在一起,提供了多工併發執行的能力。這就好比一個人在處理家務的過程中,將衣服放到洗衣機中自動洗滌後將大米放在電飯鍋裡,然後開始做菜。等菜做好了,飯熟了同時衣服也洗好了。

  需要注意的是:在應用程式中使用多執行緒不會增加 CPU 的資料處理能力。只有在多CPU 的計算機或者在網路計算體系結構下,將Java程式劃分為多個併發執行執行緒後,同時啟動多個執行緒執行,使不同的執行緒執行在基於不同處理器的Java虛擬機器中,才能提高應用程式的執行效率。

  ***二***如何減少換頁錯誤?

  1,程序傾向於佔用CPU

  2,訪問區域性性***localilty of reference***滿足程序要求

  3,程序傾向於佔用I/O

  4,使用基於最短剩餘時間***shortest remaining time***的排程機制

  5,減少頁大小

  最先排出1和3選項,訪問快慢、訪問介面,對“錯誤”能夠有什麼影響?肯定是需要某種策略。

  仔細看題:“減少”,而不是“消除”,說明這個“錯誤”不管怎麼樣,肯定是存在的;關鍵在於你是否理解“換頁錯誤”的定義了。

  看看選項2和4都有點像;至於5嘛,不太像了——即使頁面減少,錯誤率會降低嗎?難說,你可不知道系統實際執行時,資料大小、分佈是什麼樣的:頁面大,更可能將大資料塊放在一頁上;頁面小,則會分散資料——形象上是這麼理解,但作業系統演算法沒這麼麻煩,也沒見過這方面的概率討論,排除。

  我猜想的答案是2,因為被“錯誤”2字誤導了:既然要減少錯誤嘛,“區域性化”是很常用的策略,錯誤發生在區域性就不至於影響全域性......***歸根結底還是不明白“換頁錯誤”的定義***其實如果仔細想想,“區域性化”可以降低錯誤的影響,但是它並不能降低錯誤的發生概率!剩下的答案就顯而易見了。

  換頁錯誤:

  Page Fault 是在程序嘗試執行程式碼指導,或者引用程序所對映實體記憶體中並不存在的資料頁時,作業系統記錄的事件。換句話說,程序需要的記憶體頁實際上可能還處於實體記憶體中,但是由於它無法再分配到程序中,所以當程序將此頁讀取回到它的記憶體頁時,就發生了Page Fault。

  說白了就是想在記憶體裡找東西,卻發現不存在***不得不重新讀取...***,按道理這不應該算“錯誤”這麼嚴重吧***簡單點,“不命中”而已***。

  採用最短剩餘時間排程機制:

  SRT演算法***SPN演算法的搶佔式版本***:總是選擇剩餘時間最短的程序執行

  為什麼會減少換頁錯誤呢?因為時間短的結束執行快,不需要頻繁切換程序***導致重新整理記憶體***,所以換頁錯誤發生的概率就減少了......

  ***二***關於PV操作

  在計算機作業系統中,PV操作是程序管理中的難點。

  首先應弄清PV操作的含義:PV操作由P操作原語和V操作原語組成***原語是不可中斷的過程***,對訊號量進行操作,具體定義如下:

  P***S***:①將訊號量S的值減1,即S=S-1;

  ②如果S>=0,則該程序繼續執行;否則該程序置為等待狀態,排入等待佇列。

  V***S***:①將訊號量S的值加1,即S=S+1;

  ②如果S>0,則該程序繼續執行;否則釋放佇列中第一個等待訊號量的程序。

  PV操作的意義:我們用訊號量及PV操作來實現程序的同步和互斥。PV操作屬於程序的低階通訊。

  什麼是訊號量?訊號量***semaphore***的資料結構為一個值和一個指標,指標指向等待該訊號量的下一個程序。訊號量的值與相應資源的使用情況有關。當它的值大於0時,表示當前可用資源的數量;當它的值小於0時,其絕對值表示等待使用該資源的程序個數。注意,訊號量的值僅能由PV操作來改變。

  一般來說,訊號量S>=0時,S表示可用資源的數量。執行一次P操作意味著請求分配一個單位資源,因此S的值減1;當S<0時,表示已經沒有可用資源,請求者必須等待別的程序釋放該類資源,它才能執行下去。而執行一個V操作意味著釋放一個單位資源,因此S的值加1;若S=<0,表示有某些程序正在等待該資源,因此要喚醒一個等待狀態的程序,使之執行下去。

  利用訊號量和PV操作實現程序互斥的一般模型是:

  程序P1 程序P2 …… 程序Pn

  …… …… ……

  P***S***; P***S***; P***S***;

  臨界區; 臨界區; 臨界區;

  V***S***; V***S***; V***S***;

  …… …… …… ……

  其中訊號量S用於互斥,初值為1。

  使用PV操作實現程序互斥時應該注意的是:

  ***1***每個程式中使用者實現互斥的P、V操作必須成對出現,先做P操作,進臨界區,後做V操作,出臨界區。若有多個分支,要認真檢查其成對性。

  ***2***P、V操作應分別緊靠臨界區的頭尾部,臨界區的程式碼應儘可能短,不能有死迴圈。

  ***3***互斥訊號量的初值一般為1。

  利用訊號量和PV操作實現程序同步

  PV操作是典型的同步機制之一。用一個訊號量與一個訊息聯絡起來,當訊號量的值為0時,表示期望的訊息尚未產生;當訊號量的值非0時,表示期望的訊息已經存在。用PV操作實現程序同步時,呼叫P操作測試訊息是否到達,呼叫V操作傳送訊息。

  使用PV操作實現程序同步時應該注意的是:

  ***1***分析程序間的制約關係,確定訊號量種類。在保持程序間有正確的同步關係情況下,哪個程序先執行,哪些程序後執行,彼此間通過什麼資源***訊號量***進行協調,從而明確要設定哪些訊號量。

  ***2***訊號量的初值與相應資源的數量有關,也與P、V操作在程式程式碼中出現的位置有關。

  ***3***同一訊號量的P、V操作要成對出現,但它們分別在不同的程序程式碼中。

  ***四***用於程序間通訊***IPC***的四種不同技術:

  1. 訊息傳遞***管道,FIFO,posix和system v訊息佇列,訊號量***

  2. 同步***互斥鎖,條件變數,讀寫鎖,檔案和記錄鎖,Posix和System V訊號燈***

  3. 共享記憶體區***匿名共享記憶體區,有名Posix共享記憶體區,有名System V共享記憶體區***

  4. 過程呼叫***Solaris門,Sun RPC***

  訊息佇列和過程呼叫往往單獨使用,也就是說它們通常提供了自己的同步機制.相反,共享記憶體區通常需要由應用程式提供的某種同步形式才能正常工作.解決某個特定問題應使用哪種IPC不存在簡單的判定,應該逐漸熟悉各種IPC形式提供的機制,然後根據特定應用的要求比較它們的特性.

  必須考慮的四個前提:

  1. 聯網的還是非聯網的.IPC適用於單臺主機上的程序或執行緒間的.如果應用程式有可能分佈到多臺主機上,那就要考慮使用套接字代替IPC,從而簡化以後向聯網的應用程式轉移的工作.

  2. 可移植性.

  3. 效能,在具體的開發環境下執行測試程式,比較幾種IPC的效能差異.

  4. 實時排程.如果需要這一特性,而且所用的系統也支援posix實時排程選項,那就考慮使用Posix的訊息傳遞和同步函式.

  各種IPC之間的一些主要差異:

  1. 管道和FIFO是位元組流,沒有訊息邊界.Posix訊息和System V訊息則有從傳送者向接受者維護的記錄邊界***.

  2. 當有一個訊息放置到一個空佇列中時,Posix訊息佇列可向一個程序傳送一個訊號,或者啟動一個新的執行緒.System V則不提供類似的通知形式.

  3. 管道和FIFO的資料位元組是先進先出的.Posix訊息和System V訊息具有由傳送者賦予的優先順序.從一個Posix訊息佇列讀出時,首先返回的總是優先順序最高的訊息.從一個System V訊息佇列讀出時,讀出者可以要求想要的任意優先順序的訊息.

  4. 在眾多的訊息傳遞技術—管道,FIFO,Posix訊息佇列和System V訊息佇列—中,可從一個訊號處理程式中呼叫的函式只有read和write***適用於管道和FIFO***.

  比較不同形式的訊息傳遞時,我們感興趣的有兩種測量尺度:

  1. 頻寬***bandwidth***:資料通過IPC通道轉移的速度.為測量該值,我們從一個程序向另一個程序傳送大量資料***幾百萬位元組***.我們還給不同大小的I/O操作***例如管道和FIFO的write和read操作***測量該值,期待發現頻寬隨每個I/O操作的資料量的增長而增長的規律.

  2. 延遲***latency***:一個小的IPC訊息從一個程序到令一個程序再返回來所花的時間.我們測量的是隻有一個1個位元組的訊息從一個程序到令一個程序再回來的時間***往返時間***

  在現實世界中,頻寬告訴我們大塊資料通過一個IPC通道傳送出去需花多長時間,然而IPC也用於傳遞小的控制資訊,系統處理這些小訊息所需的時間就由延遲提供.這兩個數都很重要.

  ***五***多程序和多執行緒的優缺點

  Linux核心對多程序和多執行緒的支援方式:

  執行緒機制支援併發程式設計技術,在多處理器上能真正保證並行處理。而在linux實現執行緒很特別,linux把所有的執行緒都當作程序實現。linux下執行緒看起來就像普通程序***只是該程序和其他程序共享資源,如地址空間***。上述機制與Microsoft windows或是Sun Solaris實現差異很大。

  Linux的執行緒實現是在核外進行的,核內提供的是建立程序的介面do_fork******。核心提供了兩個系統呼叫__clone******和fork******,最終都用不同的引數呼叫do_fork******核內API。 do_fork****** 提供了很多引數,包括CLONE_VM***共享記憶體空間***、CLONE_FS***共享檔案系統資訊***、CLONE_FILES***共享檔案描述符表***、CLONE_SIGHAND***共享訊號控制代碼表***和CLONE_PID***共享程序ID,僅對核內程序,即0號程序有效***。當使用fork系統呼叫產生多程序時,核心呼叫do_fork******不使用任何共享屬性,程序擁有獨立的執行環境。當使用pthread_create******來建立執行緒時,則最終設定了所有這些屬性來呼叫__clone******,而這些引數又全部傳給核內的do_fork******,從而建立的”程序”擁有共享的執行環境,只有棧是獨立的,由 __clone******傳入。

  即:Linux下不管是多執行緒程式設計還是多程序程式設計,最終都是用do_fork實現的多程序程式設計,只是程序建立時的引數不同,從而導致有不同的共享環境。Linux執行緒在核內是以輕量級程序的形式存在的,擁有獨立的程序表項,而所有的建立、同步、刪除等操作都在核外pthread庫中進行。pthread 庫使用一個管理執行緒***__pthread_manager****** ,每個程序獨立且唯一***來管理執行緒的建立和終止,為執行緒分配執行緒ID,傳送執行緒相關的訊號,而主執行緒pthread_create********* 的呼叫者則通過管道將請求資訊傳給管理執行緒。

  很多朋友都說使用多執行緒的好處是資源佔用少,其隱含之意就是說程序佔用資源比執行緒多,對吧?但實際上Linux下多程序是否就真的點用很多資源呢?暫且不說程序是否比執行緒佔用資源多,就程序佔用資源的多少情況而言,Linux確實是做得相當節省的。產生一個多程序時肯定是要產生的一點記憶體是要複製程序表項,即一個task_struct結構,但這個結構本身做得相當小巧。其它對於一個程序來說必須有的資料段、程式碼段、堆疊段是不是全盤複製呢?對於多程序來說,程式碼段是肯定不用複製的,因為父程序和各子程序的程式碼段是相同的,資料段和堆疊段呢?也不一定,因為在Linux裡廣泛使用的一個技術叫copy-on-write,即寫時拷貝。copy-on-write意味著什麼呢?意味著資源節省,假設有一個變數x在父程序裡存在,當這個父程序建立一個子程序或多個子程序時這個變數x是否複製到了子程序的記憶體空間呢?不會的,子程序和父程序使用同一個記憶體空間的變數,但當子程序或父程序要改變變數x的值時就會複製該變數,從而導致父子程序裡的變數值不同。父子程序變數是互不影響的,由於父子程序地址空間是完全隔開的,變數的地址可以是完全相同的。

  Linux的”執行緒”和”程序”實際上處於一個排程層次,共享一個程序識別符號空間,這種限制使得不可能在Linux上實現完全意義上的POSIX執行緒機制,因此眾多的Linux執行緒庫實現嘗試都只能儘可能實現POSIX的絕大部分語義,並在功能上儘可能逼近。Linux程序的建立是非常迅速的。核心設計與實現一書中甚至指出Linux建立程序的速度和其他針對執行緒優化的作業系統***Windows,Solaris***建立執行緒的速度相比,測試結果非常的好,也就是說建立速度很快。由於非同步訊號是核心以程序為單位分發的,而LinuxThreads的每個執行緒對核心來說都是一個程序,且沒有實現”執行緒組”,因此,某些語義不符合POSIX標準,比如沒有實現向程序中所有執行緒傳送訊號,README對此作了說明。LinuxThreads中的執行緒同步很大程度上是建立在訊號基礎上的,這種通過核心複雜的訊號處理機制的同步方式,效率一直是個問題。LinuxThreads 的問題,特別是相容性上的問題,嚴重阻礙了Linux上的跨平臺應用***如Apache***採用多執行緒設計,從而使得Linux上的執行緒應用一直保持在比較低的水平。在Linux社群中,已經有很多人在為改進執行緒效能而努力,其中既包括使用者級執行緒庫,也包括核心級和使用者級配合改進的執行緒庫。目前最為人看好的有兩個專案,一個是RedHat公司牽頭研發的NPTL***Native Posix Thread Library***,另一個則是IBM投資開發的NGPT***Next Generation Posix Threading***,二者都是圍繞完全相容POSIX 1003.1c,同時在核內和核外做工作以而實現多對多執行緒模型。這兩種模型都在一定程度上彌補了LinuxThreads的缺點,且都是重起爐灶全新設計的。

  綜上所述的結論是在Linux下程式設計多用多程序程式設計少用多執行緒程式設計。

  IBM有個傢伙做了個測試,發現切換執行緒context的時候,windows比linux快一倍多。進出最快的鎖***windows2k的 critical section和linux的pthread_mutex***,windows比linux的要快五倍左右。當然這並不是說linux不好,而且在經過實際程式設計之後,綜合來看我覺得linux更適合做high performance server,不過在多執行緒這個具體的領域內,linux還是稍遜windows一點。這應該是情有可原的,畢竟unix家族都是從多程序過來的,而 windows從頭就是多執行緒的。

  如果是UNIX/linux環境,採用多執行緒沒必要。

  多執行緒比多程序效能高?誤導!

  應該說,多執行緒比多程序成本低,但效能更低。

  在UNIX環境,多程序排程開銷比多執行緒排程開銷,沒有顯著區別,就是說,UNIX程序排程效率是很高的。記憶體消耗方面,二者只差全域性資料區,現在記憶體都很便宜,伺服器記憶體動輒若干G,根本不是問題。

  多程序是立體交通系統,雖然造價高,上坡下坡多耗點油,但是不堵車。

  多執行緒是平面交通系統,造價低,但紅綠燈太多,老堵車。

  我們現在都開跑車,油***主頻***有的是,不怕上坡下坡,就怕堵車。

  高效能交易伺服器中介軟體,如TUXEDO,都是主張多程序的。實際測試表明,TUXEDO效能和併發效率是非常高的。TUXEDO是貝爾實驗室的,與UNIX同宗,應該是對UNIX理解最為深刻的,他們的意見應該具有很大的參考意義。

  塊裝置與字元裝置區別

  系統中能夠隨機***不需要按順序***訪問固定大小資料片***chunks***的裝置被稱作塊裝置,這些資料片就稱作塊。最常見的塊裝置是硬碟,除此以外,還有軟盤驅動器、CD-ROM驅動器和快閃記憶體等等許多其他塊裝置。注意,它們都是以安裝檔案系統的方式使用的——這也是塊裝置的一般訪問方式。

  另一種基本的裝置型別是字元裝置。字元裝置按照字元流的方式被有序訪問,像串列埠和鍵盤就都屬於字元裝置。如果一個硬體裝置是以字元流的方式被訪問的話,那就應該將它歸於字元裝置;反過來,如果一個裝置是隨機***無序的***訪問的,那麼它就屬於塊裝置。

  簡單來講,塊裝置可以隨機存取,而字元裝置不能隨機存取,塊裝置通過系統快取進行讀取,不是直接和物理磁碟讀取。字元裝置可以直接物理磁碟讀取。不經過系統快取。***如鍵盤,直接相應中斷***

  什麼是虛擬記憶體?

  虛擬記憶體是計算機系統記憶體管理的一種技術。它使得應用程式認為它擁有連續的可用的記憶體***一個連續完整的地址空間***,而實際上,它通常是被分隔成多個實體記憶體碎片,還有部分暫時儲存在外部磁碟儲存器上,在需要時進行資料交換。

  別稱虛擬儲存器***Virtual Memory***。電腦中所執行的程式均需經由記憶體執行,若執行的程式佔用記憶體很大或很多,則會導致記憶體消耗殆盡。為解決該問題,Windows中運用了虛擬記憶體技術,即勻出一部分硬碟空間來充當記憶體使用。當記憶體耗盡時,電腦就會自動呼叫硬碟來充當記憶體,以緩解記憶體的緊張。若計算機執行程式或操作所需的隨機儲存器***RAM***不足時,則 Windows 會用虛擬儲存器進行補償。它將計算機的RAM和硬碟上的臨時空間組合。當RAM執行速率緩慢時,它便將資料從RAM移動到稱為“分頁檔案”的空間中。將資料移入分頁檔案可釋放RAM,以便完成工作。 一般而言,計算機的RAM容量越大,程式執行得越快。若計算機的速率由於RAM可用空間匱乏而減緩,則可嘗試通過增加虛擬記憶體來進行補償。但是,計算機從RAM讀取資料的速率要比從硬碟讀取資料的速率快,因而擴增RAM容量***可加記憶體條***是最佳選擇。