引自:https://www.cnblogs.com/yasheng/p/12617192.html
引自:https://blog.csdn.net/pcwl1206/article/details/89221550
引自:https://blog.csdn.net/iteye_20659/article/details/82542657
1.進程(process)和線程(thread)
進程是系統中擁有資源和獨立調度的基本單位,一個進程可以包括多個線程。
進程有自己的內存空間,其線程可以共享內存。進程間通信則需要IPC(進程間通信)。
此外同一進程內的線程切換比進程切換的開銷小很多。
2.核心態(Kernel Mode 堅果仁態)和用戶態(User Mode)
在CPU中運行的操作系統程序和用戶程序對應的機器指令集是不同的。操作系統程序使用所有指令,但用戶程序只能使用部分指令。
從資源管理和程序控制執行的角度出發,將指令系統分為兩大部分:特權指令和非特權指令。在程序執行時,根據執行程序對資源和機器指令的使用權限,把機器設置為兩個狀態:核心態和用戶態。
也就是說,當系統處於核心態時,就可以使用所有指令、資源,並具備改變CPU狀態的能力;而當CPU在用戶態時,只能使用非特權指令。
如果CPU執行用戶程序時(用戶態)出現了中斷,系統將自行轉到中斷處理程序,CPU就由用戶態轉換到核心態;中斷處理結束后,返回繼續執行用戶程序,此時CPU又由核心態轉到用戶態。
那么用戶態和核心態之間的區別是什么呢?(以下區別摘至《UNIX操作系統設計》)
- 用戶態的進程能存取它們自己的指令和數據,但不能存取內核指令和數據(或其他進程的指令和數據)。然而,核心態下的進程能夠存取內核和用戶地址
- 某些機器指令是特權指令,在用戶態下執行特權指令會引起錯誤
此處牽引出另外一個概念:用戶級線程和內核級線程
在傳統的操作系統中,是不支持內核級線程的(只有內核進程,出於安全沒有把線程這個新生事物放入到內核中),每次都是一個進程去到一個CPU核心(但是多核CPU仍然可以處理多個進程),因此用戶級線程是對內核透明的,也做不到進程那樣的時間片輪轉調度(時間一到直接停你進程,線程都得一塊停),此時的線程管理全部交給用戶態做,且可以用jacket進行優化效率
在如今的多核CPU/多CPU支持內核級線程的情況下(實際上的意思是線程對於內核可見了,內核可以接手線程管理),那就可以多個內核級線程並行運行了。不會再出現同一個進程下的線程一損俱損的情況了。缺點是:讓內核來調度線程的話會出現切換線程得經歷用戶態到核心態的切換,代價更大
然而在今天的操作系統中,常見的操作是 n個用戶態線程----映射到---->1個內核態線程 算是一個折中方案
3.中斷
①內部異常中斷
計算機硬件異常或故障引起的中斷
②軟(件)中斷(指令中斷)
程序中執行了引起中斷的指令而造成的中斷,比如用戶態到內核態的系統調用就是使用了訪管指令
③外中斷(強迫中斷)
外設請求的中斷
4.並發---進程調度的幾種策略
進程調度負責動態的將CPU分配給各個進程。主要功能如下:
(1)記住進程狀態。
(2)決定哪個進程,什么時候獲取CPU及其占用多長時間。
(3)把CPU分配給進程,即將選中進程的PCB中有關進程的相關信息,如程序狀態寄存器、通用寄存器等內容送入CPU的相應的寄存器中,從而讓該進程占用CPU去運行。
(4)收回CPU。
啟動進程調度程序的各種時機:
(1)在一次外部中斷之后,該中斷改變了某個進程的狀態。
(2)在一次信息調用之后,而該調用使現行進程暫時不能繼續運行。
(3)在一次錯誤處理之后,使現行進程在錯誤處理時被封鎖。
調度策略:
(1)分時系統調用策略
在分時系統中為了提高對交互作用的響應速度,使各進程在較短時間間隔內都有機會占用CPU,則需要比較頻繁地對CPU進行調度。這種調度方式增加了系統的開銷,降低了CPU實際使用效率。 如:為了保證及時響應,采用輪轉算法分配CPU,即以循環方式依次給每個用戶服務請求一個時間片,這也是“分時”的由來。這樣做的作用是防止用戶計算時間長的任務時壟斷CPU,妨礙對其他用戶服務請求的響應。使用平均的是使用CPU,但這時如果時間片過大,相應的平均響應時間增長;若時間片過短,則會增大個服務請求循環排隊的次數,因而也會增加平均響應時間,而且由於頻繁切換,系統開銷也增大了。因此,考慮到系統分時的主要目的。 應在滿足某種交互作用的響應速度前提下提高系統資源的使用效率。
(2)批處理系統調度策略
1.先來先服務算法:
先來先服務算法體現用戶公平。調度策略按照優先數分配CPU。優先數按照所有進程來到的時間戳確定。它優先考慮在系統中等待時間最長的線程,而不管該進程運行時間的長短。這種算法一般是非搶占式調度算法,也就是說,進程 一旦分配CPU,就直至運行結束。
2.最短作業優先調度算法:
這種算法總是優先調度要求運行時間最短的進程作為下一次服務的對象。它可以達到系統最大吞吐量。它的主要缺點是只照顧短進程。因此有可能一個進程進入系統后,由於不斷有比它更短的進程進入系統而使該進程一直得不到時機運行。
3.響應比高者優先調度算法:
這種算法每次調度時,計算后備進度表中各進程的響應比,然后挑選響應比最高者投入運行。因此在系統中的進程只要等待足夠長的時間就有機會運行。該算法考慮到等待時間又兼顧了短作業進程優先,是上述兩種算法的折中。缺點是算法比較復雜,每次調度都要計算一次后備進程隊列中各個進程的響應比。
(3)實時系統調度策略
對於實時系統要求CPU能及時響應,它主要用於實現特定的控制和服務功能。為每一個進程設置一個優先數,CPU調度時每次選擇就緒進程中優先數最大者,讓它占用CPU運行。
(4)通用系統調度策略
1.優先數算法。
2.輪轉發。
3.時間片可變輪轉發與多隊列輪轉法。
一、進程與線程
1、簡單說說進程、線程以及它們的區別
進程: 是系統進行資源分配和調度的一個獨立單位,是最小的資源管理單位。
線程: 是進程的一個實體,是 CPU 調度和分派的基本單位,是最小的 CPU 執行單元。線程自己不擁有任何系統資源,但是它可以訪問其隸屬進程的全部資源。所以線程創建、撤銷、切換的開銷遠小於進程,一個進程可以擁有多個線程。
2、進程的狀態和轉換
三態模型: 一個進程從創建而產生至撤銷而消亡的整個生命周期,可以用一組狀態加以划分,根據三態模型,進程的生命周期可分為如下三種進程狀態:
-
運行態(running):占有處理器正在運行;
-
就緒態(ready):具備運行條件,等待系統分配處理器以便運行;
-
阻塞態(blocked):不具備運行條件,正在等待某個事件的完成。
處於運行態的進程由於出現等待事件而進入阻塞態,直到事件結束則由阻塞態進入就緒態,而處理器的調度策略有會引起運行態和就緒態之間的切換【比如進程被選中進入運行態,時間片用完進入就緒態】
3、進程間的通信方式有哪些
- 管道、命名管道、消息隊列、信號量、信號、共享內存、套接字
進程間通信
每個進程都各自擁有不同的用戶地址空間,任何一個進程的全局變量在另一個進程中都看不到,所以進程之間要交換數據必須通過內核,在內核中開辟一塊緩沖區,進程A把數據從用戶空間拷到內核緩沖區,進程B再從內核緩沖區把數據讀走,內核提供的這種機制稱為進程間通信。
3.1、管道( pipe )
管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。【是由內核管理的一個緩沖區,速度慢,容量有限】
3.2、命名管道 (named pipe)
命名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。
3.3、消息隊列( message queue )
消息隊列是由消息組成的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩沖區大小受限等缺點。
是用於兩個進程之間的通訊,首先在一個進程中創建一個消息隊列,然后再往消息隊列中寫數據,而另一個進程則從那個消息隊列中取數據。需要注意的是,消息隊列是用創建文件的方式建立的,如果一個進程向某個消息隊列中寫入了數據之后,另一個進程並沒有取出數據,即使向消息隊列中寫數據的進程已經結束,保存在消息隊列中的數據並沒有消失,也就是說下次再從這個消息隊列讀數據的時候,就是上次的數據。
3.4、信號量( semophore )
信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。
它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
3.5、信號 ( sinal )
用於通知接收進程某個事件已經發生。
3.6、共享內存( shared memory )
共享內存由一個進程創建,但多個進程都可以訪問。【兩個不同進程 A、B 共享內存的意思是:同一塊物理內存被映射到進程 A、B 各自的進程地址空間。進程 A 可以即時看到進程 B 對共享內存中數據的更新,反之亦然】
共享內存是最快的 IPC(進程間通信) 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信。
3.7、套接字( socket )
套接字也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同機器間的進程通信。
4、進程(或作業)的調度算法有哪些
- 先來先服務、短進程優先、優先權調度算法、高響應比優先調度算法、時間片輪轉調度算法、多級隊列調度算法
4.1、先來先服務(FCFS,First-Come-First-Served)
按照進程進入就緒隊列的先后次序來選擇進程。
4.2、短進程優先(SPF,Shortest Process Next)
從就緒隊列中選出一個估計運行時間最短的進程,將處理機分配給它。
4.3、優先權調度算法(Priority)
按照進程的優先權大小來調度。
4.4、高響應比優先調度算法(HRRN,Highest Response Ratio Next)
按照高響應比((已等待時間+要求運行時間)/ 要求運行時間)優先的原則【等待時間長和運行時間短都會增加其優先值】,每次先計算就緒隊列中每個進程的響應比,然后選擇其值最大的進程投入運行。
4.5、時間片輪轉調度算法(RR,Round-Robin)
當某個進程執行的時間片用完時,調度程序便停止該進程的執行,並將它送就緒隊列的末尾,等待分配下一時間片再執行。然后把處理機分配給就緒隊列中新的隊首進程,同時也讓它執行一個時間片。這樣就可以保證就緒隊列中的所有進程,在一給定的時間內,均能獲得一時間片處理機執行時間。
4.6、多級隊列調度算法
多隊列調度是根據進程的性質和類型的不同,將就緒隊列再分為若干個子隊列,所有的進程按其性質排入相應的隊列中,而不同的就緒隊列采用不同的調度算法。
5、同步和互斥的區別,同步、異步、阻塞、非阻塞的區別
5.1、同步和互斥【同步體現的是一種協作性,互斥體現的是一種排他性】
同步:就是並發的線程在一些關鍵點上可能需要互相等待與互通信息,這種相互制約的等待與互通信息稱為進程(線程)同步。
互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。
5.2、同步、異步【關注的是消息通信機制】
同步: 就是指調用者會主動等待調用的返回結果。
異步: 就是指調用者不會主動等待調用結果,而是在調用發生后,被調用者通過狀態、通知來通知調用者。
5.3、阻塞、非阻塞 【關注的是程序在等待調用結果(消息,返回值)時的狀態】
阻塞: 是指調用結果返回前,當前線程會被掛起,即阻塞。
非阻塞: 是指即使調用結果沒返回,也不會阻塞當前線程。
6、線程【進程】同步的方式有哪些
6.1、線程同步的基本概念
所謂同步,就是並發的線程在一些關鍵點上可能需要互相等待與互通信息,這種相互制約的等待與互通信息稱為進程(線程)同步。
“同”其實是協同,而不是同時,同步體現的是一種協作性。
互斥(指某一資源同時只允許一個訪問者對其進行訪問)體現的是一種排他性。一般情況下,同步已經實現了互斥,特別是寫入資源的情況必定是互斥的。
臨界資源是指一次僅允許一個線程使用的資源。
臨界區指的是一個訪問共用資源(被多個線程共享的臨界資源)的程序片段,而這些共用資源又無法同時被多個線程訪問的特性。當有線程進入臨界區段時,其他線程或是進程必須等待(例如:bounded waiting 等待法),有一些同步的機制必須在臨界區段的進入點與離開點實現,以確保這些共用資源是被互斥獲得使用,例如:semaphore。只能被單一線程訪問的設備,例如:打印機。
6.2、線程同步的方式
臨界區用於單個進程中線程間的同步;互斥量、信號量、事件用於多個進程間的各個線程間實現同步。
1、臨界區:
使用臨界區對象。擁有臨界區對象的線程可以訪問被保護起來的資源或代碼段,其他線程若想訪問,則被掛起,直到擁有臨界區對象的線程放棄臨界區對象為止【只用於同一進程】
2、互斥量:
采用互斥對象機制,只有擁有互斥對象的線程才有訪問公共資源的權限,因為互斥對象只有一個,所以可以保證公共資源不會同時被多個線程訪問。【互斥對象和臨界區對象非常相似,只是其允許在進程間使用,而臨界區只限制於同一進程的各個線程之間使用】
3、信號量:
它允許多個線程同一時刻訪問同一資源,但是需要限制同一時刻訪問此資源的最大線程數目。
信號量(semaphore)的數據結構為一個值和一個指針,指針指向等待該信號量的下一個進程。信號量的值 S 與相應資源的使用情況有關。當 S 大於 0 時,表示當前可用資源的數量;當 S 小於 0 時,其絕對值表示等待使用該資源的進程個數。注意,信號量的值僅能由 PV 操作來改變。
執行一次 P 操作意味着請求分配一個單位資源,因此S的值減1;當 S < 0 時,表示已經沒有可用資源,請求者必須等待別的進程釋放該類資源,它才能運行下去。
而執行一個 V 操作意味着釋放一個單位資源,因此 S 的值加 1;若 S < 0,表示有某些進程正在等待該資源,因此要喚醒一個等待狀態的進程,使之運行下去。
4、事件(信號):
事件機制,則允許一個線程在處理完一個任務后,主動喚醒另外一個線程執行任務。【進程間通信中唯一的一個異步機制】
7、什么是緩沖區溢出,有什么危害,原因是什么?
1、緩沖區溢出:
是指當計算機向緩沖區內填充數據時超過了緩沖區本身的容量,溢出的數據覆蓋在合法數據上。
2、危害:
在當前網絡與分布式系統安全中,被廣泛利用的 50% 以上都是緩沖區溢出。緩沖區溢出中,最為危險的是堆棧溢出,因為入侵者可以利用堆棧溢出,在函數返回時改變返回程序的地址,讓其跳轉到任意地址,帶來的危害一種是程序崩潰導致拒絕服務,另外一種就是跳轉並且執行一段惡意代碼,比如得到 shell,然后為所欲為。
通過往程序的緩沖區寫超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到攻擊的目的。
3、造成緩沖區溢出的主原因:
是程序中沒有仔細檢查用戶輸入的參數。
二、死鎖
2.1 什么是死鎖?
由於系統中存在一些不可剝奪資源,而當兩個或兩個以上進程占有自身資源,並請求對方資源時,會導致每個進程都無法向前推進,這就是死鎖。
2.2 死鎖產生的原因?
1、競爭資源;
2、進程推進順序不當(比如 a,b 互相等待對方發信息)。
2.3 死鎖產生的必要條件?
1、互斥: 一個資源一次只能被一個進程所使用,即是排它性使用。
2、不剝奪: 一個資源僅能被占有它的進程所釋放,而不能被別的進程強制剝奪。
3、請求與保持: 指進程占有自身本來擁有的資源並要求其他資源。
4、循環等待: 存在進程資源的循環等待鏈,鏈中每一個進程已獲得的資源同時被下一個進程所請求。
2.4 怎么處理死鎖?
即死鎖的處理策略:可分為預防死鎖、避免死鎖和死鎖的檢測及解除。
2.4.1、預防死鎖:破壞四個必要條件之一
1. 破壞互斥條件
即允許進程同時訪問某些資源。但是,有的資源是不允許被同時訪問的,像打印機等等。所以,這種辦法並無實用價值。
2. 破壞不可剝奪條件
當一個進程已占有了某些資源,它又申請新的資源,但不能立即被滿足時,它必須釋放所占有的全部資源,以后再重新申請。這就相當於該進程占有的資源被隱蔽地強占了。這種預防死鎖的方法實現起來困難,會降低系統性能。
3. 破壞請求與保持條件
可以實行資源預先分配策略。即進程在運行前,一次性地向系統申請它所需要的全部資源。
如果某個進程所需的全部資源得不到滿足,則不分配任何資源,此進程暫不運行。只有當系統能夠滿足當前進程的全部資源需求時,才一次性地將所申請的資源全部分配給該進程。由於運行的進程已占有了它所需的全部資源,所以不會發生占有資源又申請資源的現象,因此不會發生死鎖。
4.破壞循環等待條件:實行順序資源分配法
首先給系統中的資源編號,規定每個進程,必須按編號遞增的順序請求資源,同類資源一次申請完。也就是說,只要進程提出申請分配資源Ri,則該進程在以后的資源申請中,只能申請編號大於Ri的資源。
2.4.2、避免死鎖
- 銀行家算法【在動態分配資源的過程中,銀行家算法防止系統進入不安全狀態,從而避免死鎖】
銀行家算法:
當進程首次申請資源時,要測試該進程對資源的最大需求量,如果系統現存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。
當進程在執行中繼續申請資源時,先測試該進程已占用的資源數與本次申請資源數之和是否超過了該進程對資源的最大需求量。若超過則拒絕分配資源。若沒超過則再測試系統現存的資源能否滿足該進程尚需的最大資源量,若滿足則按當前的申請量分配資源,否則也要推遲分配。
安全序列:
是指系統能按某種進程推進順序(P1, P2, P3, …, Pn),為每個進程 Pi 分配其所需要的資源,直至滿足每個進程對資源的最大需求,使每個進程都可以順序地完成。這種推進順序就叫安全序列【銀行家算法的核心就是找到一個安全序列】。
系統安全狀態 :
如果系統能找到一個安全序列,就稱系統處於安全狀態,否則,就稱系統處於不安全狀態
2.4.3、死鎖的檢測和解除
即在死鎖產生前不采取任何措施,只檢測當前系統有沒有發生死鎖,若有,則采取一些措施解除死鎖。
死鎖的檢測:
根據死鎖定理:S 為死鎖的條件是當且僅當 S 狀態的資源分配圖是不可完全簡化的,該條件稱為死鎖定理。
死鎖的解除:
1、資源剝奪:掛起某些死鎖進程,並搶占它的資源,將這些資源分配給其他死鎖進程。(但應該防止被掛起的進程長時間得不到資源);
2、撤銷進程:強制撤銷部分、甚至全部死鎖進程並剝奪這些進程的資源。(撤銷的原則可以按進程優先級和撤銷進程代價的高低進行);
3、進程回退:讓一個或多個進程回退到足以避免死鎖的地步。【進程回退時自願釋放資源而不是被剝奪。要求系統保持進程的歷史信息,設置還原點。】
三、內存
3.1、固定分區、動態分區、分段式存儲管理和分頁式存儲管理的區別
內存分配分為連續分配和非連續分配管理兩種。
3.1.1、內存連續分配
1、單一連續分配:分為系統區和用戶區,系統區供給操作系統使用,用戶區供給用戶使用,內存中永遠只有一道程序。
2、固定分區分配:最簡單的一種多道程序管理方式,它將用戶內存空間划分為若干個固定大小的區域,每個分區只裝入一道作業。【方法一:分區大小相等;方法二:分區大小不等,划分為含有多個較小的分區,適量的中等分區及少量的大分區】
3、動態分區分配:又稱為可變分區分配,是一種動態划分內存的方法。這種分區方法不預先將內存划分,而是在進程裝入內存時,根據進程的大小動態的建立分區,並使分區的大小正好適合進程的需要。因此系統中分區的大小和數目是可變的。
3.1.2、非連續分配
1、分頁式存儲管理:分頁存儲管理是將一個進程的地址(邏輯地址空間)空間划分成若干個大小相等的區域,稱為頁,相應地,將內存空間划分成與頁相同大小(為了保證頁內偏移一致)的若干個物理塊,稱為塊或頁框(頁架)。在為進程分配內存時,將進程中的若干頁分別裝入多個不相鄰接的塊中。【只需給出一個地址,所以是一維】
分頁系統中,允許將進程的每一頁離散地存儲在內存的任一物理塊中,為了能在內存中找到每個頁面對應的物理塊,系統為每個進程建立一張頁面映射表,簡稱頁表。頁表的作用是實現從頁號到物理塊號的地址映射。【若給定一個邏輯地址為 A,頁面大小為 L,則頁號 P = INT[A / L],頁內地址 W=A MOD L】
分頁系統中,CPU每次要存取一個數據,都要兩次訪問內存(訪問頁表、訪問實際物理地址)。為提高地址變換速度,增設一個具有並行查詢能力的特殊高速緩沖存儲器,稱為“聯想存儲器”或“快表”,存放當前訪問的頁表項。
2、分段式存儲管理:在分段存儲管理方式中,作業的地址空間被划分為若干個段,每個段是一組完整的邏輯信息,如有主程序段、子程序段、數據段及堆棧段等,每個段都有自己的名字,都是從零開始編址的一段連續的地址空間,各段長度是不等的。【因為每段的長度是不確定的,所以不能只給一個邏輯地址通過整數除法得到段號,求余得出段內偏移,所以一定要顯式給出(段號,段內偏移),因此分段管理的地址空間是二維的】
3.1.3、兩者的區別
1.分頁式管理方式是從計算機的角度考慮設計的,以提高內存的利用率,提升計算機性能,且分頁通過硬件機制實現,對用戶完全透明;
2.分段式管理方式的提出則是考慮了用戶和程序員,以滿足方便編程、信息保護和共享、動態增長及動態鏈接等多方面的需要。
3.分頁式存儲管理的作業地址空間是一維的,分段式的存儲管理的作業管理地址空間是二維的。【頁式系統中,邏輯地址的頁號和頁內偏移量對用戶是透明的【用戶提供一個邏輯地址即可】,但在段氏系統中,段號和段內偏移量必須由用戶顯式提供(在高級程序設計語言中,這個工作由編譯程序完成)】
3.2、頁面置換算法有哪些?
最佳置換算法、先進先出置換算法、最近最久為使用置換算法 LRU、時鍾置換算法、最少使用置換算法
1、最佳置換算法(Optimal):即選擇那些永不使用的,或者是在最長時間內不再被訪問的頁面置換出去。(它是一種理想化的算法,性能最好,但在實際上難於實現);
2、先進先出置換算法 FIFO:總是淘汰最先進入內存的頁面;
3、最近最久未使用置換算法 LRU(Least Recently Used):即選擇最近最久未使用的頁面予以淘汰。【系統在每個頁面設置一個訪問字段,用以記錄這個頁面自上次被訪問以來所經歷的時間 T,當要淘汰一個頁面時,選擇 T 最大的頁面。】
4、時鍾(Clock)置換算法:也叫最近未用算法 NRU(Not RecentlyUsed)。該算法為每個頁面設置一位訪問位,將內存中的所有頁面都通過鏈接指針鏈成一個循環隊列。當某頁被訪問時,其訪問位置“1”。在選擇一頁淘汰時,就檢查其訪問位,如果是“0”,就選擇該頁換出;若為“1”,則重新置為“0”,暫不換出該頁,在循環隊列中檢查下一個頁面,直到訪問位為“0”的頁面為止。由於該算法只有一位訪問位,只能用它表示該頁是否已經使用過,而置換時是將未使用過的頁面換出去,所以把該算法稱為最近未用算法。
5、最少使用置換算法LFU:該算法選擇最近時期使用最少的頁面作為淘汰頁。
3.3、邏輯地址、物理地址、虛擬內存、操作系統的內容
1、物理地址:它是地址轉換的最終地址,進程在運行時執行指令和訪問數據最后都要通過物理地址從主存中存取,是內存單元真正的地址。
2、邏輯地址:是指從應用程序角度看到的內存地址,又叫相對地址。編譯后,每個目標模塊都是從 0 號單元開始編址,稱為該目標模塊的相對地址或邏輯地址。不同進程可以有相同的邏輯地址,因為這些相同的邏輯地址可以映射到主存的不同位置。用戶和程序員只需要知道邏輯地址。
3、虛擬內存:虛擬內存是一些系統頁文件,存放在磁盤上,每個系統頁文件大小為 4K,物理內存也被分頁,每個頁大小也為 4K,這樣虛擬頁文件和物理內存頁就可以對應,實際上虛擬內存就是用於物理內存的臨時存放的磁盤空間。頁文件就是內存頁,物理內存中每頁叫物理頁,磁盤上的頁文件叫虛擬頁,物理頁+虛擬頁就是系統所有使用的頁文件的總和。
虛擬內存技術:允許將一個作業分多次調入內存。可以用分頁式、分段式、段頁式存儲管理來實現。
基於局部性原理,在程序裝入時,可以將程序的一部分裝入內存,而其余部分留在外存,就可以啟動程序執行。在程序執行過程中,當所訪問的信息不在內存時,由操作系統將所需要的部分調入內存,然后繼續執行程序。另一方面,操作系統將內存中暫時不使用的內容換出到外存上,從而騰出空間放入將要調入內存的信息。這樣,系統就好像為用戶提供了一個比實際內存大得多的存儲器,稱為虛擬存儲器。
4、操作系統主要包括:進程和線程的管理、存儲管理、設備管理、文件管理
3.4、動態鏈接庫和靜態鏈接庫的區別
靜態連接庫: 一種是 LIB 包含函數代碼本身,在編譯時直接將代碼加入程序當中,稱為靜態鏈接庫。
靜態鏈接: 靜態鏈接使用靜態鏈接庫,鏈接器從靜態鏈接庫 LIB 獲取所有被引用函數,並將庫同代碼一起放到可執行文件中。
動態鏈接庫: 一種是 LIB 包含了函數所在的DLL文件和文件中函數位置的信息(入口),代碼由運行時加載在進程空間中的 DLL 提供,稱為動態鏈接庫。
動態鏈接: 使用動態鏈接庫,允許可執行模塊(.dll 文件或 .exe 文件)僅包含在運行時定位 DLL 中函數的可執行代碼所需的信息。
二者的區別:
靜態庫本身就包含了代碼,地址符號表等,而對於導入庫而言,其實際的執行代碼位於動態庫中,導入庫只包含了地址符號表等,確保程序找到對應函數的一些基本地址信息;
靜態鏈接庫是一個或多個 obj 文件的打包,所以有人干脆把從 obj 文件生成lib的過程稱為 Archive 即合並到一起。當我們應用工程在使用靜態鏈接庫的時候,靜態鏈接庫要參與編譯,在生成執行文件之前的鏈接過程中,將靜態鏈接庫的全部指令直接鏈接如可執行文件中,故而,在可執行文件生成以后,靜態鏈接庫 .lib 可以棄之不用;
動態鏈接庫是作為共享函數庫的可執行文件,動態鏈接庫提供了一種方法,是進程可以調用不屬於其可執行代碼的函數。dll 還有助於共享數據和資源。多個應用程序可同時訪問內存中單個dll副本的內容。
使用動態鏈接庫代替靜態鏈接庫優點:dll 節省內存,減少交換操作,節省磁盤空間,更易於升級(不需要重鏈接和重編譯),提供售后支持,提供 MFC 庫類的機制,支持多語言支持。
靜態鏈接庫與動態鏈接庫都是共享代碼的方式,如果采用靜態鏈接庫,lib中的指令都全部被直接包含在最終生成的exe文件中了。但是若使用dll動態鏈接庫,該dll不必被包含在最終的exe文件中,執行文件執行時可以動態地引用和卸載這個與exe獨立的dll文件。
另一個區別是,靜態鏈接庫不能再包含其他的動態鏈接庫或者靜態庫,而在動態鏈接庫中還可以再包含其他的動態或靜態鏈接庫。
靜態鏈接庫動態鏈接庫使用的區別在於它允許可執行模塊(dll或exe文件)僅包含在運行時定位dll函數的可執行代碼的所需信息。靜態鏈接庫的使用中,連接器從靜態鏈接庫獲取所有被引用的函數,並將庫同代碼一起放到可執行文件中。
3.5、局部性原理
時間局部性: 如果程序中某條指令一旦執行,不久后該指令可能再次執行;如果某數據被訪問過,不久后該數據可能再次被訪問。【原因:因為在程序中存在着大量的循環操作】
空間局部性: 一旦程序訪問了某個存儲單元,在不久之后,其附近的存儲單元也將被訪問。【原因:因為指令通常是順序存放、順序執行的;數據也一般是以向量、數組、表等形式簇聚存儲的】
3.6、中斷、系統調用、庫函數
1、中斷
就是指在計算機執行程序的過程中,由於出現了某些特殊事情,使得 CPU 暫停對程序的執行,轉而去執行處理這一事件的程序。等這些特殊事情處理完之后再回去執行之前的程序。中斷一般分為三類:
1.內部異常中斷:由計算機硬件異常或故障引起的中斷;
2.軟中斷:由程序中執行了引起中斷的指令而造成的中斷;
3.外部中斷:由外部設備請求引起的中斷;
2、系統調用
系統調用是通向操作系統本身的接口,是面向底層硬件的。通過系統調用,可以使得用戶態運行的進程與硬件設備(如CPU、磁盤、打印機等)進行交互。
用戶進程需要發生系統調用時,內核將調用內核相關函數來實現(如sys_read(),sys_write(),sys_fork())。用戶程序不能直接調用這些函數,這些函數運行在內核態,CPU 通過軟中斷切換到內核態開始執行內核系統調用函數。
系統調用和中斷的關系就在於,當進程發出系統調用申請的時候,會產生一個軟中斷。產生這個軟中斷以后,系統會去對這個軟中斷進行處理,這個時候進程就處於核心態了。
3、庫函數
庫函數是把函數放到庫里,供別人使用的一種方式。【系統調用是為了方便使用操作系統的接口,而庫函數則是為了人們編程的方便。】
3.7、不同進程打開了同一個文件,那么這兩個進程得到的文件描述符(fd)相同嗎?
兩個進程中分別產生生成兩個獨立的 fd。文件描述符與打開文件的關系?
內核中,對應於每個進程都有一個文件描述符表,表示這個進程打開的所有文件。文件描述表中每一項都是一個指針,指向一個用 於描述打開的文件的數據塊———file對象,file對象中描述了文件的打開模式,讀寫位置等重要信息,當進程打開一個文件時,內核就會創建一個新的file對象。需要注意的是,file對象不是專屬於某個進程的,不同進程的文件描述符表中的指針可以指向相同的file對象,從而共享這個打開的文件。file對象有引用計數,記錄了引用這個對象的文件描述符個數,只有當引用計數為0時,內核才銷毀file對象,因此某個進程關閉文件,不影響與之共享同一個file對象的進程。