計算機操作系統(筆記)

計算機操作系統

可參考Jennica的文章:http://jennica.space/2017/03/21/os-principle/

常用指令介紹

答:(1)授權指令chmod

chmod [who] [+ | - | =] [mode] 文件名;
who:默認爲a,表示“所有(all)用戶”;
+-=: + 添加某個權限; - 取消某個權限; = 賦予給定權限並取消其他所有權限(如果有的話);
mode:0表示沒有權限'-'(0用字符'-'表示);1表示可執行權限'x';2表示可寫權限'w';4表示可讀權限'r’。然後按照3個一組,將其相加;
例如,rwxrw-r-x就是4-2-1-4-2-0-4-0-1,三個一組就是765。注意有時候是這樣寫的:-rwxrw-r-x,其前面有一個'-',這個'-'不表示0,而是表示該權限是文件的權限,若將'-'改變爲'd'就表示目錄的權限;

(2)tar命令

tar命令有3個主選項,分別是c、x、t;這三個主選項不可同時存在,其中c表示壓縮,x表示解壓、t表示查看;

幾個其他壓縮/解壓縮命令:tar是操作.tar的命令;gzip是壓縮.gz壓縮包的命令;compress:壓縮.Z文件;uncompress:解壓縮.Z文件。

(3)tcpdump命令

作用:簡單可靠網絡監控的實用工具.

基本的用法:tcpdump -i eth0;其中,eth0爲參數值,表示需要抓包的網口,這是個必需參數哦。

(4)ARP命令

用於查看高速緩存中的所有項目。ARP常用命令選項:arp -a或arp -g用於查看高速緩存中的所有項目;

(5)Linux掛載設備命令mount:其語法是:mount [選項] <-t 類型> [-o 掛載選項] <設備> <掛載點>。例如掛載我們新創建的分區的命令是:mount -t ext3 /dev/hdb1 /mnt

-t 選項用於指定分區上文件系統的類型;

-o 選項用於指定一個或多個掛載選項;

要卸下分區,請使用 umount 命令。語法很簡單:umount <掛載點|設備>例如:從掛載點卸載:umount /mnt ;或者直接從硬件文件

中卸載:umount /dev/hdb1。

(6)文件描述符域標準輸入/輸出、重定向

輸入重定向:所謂重定向輸入就是在命令中指定具體的輸入來源,譬如 cat < test.c表示: 將test.c重定向爲cat命令的輸入源;

輸出重定向:是指定具體的輸出目標以替換默認的標準輸出,譬如ls > 1.txt將1.txt文本重定向爲ls的標準輸出結果。有時候會看到如 ls >> 1.txt這類的寫法,>和>>的區別在於:>用於新建而>>用於追加。即ls>1.txt會新建一個1.txt文件並且將ls的內容輸出到新建的1.txt中,而ls >> 1.txt則用在1.txt已經存在,而我們只是想將ls的內容追加到1.txt文本中的時候;

(7)查看CPU利用率:top

(8)free命令可以顯示Linux系統中空閒的、已用的物理內存及swap內存及被內核使用的buffer。free命令是最經常使用的命令之一。

(9)查看當前目錄:pwd和ls(ls -a可以查看隱藏目錄)

(10)切換目錄:cd

(11)查看文件佔用磁盤大小:du和df

(12)創建文件夾:mkdir

(13)新建文件:touch

(14)查看文件:cat

(15)拷貝:cp 移動:mv 刪除:rm

(16)查看進程:ps,如ps aux

(17)刪除進程:kill -9 PID,注-9是參數

(18)程序運行時間:time,使用時在命令前添加time即可,如:time ./test,可得到三個時間:real 0m0.020s,user 0m0.000s,sys 0m0.018s
(19)grep命令(重要命令之一):常用於打開文本修改保存,類似打windows開開TXT文本並修改;

(20)sed命令(重要命令之一):主要用於對文件的增刪改查;

(21)awk命令(重要命令之一):取列是其擅長的;

(22)find 命令(常與xargs命令配合):查找 -type 文件類型-name 按名稱查找-exec執行命令;

(23)xargs命令:配合find/ls查找,將查找結果一條條的交給後續命令處理;

(24)gdb調試工具:要調試C/C++的程序,一般有如下幾個步驟:

①首先在編譯時,我們必須要把調試信息加到可執行文件中,編譯生成可執行文件-------> g++ -g hello.cpp -o hello;
②啓動GDB編譯hello程序----------> gdb hello;
③顯示源碼------------> l;
④開始調試:break 16——設置斷點在16行,break func——設置斷點在函數func()入口處,info break——查看斷點信息,n——單步運行,c——繼續運行程序,r——運行程序;p i——打印i的值,finish——退出程序,q——退出gdb。


章節一、操作系統概述

1、計算機馮諾依曼結構的五大組成部分

答:馮.諾依曼理論體系下的計算機五大邏輯部件分別是:控制器、運算器、存儲器、輸入/輸出設備。Cache屬於緩存,不是必需的。


2、操作系統功能

答:操作系統的基本功能有:
1.處理機管理(也就是進程管理)
2.存儲器管理
3.設備管理
4.文件管理
5.用戶接口(或操作系統接口)

注:一般把進程管理歸爲處理機管理之中,不單獨說明。


3、常見的幾種操作系統類別

答:(1)批處理操作系統:又分爲單道批處理系統和多道批處理系統,其出現時間較早,主要是爲了處理早期IO設備速度和CPU速度差距過大,導致昂

貴的CPU資源浪費的問題。

其原理是:將多個作業組成一批,然後送入CPU處理,從而避免原來CPU處理單作業後的長時間等待;

主要目的:提高資源利用效率。

(2)實時操作系統:有嵌入式操作系統,設計實時操作系統首先應該考慮系統的實時性和可靠性

(3)多用戶分時操作系統:利用時間片,輪轉對多個用戶進行服務,而時間片輪轉的方式肯定是實時性不高的,分時系統所考慮的主要是使多個用戶感

覺不到是在多人共享計算機,交互性較好。所以要求交互性是最重要的


4、操作系統的兩個基本特徵

答:併發和共享是操作系統的兩個最基本的特性,它們又是互爲存在條件。一方面資源共享是以程序(進程)的併發性執行爲條件的,若系統不允許程

序併發執行,自然不存在資源共享問題。另一方面若系統不能對資源共享實施有效管理,則也必將影響到程序併發執行。


5、操作系統體系結構

答:操作系統體系結構包括4層:最底層是硬件,次底層是操作系統內核,第二層是操作系統與用戶接口shell以及編譯程序等,第一層是應用程序。具體如圖:


章節二、進程管理

1、進程與進程控制塊(PCB)

答:(1)進程
進程由PCB(進程控制塊)、有關程序段和該程序段對其進行操作的數據結構集組成;
1)進程有四種狀態:執行、阻塞(等待)、就緒和掛起;
2)進程各個狀態之間互相轉換:
①就緒——執行:對就緒狀態的進程,當進程調度程序按一種選定的策略從中選中一個就緒進程,爲之分配了處理機後,該進程便由就緒狀態變爲執行狀態;
②執行——阻塞:正在執行的進程因發生某等待事件而無法執行,如IO請求,則進程由執行狀態變爲等待狀態,如進程提出輸入/輸出請求而變成等待外部設備傳輸信息的狀態,進程申請資源(主存空間或外部設備)得不到滿足時變成等待資源狀態,進程運行中出現了故障(程序出錯或主存儲器讀寫錯等)變成等待干預狀態等等;
③阻塞——就緒:處於等待狀態的進程,在其等待的事件已經發生,如IO完成,資源得到滿足或錯誤處理完畢時,處於等待狀態的進程並不馬上轉入執行狀態,而是先轉入就緒狀態,然後再由系統進程調度程序在適當的時候將該進程轉爲執行狀態;
④執行——就緒:正在執行的進程,因時間片用完而被暫停執行,或在採用搶先式優先級調度算法的系統中,當有更高優先級的進程要運行而被迫讓出處理機時,該進程便由執行狀態轉變爲就緒狀態。
⑤**——>掛起分三種:
阻塞——掛起:其中阻塞可以稱爲活動阻塞,掛起稱爲靜止阻塞;
就緒——掛起:其中就緒可以稱爲活動就緒,掛起稱爲靜止就緒;
執行——掛起:其中執行不變,掛起稱爲靜止就緒;
故可得出結論:掛起就是靜止狀態;
⑥掛起解除只有一種情況:掛起——就緒;
3)引入掛起的原因:用戶的需求(用戶需要掛起一部分進程)、父進程需求(父進程需要考察和修改子進程)、負載均和需求(掛起一部分進程緩解負載)、操作系統需求(操作系統掛起一部分進程進行檢查)。
(2)進程控制塊(PCB)
1)PCB(Processing Control Block)是系統爲了管理進程設置的一個專門的數據結構。系統用它來記錄進程的外部特徵,描述進程的運動變化過程。同時,系統可以利用PCB來控制和管理進程,所以說,PCB(進程控制塊)是系統感知進程存在的唯一標誌。即:每個進程都有一個PCB,且是唯一的。
2)PCB一般包括進程ID、處理機狀態、進程調度信息、進程控制信息,具體包括:
1.程序ID(PID、進程句柄):它是唯一的,一個進程都必須對應一個PID。PID一般是整型數字;
2.特徵信息:一般分系統進程、用戶進程、或者內核進程等 ;
3.進程狀態:運行、就緒、阻塞,表示進程現的運行情況 ;
4.優先級:表示獲得CPU控制權的優先級大小 ;
5.通信信息:進程之間的通信關係的反映,由於操作系統會提供通信信道 ;
6.現場保護區:保護阻塞的進程用 ;
7.資源需求、分配控制信息 ;
8.進程實體信息,指明程序路徑和名稱,進程數據在物理內存還是在交換分區(分頁)中 ;
9.其他信息:工作單位,工作區,文件信息等;

3)每個進程有一個PCB,如何組織衆多的PCB
①鏈表隊列模式:
對各個狀態的PCB分別建立一個鏈表隊列,同時保存4個指針,分別是,
第一個執行指針指向當前執行PCB;
第二個就緒隊列指針指向就緒狀態的PCB鏈表隊列首元素;
第三個阻塞隊列指針指向阻塞狀態的PCB鏈表隊列首元素;
第四個空閒隊列指針指向空閒狀態的PCB鏈表隊列首元素;

②索引模式:
對各個狀態PCB分別建立一個索引表,同時保存4個指針,分別是,
第一個執行指針直接指向當前執行PCB;
第二個就緒表指針指向就緒索引表的首地址;
第三個阻塞表指針指向阻塞索引表的首地址;
第二個空閒表指針指向空閒索引表的首地址;

4)創建進程需要的步驟:
1,申請空白PCB(進程控制塊);
2,爲新進程分派資源;
3,初始化PCB;

4,將新進程插入就緒隊列。


2、進程切換

答:進程切換的原因:中斷的發生、更高優先級進程的喚醒、進程消耗完時間片或阻塞的發生;

進程切換的步驟:
①保存處理器的上下文,包括程序計數器和其它寄存器;
②用新狀態和其它相關信息更新正在運行進程的PCB;
③把原來的進程移至合適的隊列-就緒、阻塞;
④選擇另一個要執行的進程;
⑤更新被選中進程的PCB;
⑥從被選中進程中重裝入;

3、在Linux中主要提供了fork、vfork、clone三個進程創建方法

答:fork() 函數複製時將父進程的所有資源都通過複製數據結構進行了複製,然後傳遞給子進程,所以 fork() 函數不帶參數。實際上,fork函數將運行着的程序分成2個(幾乎)完全一樣的進程,每個進程都啓動一個從代碼的同一位置開始執行的線程。這兩個進程中的線程繼續執行,就像是兩個用戶同時啓動了該應用程序的兩個副本。;clone() 函數則是將部分父進程的資源的數據結構進行復制,複製哪些資源是可選擇的,這個可以通過參數設定,所以 clone() 函數帶參數,沒有複製的資源可以通過指針共享給子進程。


4、臨界資源

答:在操作系統中,將互斥共享資源成爲臨界資源,即該資源可共享,但每次只能一個進程訪問,例如輸入機、打印機、磁帶機等。每個進程中訪問臨界資源的那段代碼稱爲臨界區,在操作系統中,有臨界區的概念。臨界區內放的一般是被1個以上的進程或線程(以下只說進程)共用的數據。臨界區內的數據一次只能同時被一個進程使用,當一個進程使用臨界區內的數據時,其他需要使用臨界區數據的進程進入等待狀態。操作系統需要合理的分配臨界區以達到多進程的同步和互斥關係,如果協調不好,就容易使系統處於不安全狀態,甚至出現死鎖現象。

5、進程飢餓

答:由於別的併發進程持久佔有所需資源,使某個異步過程在一定時間內不能被激活,從而導致進程推進和響應受到明顯影響時,稱發生了進程飢餓。當飢餓到一定程度,進程所賦予的任務即使完成也不再具有實際意義時稱該進程被餓死。

6、孤兒進程、殭屍進程、守護進程

答:定義如下:
(1)殭屍進程:一個子進程在其父進程還沒有調用wait()或waitpid()的情況下退出。這個子進程就是殭屍進程;
(2)孤兒進程:一個父進程退出,而它的一個或多個子進程還在運行,那麼那些子進程將成爲孤兒進程。孤兒進程將被init進程(進程號爲1)所收養,並由init進程對它們完成狀態收集工作;
注:殭屍進程將會導致資源浪費,而孤兒則不會。
(3)守護進程:守護進程(Daemon Process),也就是通常說的 Daemon 進程(精靈進程),是 Linux 中的後臺服務進程。它是一個生存期較長的進程,通常獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。
守護進程是個特殊的孤兒進程,這種進程脫離終端,爲什麼要脫離終端呢?之所以脫離於終端是爲了避免進程被任何終端所產生的信息所打斷,其在執行過程中的信息也不在任何終端上顯示。

守護進程更多參考:http://blog.csdn.net/lianghe_work/article/details/47659889


7、程序執行特徵

答:程序的順序執行的特徵包括:

1)順序性;

2)封閉性;

3)程序執行結果的確定性;

4)程序執行結果的可再現性。

程序的併發(多道程序)執行可能特徵包括:1)在執行期間併發程序相互制約;2)程序與計算不再一一對應;3)併發執行的結果不可再現;4)程

序的並行執行與程序的併發執行。


8、並行與併發

答:併發與並行是兩個不同的概念:併發是指多個請求向處理器同時請求,服務器的響應過程是依次響應,或者輪轉響應的;並行是多個請求向多個處理器,各自處理各自的請求。

或者說:在單CPU系統中,系統調度在某一時刻只能讓一個線程運行,雖然這種調試機制有多種形式(大多數是時間片輪巡爲主),但無論如何,要通過不斷切換需要運行的線程讓其運行的方式就叫併發(concurrent)。而在多CPU系統中,可以讓兩個以上的線程同時運行,這種可以同時讓兩個以上線程同時運行的方式叫做並行。


9、管程

答:管程的基本思想是,將共享變量和對它們的操作集中在一個模塊中,操作系統或併發程序就由這樣的模塊構成。這樣模塊之間聯繫清晰,便於維護和修改,易於保證正確性。
管程有一個很重要的特性,即任一時刻管程中只能有一個活躍進程,這一特性使管程能有效地處理互斥問題。

10、核心態和用戶態、內核級線程與用戶級線程

答:(1)進程的執行狀態分爲:核心態和用戶態

兩者的主要區別就在於進程能否獲取計算機的所有資源(核心態可以,用戶態則受到限制)。

用戶態:Ring3運行於用戶態的代碼則要受到處理器的諸多檢查,它們只能訪問映射其地址空間的頁表項中規定的在用戶態下可訪問頁面的虛擬地址,且只能對任務狀態段(TSS)中I/O許可位圖(I/O Permission Bitmap)中規定的可訪問端口進行直接訪問。

核心態:Ring0 在處理器的存儲保護中,核心態,或者特權態(與之相對應的是用戶態),是操作系統內核所運行的模式。運行在該模式的代碼,可以無限制地對系統存儲、外部設備進行訪問。

凡是涉及到計算機根本運行的事情都應該在覈心態下執行,而中斷、時鐘日期、存儲映象圖都屬於系統級(相對應的是用戶級)的資源,對這些資源的修改都必須在覈心態,但是讀取則沒有強制要求。

用戶態切換到內核態的3種方式:

a、系統調用

這是用戶態進程主動要求切換到內核態的一種方式,用戶態進程通過系統調用申請使用操作系統提供的服務程序完成工作,比如前例中fork()實際上就是執行了一個創建新進程的系統調用。而系統調用的機制其核心還是使用了操作系統爲用戶特別開放的一箇中斷來實現,例如Linux的int 80h中斷。

b、 異常

當CPU在執行運行在用戶態下的程序時,發生了某些事先不可知的異常,這時會觸發由當前運行進程切換到處理此異常的內核相關程序中,也就轉到了內核態,比如缺頁異常。

c、 外圍設備的中斷

當外圍設備完成用戶請求的操作後,會向CPU發出相應的中斷信號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷信號對應的處理程序,如果先前執行的指令是用戶態下的程序,那麼這個轉換的過程自然也就發生了由用戶態到內核態的切換。比如硬盤讀寫操作完成,系統會切換到硬盤讀寫的中斷處理程序中執行後續操作等。

總結:這3種方式是系統在運行時由用戶態轉到內核態的最主要方式,其中系統調用可以認爲是用戶進程主動發起的,異常和外圍設備中斷則是被動的。

(2)線程級別分爲內核級和用戶級

內核線程: 由操作系統內核創建和撤銷。內核維護進程及線程的上下文信息以及線程切換。一個內核線程由於I/O操作而阻塞,不會影響其它線程的運

行。Windows NT和2000/XP支持內核線程 

用戶線程:由應用進程利用線程庫創建和管理,不以來於操作系統核心。不需要用戶態/核心態切換,速度快。操作系統內核不知道多線程的存在,因

此一個線程阻塞將使得整個進程(包括它的所有線程)阻塞。由於這裏的處理器時間片分配是以進程爲基本單位,所以每個線程執行的時間相對減少。

Windows NT和OS/2支持內核線程;Linux 支持內核級的多線程


11、線程的互斥量(鎖)與信號量

答:(1)互斥量用於線程的互斥,信號量用於線程的同步;這是互斥量和信號量的根本區別,也就是互斥和同步之間的區別。

互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的;

同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入

資源的情況必定是互斥的,少數情況是指可以允許多個訪問者同時訪問資源;

(2) 互斥量值只能爲0/1,信號量值可以爲非負整數;

(3)互斥量的加鎖和解鎖必須由同一線程分別對應使用,信號量可以由一個線程釋放,另一個線程得到。

即:互斥量是針對一個線程的狀態而言的,信號量是針對多個線程狀態的;例如:

當信號量用於臨界資源的共享時,信號量初始值爲1,取值範圍爲(-1, 0,1),

當信號量爲1時,表示兩個進程皆未進入需要互斥的臨界區;

當信號量爲0時,表示有一個進程進入臨界區運行,另一個必須等待;

當信號量爲-1時,表示有一個進程正在臨界區運行,另一個進程因等待而阻塞在信號量隊列中,需要當前已在臨界區運行的進程退出時喚醒。


12、使用線程是如何防止出現大的波峯

答:意思是如何防止同時產生大量的線程,方法是使用線程池,線程池具有可以同時提高調度效率和限制資源使用的好處,線程池中的線程達到最大數

時,其他線程就會排隊等候。


13、進程與線程

答:線程和進程的區別聯繫:

(1)進程有自己獨立的進程資源(如:地址空間),線程則共享資源;

(2)進程是並行工作的基本單位和資源分配基本單元,線程是CPU調度的基本單位;

(2)二者均可併發執行;

(3)一個程序至少有一個進程,一個進程至少有一個線程,它們是包含關係;

練習與區別見下圖:


如上圖:線程在共享進程的靜態、動態區和其他資源時,自己會獨立維護一個線程堆(用於存儲線程自己私有的全局數據)和一個線程棧(用於存儲自己局部數據),這兩者是不共享的。


更多區別見下表:

根本區別就一點:進程有自己獨立的進程資源(如:地址空間),線程則共享資源。

線程私有與共享:

1)線程私有包括:棧、寄存器、狀態、程序計數器;

2)線程間共享的有:堆,地址空間,全局變量,靜態變量;

進程間的通信與線程間通信方式:

進程間通信方法有:共享內存、消息傳遞(直接或間接傳遞)、管道;

線程間通信方法主要有3種:全局變量、消息機制、事件;
# 全局變量——這個容易理解,也是最常用的方式,通過修改和讀取全局變量來實現多個線程之間通信;

#Message消息機制——windows程序設計中都有線程間的消息通信機制。常用的Message通信的接口主要有兩個:PostMessage和PostThreadMessage,PostMessage爲線程向主窗口發送消息。而PostThreadMessage是任意兩個線程之間的通信接口;

# CEvent對象——CEvent爲MFC中的一個對象,可以通過對CEvent的觸發狀態進行改變,從而實現線程間的通信和同步。

注意:線程間的通信目的主要是用於線程同步,所以線程中一般沒有像進程通信中的用於數據交換的通信機制

更多關於進程、線程的詳情參見:http://blog.csdn.net/xiongchao99/article/details/74858900


章節三、處理機調度與死鎖

1、操作系統作業調度

答:作業(job)是操作系統中一個常見的概念,所謂作業是指用戶在一次計算過程或者事務處理過程中,要求計算機系統所作工作的集合。

設計作業調度算法時應達到如下目標:

•    (1) 某段時間內儘可能運行更多的作業,應該優先考慮短作業。

•    (2) 使處理機保持繁忙,應該優先考慮計算量大的作業,即計算型作業。

•    (3) 使I/O設備保持繁忙,應該優先考慮I/O繁忙的作業,即I/O型作業。

•    (4) 對所有的作業儘可能公平合理的。這就要求對每個作業儘可能公平對待,不無故地或無限期地拖延一個作業的執行。

常見的調度模式:

高級調度 :就是作業調度或長程調度;

中級調度 :就是存儲系統中的“對換”,頁面置換就是使用對換技術;

低級調度 :就是進程調度或短程調度;

具體就是:

高級調度:從後備作業隊列(作業控制塊)中將作業調入進就緒進程隊列,所以作業控制塊中存放的是後背作業隊列。

中級調度:引入中級調度是爲了提高內存的使用率吞,將一些暫時不能運行的進程從內存移動到外存上去。即內存外存之間不斷交換,所以中級調度會涉及到虛擬存儲器。暫時不能運行的進程,由就緒掛起隊列,阻塞掛起隊列。而阻塞隊列裏的進程會由於等待時間過長自動調入到阻塞掛起隊列裏面去。

低級調度(進程調度或者短程調度)分兩類:非搶佔式調度和搶佔式調度,從就緒進程隊列中選取合適進程送到CPU上運行。


(一)作業調度離不開具體調度算法,常用的幾種作業調度算法:

(1)先來先服務調度算法

該算法優先考慮在系統中等待時間最長的作業,而不考慮作業運行時間的長短。如下例,作業運行的次序爲:1,2,3,4:


(2)短作業優先調度算法

短作業優先調度算法(shortest job first,SJF)總是從作業的後備隊列中挑選運行時間最短的作業,作爲下—個調度運行的對象。如下例,作業運行的次序爲:1,3,4,2:


(3)響應比高者優先調度算法

所謂響應比高者優先調度算法,就是在每次調度作業運行時,先計算後備作業隊列中每個作業的響應比,然後挑選響應比最高者投入運行。響應比R定義如下:

R=作業的響應時間/作業的運行時間

作業的響應時間=作業的等待時間+作業的運行時間

因此,作業的響應比爲:R=1+作業的等待時間/作業的運行時間。

從以上公式中可從看出,一個作業的響應比隨着等待時間的增加而提高。這樣,只要系統中的某作業等待了足夠長的時間,它總會成爲響應比最高者而獲得運行的機會。如下例,作業運行的次序爲:1,3,2,4:


(4)最高優先數調度算法

此算法根據作業的優先數調度作業進入系統運行。爲每個作業確定一個優先數,資源能滿足且優先數高的作業優先被選中,當幾個作業有相同的優先數時,對這些具有相同優先數的作業再按照先來先服務原則進行調度。作業優先數的確定各系統有所不同,有些系統由系統本身根據作業對資源的要求確定其優先數,有的由用戶自行確定自己作業的優先數。

優先數一般在系統中是根據進程運行情況動態確定的,但也有靜態優先數調度;

(5)均衡調度算法

   這種調度算法根據作業對資源的要求進行分類,作業調度從各類作業中挑選,儘可能地使使用不同資源的作業同時執行。這樣不僅可以使系統中的不同類型的資源都在被使用,而且可以減少作業等待使用相同資源的時間,從而加快作業的執行。

(6)時間片輪轉調度算法

        時間片輪詢算法,這是對FIFO算法的改進,目的是改善短程序(運行時間短)的響應時間,其方法就是週期性地進行進程切換。這個算法的關鍵點在於時間片的選擇,時間片過大,那麼輪轉就越接近FIFO,如果太小,進程切換的開銷大於執行程序的開銷,從而降低了系統效率。因此選擇合適的時間片就非常重要。選擇時間片的兩個需要考慮的因素:一次進程切換所使用的系統消耗以及我們能接受的整個系統消耗、系統運行的進程數。
        時間片輪詢看上起非常公平,並且響應時間非常好,然而時間片輪轉並不能保證系統的響應時間總是比FIFO短,這很大程度上取決於時間片大小的選擇,以及這個大小與進程運行時間的相互關係。

(二)補充:時間片輪轉調度算法與系統開銷比例計算

(1)時間片輪轉調度算法主要適用於分時系統。在這種算法中,系統將所有就緒進程按到達時間的先後次序排成一個隊列,進程調度程序總是選擇就緒隊列中第一個進程執行,即先來先服務的原則,但僅能運行一個時間片,如100ms。在使用完一個時間片後,即使進程並未完成其運行,它也必須釋放出(被剝奪)處理機給下一個就緒的進程,而被剝奪的進程返回到就緒隊列的末尾重新排隊,等候再次運行。
    在時間片輪轉調度算法中,時間片的大小對系統性能的影響很大。如果時間片足夠大,以至於所有進程都能在一個時間片內執行完畢,則時間片輪轉調度算法就退化爲先來先服務調度算法。如果時間片很小,那麼處理機將在進程間過於頻繁切換,使處理機的開銷增大,而真正用於運行用戶進程的時間將減少。因此時間片的大小應選擇適當。

(2)系統開銷比例的計算方法:切換進程總時間/進程總的運行時間。可以知道,理論上這個比例與具體進程數無關。例如,進程數爲 10 的情況下,系統開銷比率等於切換進程總時間 / 進程總共運行時間,其中切換進程運行時間爲 10*10ms ,進程運行總時間爲 300*10+10*10ms ,因此係統開銷比率爲 10*10/(300*10+10*10), 可以看出系統開銷比率與程數無關。


2、輪詢任務調度與搶佔式任務調度的區別?

答:輪詢調度算法的原理是每一次把來自用戶的請求輪流分配給內部中的服務器,從1開始,直到N(內部服務器個數),然後重新開
始循環;
搶佔式任務調度算法允許調度程序根據某種原則去暫停某個正在執行的進程,將已分配給該進程的處理機重新分配給另一進程。搶
佔方式的優點是,可以防止一個長進程長時間佔用處理機,能爲大多數進程提供更公平的服務,特別是能滿足對響應時間有着較嚴
格要求的實時任務的需求。
總結:因爲搶佔式調度可能會暫停一些進程,需要記錄進程的運行狀態,較爲複雜,輪詢式只需要輪流分配資源,調度簡單。


3、死鎖

死鎖產生原因:

(1) 因爲系統資源不足。
(2) 進程運行推進的順序不合適。
(3) 資源分配不當等。

產生死鎖的四個必要條件:
1.互斥條件:所謂互斥就是進程在某一時間內獨佔資源。
2.請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
3.不剝奪條件:進程已獲得資源,在末使用完之前,不能強行剝奪。
4.循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。

注意區分:死鎖發生原因和必要條件;

死鎖預防:破壞產生死鎖的4個必要條件之一即可;

死鎖避免:該方法同樣是屬於事先預防的策略,但它並不須事先採取各種限制措施去破壞產生死鎖的的四個必要條件,而是在資源的動態分配過程中,用某種方法去防止系統進入不安全狀態,從而避免發生死鎖。最常用的死鎖避免算法是銀行家算法

死鎖檢測這種方法並不須事先採取任何限制性措施,也不必檢查系統是否已經進入不安全區,此方法允許系統在運行過程中發生死鎖。但可通過系統所設置的檢測機構,及時地檢測出死鎖的發生,並精確地確定與死鎖有關的進程和資源。檢測方法包括定時檢測、效率低時檢測、進程等待時檢測、資源分配圖簡化法等;

死鎖解除

1) 資源剝奪法。掛起某些死鎖進程,並搶佔它的資源,將這些資源分配給其他的死鎖進程。但應防止被掛起的進程長時間得不到資源,而處於資源匱乏

的狀態;

2) 撤銷進程法。強制撤銷部分、甚至全部死鎖進程並剝奪這些進程的資源。撤銷的原則可以按進程優先級和撤銷進程代價的高低進行;

3)進程回退法。讓一個或多個進程回退到足以迴避死鎖的地步,進程回退時自願釋放資源而不是被剝奪。要求系統保持進程的歷史信息,設置還原

點。


4、銀行家算法

答:它是最具有代表性的避免死鎖的算法。我們可以把操作系統看作是銀行家,操作系統管理的資源相當於銀行家管理的資金,進程向操作系統請求分配資源相當於用戶向銀行家貸款。爲保證資金的安全,銀行家規定:

(1) 當一個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客;

(2) 顧客可以分期貸款,但貸款的總數不能超過最大需求量;

(3) 當銀行家現有的資金不能滿足顧客尚需的貸款數額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間裏得到貸款;

(4) 當顧客得到所需的全部資金後,一定能在有限的時間裏歸還所有的資金。

操作系統按照銀行家制定的規則爲進程分配資源,當進程首次申請資源時,要測試該進程對資源的最大需求量,如果系統現存的資源可以滿足它

的最大需求量則按當前的申請量分配資源,否則就推遲分配。當進程在執行中繼續申請資源時,先測試該進程本次申請的資源數是否超過了該資源所剩

餘的總量。若超過則拒絕分配資源,若能滿足則按當前的申請量分配資源,否則也要推遲分配。



章節四、存儲管理

常用內存分配算法

答:(1)最佳適配算法(best fit):它從全部空閒區中找出能滿足分配大小要求的、且且又是最小的空閒分區,這種方法能使碎片儘量小。爲適應此

算法,空閒分區表(空閒區鏈)中的空閒分區要按從小到大進行排序,自表頭開始查找到第一個滿足要求的自由分區分配。

缺點:該算法保留大的空閒區,但造成許多小的空閒區。


基本分頁存儲管理系統和請求分頁存儲管理系統

答:(1)基本分頁存儲管理系統:爲了防止連續存儲的的碎片產生,採用離散存儲方式,也就出現了根據分配的基本單位是頁還是段的兩種離散存儲管理,分爲基本分頁或者分段存儲管理系統。

分段與分頁的區別:

1)頁式的邏輯地址是連續的,段式的邏輯地址可以不連續;
2)頁式的地址是一維的(因爲每頁大小固定,故只需頁起始地址),段式的地址是二維的;
3)分頁是操作系統進行,分段是用戶確定;
4)各頁可以分散存放在主存,每段必須佔用連續的主存空間;


我們重點分析分頁管理系統:

基本的分頁存儲管理方式,或稱爲純分頁存儲管理方式,它不具有支持實現虛擬存儲器的功能,它要求把每個作業全部裝入內存後方能運行。

分頁中的頁是指“將一個進程的邏輯地址空間分成若干個大小相等的片”,併爲各頁加以編號,從0開始,如第0頁、第1頁等。相應地,也把內存空間分

成與頁面相同大小的若干個存儲塊,稱爲(物理)塊或頁框(frame),也加以編號,如0#塊,1#塊等。注意,每一個進程都擁有一個自己的頁表。

注意:

①要區分頁與頁表,頁是指進程邏輯空間被分割的大小相等的片。頁表是指存儲頁號的索引表,每個進程只有一個頁表,每個頁表項對應一個頁的索引映射。

例如,一個進程分頁系統的頁號有8位,那麼8位二進制最多表示2^8個號碼,所以頁表長度=2^8*8(B)=2^8字節。


②頁式存儲和段式存儲還是會產生碎片,只是很少。其中,

——頁式存儲由於最後一頁一般裝不滿,就會產生內部碎片;

——段式存儲由於換入換出會產生外部碎片。

補充:在內存管理中,內部碎片是已經被分配出去的的內存空間大於請求所需的內存空間;外部碎片是指還沒有分配出去,但是由於大小太小而無法分配給申請空間的新進程的內存空間空閒塊。


(2)請求分頁存儲管理系統:發展自基本分頁存儲管理系統,是爲了能支持虛擬存儲器功能,防止內存碎片化,實現邏輯存儲地址和物理存儲地址之間的轉換而產生的。它有兩個主要功能:請求調頁功能和頁面置換功能。其中,

請求調頁功能:在進程運行過程中,若其所要訪問的頁面不在內存中,就需把它們調入內存;

頁面置換功能:如果在調頁過程中,內存中已無空閒空間時,爲了保證該進程能正常運行,系統必須實現從內存中調出一頁程序或數據到磁盤的對換區中的功能。

補充:基本分頁管理系統與請求分頁存儲管理系統的區別就是不支持虛擬存儲器(也就不支持頁面置換功能),所以一開始就需要將所有頁面存儲到內存中,而請求頁面系統則只需要存儲當前需要的頁面。


1)請求分頁系統的請求頁面分配策略和頁面置換策略分別有兩種:

請求頁面分配策略:固定分配和可變分配;固定分配時內存中的頁面數保持不變,可變分配時內存中的頁面數可變化;

頁面置換策略:局部置換和全局置換;局部置換只可以對置換本進程內的物理頁面進行置換,相反全局置換可以在內存不足時對所有進程的頁面進行置換,即使用一個進程的新頁面替換另一個進程的頁面。這樣,局部置換可以保證每個進程在內存中頁面數不變,而全局置換就可能改變每個進程在內存中的頁面數。


所以,分配策略和置換策略的組合只有3種模式:

固定分配與局部置換;

可變分配與局部置換;

可變分配與全局置換;

不包括固定分配與全局置換,因爲全局置換會改變頁面數,與頁面固定分配不符合。


2)兩種置換策略對應的算法:
局部置換:
最優算法;
先進先出算法(有Belady異常);
Least Recently Used(最近最久未使用算法);
時鐘算法;
最不常用算法(Least Frequently Used)算法;


全局置換:
工作集算法;
缺頁率算法;


(3)頁面置換策略下的邏輯地址與物理地址轉換

頁表作用:頁表的作用是實現從頁號到物理塊號的地址映射;

物理地址的計算公式爲:

物理地址=塊的大小(即頁的大小L)* 塊號f+頁內地址d;

過程:以邏輯地址的頁號檢索頁表,得到該頁的物理塊號;同時將頁內地址d直接送入物理地址寄存器的塊內地址字段中。這樣物理

塊號和塊內地址拼接成了實際訪問內存的地址,從而完成了從邏輯地址到物理地址的轉換。

例如:設頁號爲p,頁內位移爲d,則對於邏輯地址1011對應的物理地址求法如下:

p=int(1011/1024)=0,d=1011 %1024=1011。查頁表第0頁在第5塊,所以物理地址爲1024*5+1011=6131;



分頁和分段存儲管理的主要區別

答:(1)頁是信息的物理單位,是爲了滿足系統要求。段是信息的邏輯單位,是爲了滿足用戶要求;

(2)頁的大小固定且由系統決定,段大小不固定且由用戶程序決定;

(3)分頁的作業空間是一維的,分段的作業地址空間則是二維的。


頁面置換算法

答:(1)最佳(Optimal)置換算法:指其所選擇的被淘汰頁面,將是以後永不使用的,或許是在最長(未來)時間內不再被訪問的頁面。採用最佳置換算法,通常可保證獲得最低的缺頁率。但由於人們目前還無法預知一個進程在內存的若干個頁面中,哪一個頁面是未來最長時間內不再被訪問的,因而該算法是無法實現的,但可以利用該算法去評價其它算法。

(2)先進先出(FIFO)頁面置換算法:該算法總是淘汰最先進入內存的頁面,即選擇在內存中駐留時間最久的頁面予以淘汰。該算法實現簡單,只需把一個進程已調入內存的頁面,按先後次序鏈接成一個隊列,並設置一個指針,稱爲替換指針,使它總是指向最老的頁面。但該算法與進程實際運行的規律不相適應,因爲在進程中,有些頁面經常被訪問,比如,含有全局變量、常用函數、例程等的頁面,FIFO 算法並不能保證這些頁面不被淘汰。

(3)最近最久未使用(LRU)置換算法:是選擇最近最久未使用的頁面予以淘汰。該算法賦予每個頁面一個訪問字段,用來記錄一個頁面自上次被訪問以來所經歷的時間t。當需要淘汰一個頁面時,選擇現有也面中t值最大的,即最近最久未使用的頁面予以淘汰。

(4)Clock置換算法:LRU算法的近似實現,是把所有的頁面都保存在一個類似鐘面的環形鏈表中,一個錶針指向最老的頁面,當發生缺頁中斷時,算法首先檢查錶針指向的頁面,如果它的R位是0就淘汰該頁面,並把新的頁面插入這個位置,然後把錶針前移一個位置;如果R位是1就將R位置0並把錶針前移一個位置,重複這個過程直到找到了一個R位爲0的頁面爲止。如下圖:



3、系統抖動與Belady現象

答:系統抖動:在請求分頁存儲管理中,從主存(DRAM)中剛剛換出(Swap Out)某一頁面後(換出到Disk),根據請求馬上又換入(Swap In)該頁,這種頁面頻繁換出換入的現象,稱爲系統顛簸,也叫系統抖動。

造成系統抖動的根本原因是置換算法選擇不當,表面原因是缺頁率高造成的。

Belady現象:指在分頁式虛擬存儲器管理中,發生缺頁時的置換算法採用FIFO( 先進先出 )算法時,如果對—個進程未分配它所要求的全部頁面,有時就會出現分配的頁面數增多但缺頁率反而提高的異常現象。


4、頁面請求中的缺頁率計算

答:缺頁率 = (頁面置換次數+分配給該進程的物理塊數)/要訪問的頁面總數;

缺頁數=頁面置換次數+分配給該進程的物理塊數;

注意: 
1)要訪問的頁面總數:不是數值最大,而是看要訪問的總次數,例如某程序訪問以下頁面0、1、4、2、0、2、6、5、1、2、3、

2、1、2、6、2、1、3、6、2,總共20個數,則要訪問的頁面總數是20,並不是6;

2)由於進程開始時,都會給該進程分配一定數量的物理塊,當物理塊充足時,直接將要訪問的頁面添加進物理塊中就好,並不算頁面置換次數;

3)頁面置換次數:當前要訪問的頁面不在內存中,且,物理塊已經被佔滿,沒有物理塊可用,就需要將物理塊中的頁面按照一定的算法將不用的頁面換出內存,把要訪問的頁面換進內存中。

技巧:在算缺頁率時,可以假設分配給進程的物理塊爲0,則每進入一個頁面就算一次缺頁,這樣就把分配給該進程的物理塊數合併到頁面置換次數中,方便記憶。當把物理塊佔完以後,再考慮要不要從物理塊中換出內存。


舉例:

若進程訪問頁面的次序是1、2、3、6、4、7、3、2、1、4、7、5、6、5、2、1,採用最佳置換算法,情況如下圖:


5、虛擬存儲器

答:虛擬存儲器:由於常規內存的一次性(要求將作業全部裝入內存後才能運行)和駐留性(作業裝入內存後,就一直駐留在內存中,知道作業運行結

束),難以滿足大量作業要求運行的情況。虛擬存儲器是一種藉助於外存空間,從而允許一個進程在其運行過程中部分地裝入內存的技術,剩

餘部分存儲在外存,需要時就將其置換到內存。之所以採用虛擬存儲管理方式,是因爲程序執行時呈現局部性原理:

1)空間局部性:一條指令的一次執行和下次執行,都集中在一個較短時間內;

2)時間局部性:當前訪問的數據和下次訪問的數據,都集中在一個較小的區域內;

虛擬存儲器實現方法:請求分頁機制和請求分段機制;

虛存的硬件支持:1)內存;2)外存;3)地址變換機構:實現虛擬地址到實地址的地址變換。例如,在頁式存儲結構中,根據頁號-塊號對照表,將虛地址中的頁號換成塊號,得到實地地(物理地址)。

替換算法:用來確認替換內存中的哪個頁面,以便騰空部分內存,存放來自外存要調入的那部分內容。

1)先進先出算法:替換掉最先調入主存的頁面;

2)LRU算法:替換最長時間不用的算法等。

虛擬存儲器的作用:提高內存運行效率,適合大容量作業運行;


章節五、設備管理

1、IO設備分類

答:1)按共享屬性分類:

獨佔設備: 在一個用戶作業未完成或退出之前,此設備不能分配給其他作業用。所有字符設備都是獨享設備。如輸入機、磁帶機、打印機等。

共享設備:指在同一段時間內允許多個進程同時訪問的設備。典型的共享設備如磁盤。

虛擬設備: 通過軟件技術將獨享設備改造成共享設備。例如:通過SPOOLing 技術將一臺打印機虛擬成多臺打印機。

2)按傳輸速率分類:

低速設備:鍵盤、鼠標、語音輸入輸出設備反人等;

中速設備:打印機等;

高速設備:存儲設備如磁帶機、磁盤機、光盤機等。

3)按信息交換方式分類:

塊設備:主要用於存儲信息,數據存取單位是塊,如磁盤;

字符設備:用於數據輸入輸出,數據傳輸單位是字符,如打印機;


2、IO控制方式

答:(1)程序控制

CPU 向控制器發指令,啓動I/O 設備,同時把狀態寄存器中的狀態標誌置1 ,busy=1;然後不斷地循環檢測狀態標誌。

如果busy=1, 說明I/O 設備忙,CPU 再進行下一輪檢測; 

如果busy=0, 說明I/O 操作結束,CPU 執行下一條指令。

在程序I/O方式中,由於CPU的速度遠遠高於I/O設備,導致CPU的絕大部分時間都處於等待I/O設備完成而循環測試之中,造成了CPU的極大浪費。但是它管理簡單,在要求不高的場合可以被採用。


(2)中斷控制 

啓動:由CPU根據進程的I/O請求發出一條I/O命令;此後CPU繼續執行其它進程,即CPU與外設並行工作。I/O設備完成操作後,由

控制器通過控制線向CPU發送一中斷信號,由CPU檢查I/O操作是否正確,若無錯,便從數據寄存器中讀出數據,寫入指定內存單

元。

中斷驅動方式在I/O設備輸入數據的過程中,無需 CPU干預,可以使CPU與I/O設備並行工作。僅當輸完一個數據時,才需 CPU

花費極短的時間去進行中斷處理。從而大大地提高了整個系統的資源利用率及吞吐量,特別是CPU的利用率,但中斷控制仍然是以

字符爲傳輸單位。


(3)DMA控制方式

中斷驅動I/O方式雖然大大提高了主機的利用率,但是它以字(節)爲單位進行數據傳送,每完成一個字(節)的傳送,爲了進一步

減少CPU對I/O的干預,引入了直接存儲器訪問DMA(Direct Memory Access)控制方式。DMA(Direct Memory Access)引入,適

應了一次傳送大量數據的應用要求,儘量減少CPU對高速外設的干預,DMA控制方式以塊爲單位進行數據傳送。

DMA控制器的組成:命令/狀態寄存器CR,內存地址寄存器MAR,數據寄存器DR,數據計數器DC;


DMA方式下的數據傳送過程可分爲三個階段:

1) 預處理階段:當進程要求設備輸入數據時,CPU把準備存放輸入數據的內存起始地址以及要傳送的字節數分別送入DMAC中的內

存地址寄存器和傳送字節計數器。另外,還把控制狀態寄存器中的中斷允許位和啓動位置成1,從而啓動設備,開始進行數據輸入。

2) 數據傳送階段:發出數據傳輸要求的進程進入等待狀態,進程調度程序調度其他進程佔據CPU。DMAC不斷地竊取CPU工作周

期,執行數據傳送的操作:向內存發出地址和控制信號,進行地址修改,對傳送字的個數計數,直到所要求的字節全部傳送完畢。 

3) 後處理階段:DMAC在傳送完所有字節時,通過中斷請求線發出中斷信號。CPU在接收到中斷信號後,轉入中斷處理程序進行後

續處理。中斷處理結束後,CPU返回到被中斷的進程中,或切換到新的進程上下文環境中,繼續執行。

DMA方式起到代理cpu的功能,較之中斷驅動方式,又是成百倍地減少了CPU對 I/O控制的干預,進一步提高了CPU與I/O設備的並行

操作程度。


(4) I/O通道控制方式

I/O通道控制方式的引入,進一步減少CPU對I/O操作的干預,以多個塊爲單位進行數據傳送,一次傳送多組數據到多個不同的內存區

域。

通道程序:由一系列通道指令(通道命令)構成,通道指令與一般的機器指令不同,在每條指令中包含的信息較多每條指令都包

含:操作碼、內存地址、計數、通道程序結束位P、記錄結束標誌R。通道程序是在cpu執行I/O命令時通過設備管理程序產生的,傳

遞給通道。

由於外圍設備的種類較多,且其傳輸速率相差很大,所以通道也具有多種類型。根據信息交換方式,可以把通道分成以下三種類型:(1)字節多路通道、(2)數組選擇通道、(3)數組多路通道。

通道工作原理:

CAW----通道程序的內存起始地址,CCW----通道程序指令寄存器,CSW----存放通道程序結果的寄存器;

CPU在執行用戶程序時遇到I/O請求,操作系統根據該請求生成通道程序放入內存,並將該通道程序的首地址放入通道地址字

CAW中。之後執行“啓動I/O”指令,啓動通道工作。通道接收到“啓動I/O”指令後,從CAW中取出通道程序的首地址,並根據首地址取

出第一條指令放入通道命令字CCW中,同時向CPU發回答信號,使CPU可繼續執行其他程序,而通道則開始執行通道程序,與CPU

並行完成I/O設備數據傳輸工作。

通道程序指令先通過驅動轉化然後通過控制器一起完成實際I/O,啓動I/O設備,執行完畢後,如果還有下一條指令,則繼續執行。

當通道傳輸完成最後一條指令時停止工作,向CPU發I/O中斷。CPU接收中斷信號,執行中斷子程序,從通道狀態字CSW中取得有關

通道狀態信息,決定下一步做什麼。


3、IO通道控制方式

答:通道是獨立於CPU的、專門負責數據共享以及傳輸工作的處理單元,主要針對內存和外設通信和數據傳輸。

I/O通道控制類似於DMA控制,I/O操作過程爲:當CPU在執行主程序時遇到I/O請求,CPU啓動在指定通道上選址的設備,一旦啓動成功,通道開始控制設備進行操作,這時CPU就可以執行其他任務並與通道並行工作,直到I/O操作完成。當通道發出I/O操作結束中斷時,CPU才響應並停止當前工作,轉而處理I/O操作結束事件。

可見,I/O通道控制方式在通道控制開始和結尾都需要CPU干預


4、操作系統的IO軟件層次問題

答:IO軟件層次從上到下依次爲:用戶級IO軟件,與設備無關的操作系統軟件,設備驅動程序,中斷處理程序,硬件。

例如:用戶程序發出磁盤I/O 請求後,系統的正確處理流程一般是:用戶程序→系統調用處理程序→設備驅動程序→中斷處理程序。


5、操作系統中斷

答:從中斷事件的性質出發,中斷可以分爲兩大類:

強迫性中斷事件:包括硬件故障中斷,程序性中斷,外部中斷和輸入輸出中斷等;

自願性中斷事件:是由正在運行的進程執行一條訪管指令用於請求系統調用而引起的中斷,這種中斷也稱爲"訪管中斷"。

一般情況下,優先級的高低順序依次爲:硬件故障中斷、自願中斷、程序性中斷,外部中斷和輸入輸出中斷。

自願中斷的斷點是確定的,而強迫性中斷的斷點可能發生在任何位置。


6、計算機讀取緩存、內存和硬盤所用時間排序

答: 首先速度最快的當然是緩存,接着消耗時間最少的是內存,最後是硬盤連續讀取時間,即:緩存讀取時間<內存讀取時間<硬盤讀取時間;

緩存直接與cpu進行數據交互,這個是最快最直接的;當通過緩存尋找數據時發現數據在緩存中不存在這時需要通過,到內存中去尋找,但是內存的傳輸速度就沒有緩存這麼快了,所以內存讀取數據的時間消耗要大於緩存;最慢的硬盤讀取時間主要包括:尋道時間, 數據傳輸時間,還有旋轉時間三部分時間組成。


7、操作系統引入緩衝技術的作用

答:引入緩衝的主要原因包括:1)緩和CPU與I/O設備間速度不匹配的矛盾,減少對CPU的中斷頻率,放寬對中斷響應時間的限制,提高CPU和I/O設

備之間的並行性;例如,CPU 輸出數據的速度遠遠高於打印機的打印速度,爲解決這一矛盾,一般採用緩衝技術

2)減少訪問主存或CPU中斷次數。


8、計算機存儲中的雙緩衝區與單緩衝區

答:緩衝區不在外存,計算機最大的緩衝區在內存中,還有部分在CPU中。

區別:

單緩衝:假定從磁盤把一塊數據輸入到緩衝區的時間爲T,操作系統將該緩衝區中的數據傳送到用戶區的時間爲M,而CPU對這一塊數據處理的時間爲 C。由於T和C是可以並行的,當T>C時,系統對每一塊數據的處理時間爲M十T,反之則爲M+C,故可把系統對每一塊數據的處理時間表示爲Max(C, T)+M;如圖:


雙緩衝:雙緩衝狀態下,磁盤上的一個數據塊中的信息輸入到一個雙緩衝區的時間爲T1,操作系統將該緩衝區中的數據傳送到用戶
區的時間爲M,CPU對這一塊數據處理的時間爲 C。由於T和C是可以並行的,同時由於雙緩衝的原因,M也是可以並行的,所以最後的結果是max(T,M,C)。如圖:


9、ROM與RAM

答:RAM是易失性的,一旦掉電,則所有信息全部丟失;ROM是非易失性的,其信息可以長期保存,常用於存放一些固定用的數據和程序,如計算機的自檢程序、BIOS、遊戲卡中的遊戲,等等;一般Cache採用高速的SRAM製作,比ROM速度快很多;RAM需要刷新,而ROM不需要刷新。


10、CPU不可以直接訪問外存數據

答:CPU不能對外存上的數據進行直接訪問,必須先將外存上的數據調入內存。


11、固態硬盤與機械硬盤相比的優勢

答:讀寫快、功耗低、耐碰撞不易損壞、壽命長(最後一條存疑)。


12、磁盤組成與磁盤訪問

答:磁盤組成:磁盤上的數據都存放於磁道上,磁道就是磁盤上的一組同心圓,其寬度與磁頭的寬度相同。而磁道中是扇區,扇區是磁盤存儲基本單位,即塊。一般磁盤容量計算如下:

存儲容量 = n×t×s×b;

其中n爲保存數據的總盤面數(一個盤片分兩面);t爲每面磁道數;s爲每道的扇區數;b爲每個扇區存儲的字節數(512B)。

磁盤分類:軟盤與硬盤分類;單片盤與多片盤分類;固定磁頭與移動磁頭分類;關於固定磁頭與移動磁頭,介紹如下:

1)固定磁頭磁盤

磁頭用於讀取磁道中的扇區存儲信息,故固定磁頭就是每個磁道都有一個磁頭,,透過這些磁頭可以訪問所有的磁道,且可以並行進行讀寫,提高IO速度。該模式一般應用於大容量磁盤上。

2)移動磁頭磁盤

每個盤面僅配一個磁頭,該磁頭可以移動尋道,以串行方式讀寫,所以IO速度較慢。但由於結構簡單常用語中小容量磁盤設備中。

移動頭磁盤訪問時間

訪問時間由三部分組成:尋道時間Ts、旋轉延遲時間、傳輸時間Tt

尋道時間:啓動磁頭移動的時間與將磁頭移動到指定磁道的時間之和,Ts=m*n+s,其中m是磁頭移動一個磁道的時間,n爲磁道數,s爲啓動磁頭移動時間;

旋轉延遲時間:將扇區旋轉到磁頭下面的時間;

傳輸時間:指將數據從磁盤讀出或向磁盤寫入數據所經歷的時間。


13、最短尋道時間優先算法

答:最短尋道時間優先算法(SSTF——Shortest Seek Time First) :該算法選擇這樣的進程,其要求訪問的磁道與當前磁頭所在的磁道距離最近,以使每次的尋道時間最短,該算法可以得到比較好的吞吐量,但卻不能保證平均尋道時間最短。其缺點是對用戶的服務請求的響應機會不是均等的,因而導致響應時間的變化幅度很大。在服務請求很多的情況下,對內外邊緣磁道的請求將會無限期的被延遲,有些請求的響應時間將不可預期。


14、磁盤調度算法

答:1)先來先服務FCFS

該算法根據進程請求訪問磁盤的先後順序進行調度;

2)最短尋道時間優先SSTF

該算法要求訪問的磁道與當前磁頭所在磁道距離最近,以使每次尋到時間最短。

3)掃描算法SCAN

該算法不僅考慮磁道最近,還考慮磁頭移動方向是否和最近磁道一致,否則不遵循最近磁道距離原則。有點類似電梯調度算法。

4)循環掃描算法CSCAN

5)N-Step-SCAN和FSCAN調度算法

15、設備分配中所需的數據結構

答:系統中設備供所有進程共享,爲防止無序競爭,設備都由系統統一分配。設備分配時所需的數據結構有:設備控制表、控制器控制表、通道控制表和系統設備表等。

16、可變分區存儲管理之緊湊技術

答:移動所有的佔用區域,使所有的空閒碎片區合併成一片連續區域,這一技術稱爲移動技術(緊湊技術)。所謂碎片是指內存中出現的一些零散的小

空閒區域,由於碎片都很小,無法再利用。如果內存中碎片很多,將會造成嚴重的存儲資源浪費。解決碎片的方法是移動技術,除了可解決碎片問題還

使內存中的作業進行擴充。當然,移動帶來系統開銷加大,並且當一個作業如果正與外設進行I/O時,該作業是無法移動的。


章節六、文件管理

1、Unix/Linux系統的目錄結構

答:Unix/Linux系統的目錄是帶鏈接樹形目錄結構,帶鏈接樹形目錄結構又稱非循環圖目錄結構,它是指訪問一文件(或目錄)可以有多條路徑。一般常說UNIX的文件系統是樹形結構,其實是指帶鏈接的樹形結構,而不是純樹形目錄結構。

2、Linux下對文件的操作

答:Linux下對文件操作有兩種方式:系統調用(system call)和庫函數調用(Library functions)。系統調用實際上就是指最底層的一個調用,在linux程序設計裏面就是底層調用的意思,面向的是硬件。而庫函數調用則面向的是應用開發的,相當於應用程序的api。

簡明的回答是:函數庫調用是語言或應用程序的一部分,而系統調用是操作系統的一部分。

3、在FAT文件系統中,基本的文件分配單位是什麼?

答:FAT文件系統基本的文件分配單位是

 :系統文件分配的基本單位,一般爲2的n次方個扇區(由文件系統決定);

扇區: 硬盤不是一次讀寫一個字節,而是一次讀寫一個扇區(512個字節),扇區就是硬盤讀取單元塊 ;

簇的大小選擇,例如U盤的FAT32模式下,分配單元——簇的大小選擇:
簇是分配給U盤的最小單元,大了不適合存儲小文件,比如你分配了16K的,你只存一個1K的TXT的話,這個16K就被佔用了,所以又點浪費空間。但是如果你存的是5M左右的歌曲,那麼存的文件就比較快,而且整體性好點。


4、文件索引結

答:爲了提高文件的檢索效率,可以採用索引方法組織文件。採用索引這種結構,邏輯上連續的文件可以存放在若干不連續的物理塊中,但對於每個文件,在存儲介質中除存儲文件本身外,還要求系統另外建立一張索引表,索引表記錄了文件信息所在的邏輯塊號和與之對應的物理塊號。索引表也以文件的形式存儲在存儲介質中,索引表的物理地址則由文件說明信息項給出。

在很多情況下,有的文件很大,文件索引表也就較大。如果索引表的大小超過了一個物理塊,可以採用間接索引(多重索引),也就是在索引表所指的物理塊中存放的不是文件地址映射信息本身,而是裝有這些信息的物理塊地址。

索引結構既適用於順序存取,也適用於隨機存取,並且訪問速度快,文件長度可以動態變化。索引結構的缺點是由於使用了索引表而增加了存儲空間的開銷。


5、文件邏輯結構

答:文件分爲兩大類:有結構文件(即記錄式文件),無結構文件(即流式文件)。

大量的數據結構和數據庫採用有結構文件;大量的源程序,可執行程序,庫函數等採用無結構文件,其長度以字節爲單位,對流式文件的訪問是利用讀

寫指針來指出下一個要訪問的字符。

有結構的文件分爲:定長和不定長兩類;

定長又分爲:定長記錄,變長記錄;

變長記錄文件根據文件組織方式的不同又分爲:順序文件,索引文件,索引順序文件。


6、數據項、記錄和文件在文件系統中的關係

答:文件系統按層次有個底到高爲:數據項—>記錄—>文件,後者是由前者的集合組成;


7、順序文件

答:順序文件有兩種結構:串結構和順序結構;

串結構:按存入時間順序決定;

順序結構:按關鍵字如文件名的字母順序決定。


8、Linux系統的i節點介紹

答:i節點也叫索引節點,是對文件進行控制和管理的一種數據結構,每一個文件都有自己的i節點,每個i節點都有一個唯一的i節點號。i節點結構如下:

struct dinode

{
ushort di_mode; /*文件類型+用戶權限*/
short di_nlink; /*文件鏈接數*/
ushort di_uid; /*屬主用戶id*/
ushort di_gid; /*屬主用戶組id*/
off_t di_size; /*文件大小*/
char di_addr[40]; /*文件數據區起點地址*/
time_t di_atime; /*最後訪問時間*/
time_t di_mtime; /*最後修改時間*/
time_t di_ctime; /*創建時間*/
};
從上面這個結構可以看出以下一些信息:
1、i節點保存了文件的屬性和類型、存放文件內容的物理塊地址、最近一次的存取時間、最近一次的修改時間、創建此文件的時間。
2、i節點中沒有記錄文件名字;

linux下,i節點其實就是可以這麼認爲,把i節點看作是一個指向磁盤上該文件存儲區的地址。只不過這個地址我們一般是沒辦法直接使用的,而是

通過文件名來間接使用的。事實上,i節點不僅包含了文件數據存儲區的地址,還包含了很多信息,比如數據大小,等等文件信息。但是i節點是不保存

文件名的。文件名是保存在一個目錄項中。每一個目錄項中都包含了文件名和i節點。

我們可以通過一個圖來看看目錄項,i節點,文件數據四者之間的關係:



下面是關於i節點、硬鏈接、軟鏈接的總結:

1)i節點

1、inode是一個數值,通過ls -i 命令可以查看某文件的inode值;

2、本質上inode是一個索引號,也可以理解爲一個指針,指向唯一的一個文件,準確的是說是指向一個文件的存儲區,該存儲區是屬於該文件的一部分,不一定是全部;

3、因此,有兩個或多個inode指向同一個文件的情況。即inode和文件不是一一對應的關係,是n對1的關係(n>=1)

4、當文件拷貝時,理所當然的會創建新的inode,而且也複製了數據區。儘管兩個文件完全一樣。即:複製文件時,產生兩個完全獨立的文件。


2)硬鏈接:爲原文件創建一個新的文件名,但本質中只增加了一個目錄項,並使用與原來相等的inode,指向原文件的區域。數據

區爲兩個名字共享。

使用限制:源文件和鏈接文件必須在同一個文件系統內,且目錄文件不能創建硬鏈接。

命令:ln a b // 給a創建鏈接文件b

可以使用ls -i查看兩個inode是完全一樣的。

同時注意連接計數count。count的意義對於文件來說是硬鏈接的個數,對於目錄,一般(count-2)爲目錄包含的子文件個數。

注意:兩者的權限也是完全一樣的。對其中一個進行讀寫操作,另外一個也會更新。但刪除其中一個,只會刪除目錄項,不會刪除

存儲區數據。另外一個文件的使用和操作完全不受影響。除非count-1結果0,纔將數據區刪除。

作用:節省空間,兩個文件能同步更新,防止重要文件被“誤刪”。

注意:軟驅 光驅等都是獨立的文件系統。不同文件系統的inode沒有任何聯繫。系統通過設備號和inode號確定一個文件。

inode是文件系統內的一個概念。但Linux可以支持多種不同的文件系統。其實Linux提供了一個虛擬文件系統VFS,是實際系統上層

的一個接口軟件。因此inode是隻存在於內存的數據結構中。只有linux量身定製的ext2文件系統是具有實際意義的inode和目錄項結

構。

3)軟鏈接:也叫符號鏈接。本質是創建一個新的文件,保存源文件的路徑名。因此inode和源文件的inode是不一樣的。使用沒有文

件系統的限制,也沒有文件和目錄的限制。

命令:ln -s a b

注意:產生的文件權限和源文件是不一樣的。由於軟鏈接使用比較靈活,可能斷鏈,也可以自循環,往往需要多次查找增加文件操

作的步驟而降低效率。儘量少用,並避免出現循環。

注意:刪除文件時,如果源文件被刪除,即便只是硬鏈接被刪除,存儲區沒有被刪,本文件也會失效。因爲它是對文件名而言的。


9、Linux中的makefile文件

答:makefile文件保存了編譯器和連接器的參數選項,還表述了所有源文件之間的關係(源代碼文件需要的特定的包含文件,可執行文件要求包含的目標文件模塊及庫等)。創建程序(make程序)首先讀取makefile文件,然後再激活編譯器,彙編器,資源編譯器和連接器以便產生最後的輸出,最後輸出並生成的通常是可執行文件。makefile文件實現了編譯流程的規定,即實現了編譯自動化,只需要調用make命令就可根據該文件實現編譯。Makefile裏主要包含了五個東西:顯式規則、隱晦規則、變量定義、文件指示和註釋。



章節七、操作系統接口

1、Shell環境中的預定義變量

答:預定義變量和環境變量相類似,也是在Shell一開始時就定義了的變量。所不同的是,用戶只能根據Shell的定義來使用這些變量,而不能重定義它。所有預定義變量都是由$符和另一個符號組成的,常用的Shell預定義變量如下表所示:

判斷上一個命令是否執行成功:[$? -eq 0]; echo True;


2、操作系統中應用程序和用戶提供的接口是什麼?

答:內核對所有應用程序和用戶提供的接口就是系統調用;注意,一些系統調用是可以被中斷的。


3、命令後臺運行

答:例如sh test.sh要後臺運行,有3種方式:

①在命令末尾添加取地址符:sh test.sh&;

②使用nohup命令和&的組合,如:nohup sh test.sh&;nohup命令會忽略SIGHUP信號,從而終端窗口退出時不會影響到後臺作業;

③通過ctrl+z;bg等一系列的命令,將已經在前臺運行的作業放到後臺執行。如果一個作業已經在前臺執行,可以通過ctrl+z將該作業放到後臺並掛起。然後通過jobs命令查看在後臺執行的作業並找到對應的作業ID,執行bg %n(n爲通過jobs查到的作業ID)喚醒該作業繼續執行。


章節八、其他

1、計算機爲什麼要使用內存對齊機制?

答:(1)、平臺原因(移植原因):不是所有的硬件平臺都能訪問任意地址上的任意數據的;某些硬件平臺只能在某些地址處取某些特定類型的數據,

否則拋出硬件異常。

(2)、性能原因:數據結構(尤其是棧)應該儘可能地在自然邊界上對齊。訪問未對齊的內存,處理器需要作兩次內存訪問,而對齊的內存訪問僅需要一

次訪問。(提高對數據的讀取效率,以空間換時間)


2、操作系統的交換分區大小

答:系統交換分區大小設置一般是計算機物理內存的2倍左右;


3、內核對象

答:內核對象是操作系統爲一些系統級的對象(像進程,線程,信號量)維護的一些數據結構。這些數據構保存了與系統級對象相關的系統級信息。操作系統中所有內核對象是保存在一塊內存空間中,系統上所有的進程都共享這一塊內存空間。

(1)內核對象的訪問

①內核對象不能被應用程序直接訪問,應用程序只能通過操作系統提供的API對他們進行操作;

②多個進程可以共享訪問同一個內核(對象通過給內存對象命名即可以實現內核對象在多個進程中共享);

③當應用程序創建或打開一個內核對象時,系統API會返回給應用程序一個句柄(該句柄是進程級別的),然後應用程序便可以使用該句柄來指定對該內核對象進行操作。該句柄是進程級別的,因此同一個內核對象在兩個進程中的句柄不會一樣;

(2)內核對象的分類

分類有:存取符號對象、事件對象、文件對象、文件映射對象、I/O完成端口對象、作業對象、信箱對象、互斥對象、管道對象、進程對象、信標對象、線程對象和等待計時器對象等。這些對象都是通過調用函數來創建的。


4、IO多路複用機制——select機制和epoll機制

答:(1)作用

主要意義 :在不使用多進程或多線程的情況下,實現對多個客戶端IO請求的處理,從而減少CPU開銷,提高處理效率。

如:當需要讀兩個以上的I/O的時候,如果使用阻塞式的I/O,那麼可能長時間的阻塞在一個描述符上面,另外的描述符雖然有數據但是不能讀出來,這樣實時性不能滿足要求,大概的解決方案有以下幾種:

①同步阻塞IO,不採用特別處理方法,仍然一個個處理,這樣不可以同時處理多個請求,如下:


②同步不阻塞IO,寫一個輪詢函數,檢測到有請求數據準備就緒就跳出輪詢進行處理,否則繼續輪詢,這樣就可以同時處理多個請求,如下:


③使用多進程或者多線程,但是這種方法會造成程序的複雜,而且對與進程與線程的創建維護也需要很多的開銷(Apache服務器就是用的子進程的方式,優點可以隔離用戶);

④I/O多路複用,所謂I/O複用,是指根據事件驅動原理,同時監視多個IO狀態,當一個或多個I/O條件滿足(可讀、能寫或出現異常)時,立即通知進程,從而正確並高效地對它們進行處理。

(2)select機制(IO多路複用)

select機制的作用:實現一個進程能同時等待多個文件描述符,而這些文件描述符(套接字描述符)其中的任意一個條件事件(可讀、可寫或異常)發生,select()函數就可以返回。

用以下select機制的原理圖介紹:

 

select機制解釋:

       當用戶進程調用了select,則當前進程會被block。同時所有的socket請求都在select中阻塞,且select負責監視所有的socket,當任何一個socket數據就緒事件發生,select函數就會返回。這個時候用戶進程再調用read操作,將數據從kernel拷貝到用戶進程。

針對上述select機制解釋select的特點:

1)select/poll每次都需要重複傳遞全部的監聽fd進來,涉及用戶空間和內核直接的數據拷貝(即:每處理一次就要把已處理的請求剔除後,拷貝剩下的請求到select中);

2)fd事件回調函數是pollwake,只是將本進程喚醒,本進程需要重新遍歷全部的fd檢查事件,然後保存事件,拷貝到用戶空間,函數返回(select返回只是喚醒進程,獲取fd狀態還是由進程自己遍歷並拷貝);

3)每次循環都是對全部的監測的fd進行輪詢檢測,可能發生事件的fd很少,這樣效率很低;

4)select/poll返回時,會將該進程從全部監聽的fd的等待隊列裏移除掉,這樣就需要select/poll每次都要重新傳入全部監聽的fd,然後重新將本進程掛載到全部的監測fd的等待隊列,大量重複勞動,效率很低。

select適用場景:當有很多請求同時發生時,適用select機制,若請求較少使用select機制反而會造成效率較低,因爲select機制有兩次系統調用,而同步阻塞IO只有一次。

(3)epoll機制

在 select/poll中,進程只有在調用一定的方法後,內核纔對所有監視的文件描述符進行掃描,而epoll事先通過epoll_ctl()來註冊一 個文件描述符,一旦基於某個文件描述符就緒時,內核會採用類似callback的回調機制,迅速激活這個註冊的文件描述符,當進程調用epoll_wait() 時便得到通知(此處去掉了遍歷文件描述符,而是通過監聽回調的的機制,這正是epoll的優勢所在)。epoll觸發方式:epoll有水平觸發和邊緣觸發兩種就緒通知模式,默認爲LT(水平觸發);

特點:

1)每次累加添加,不需要每次傳入全部的監測fd。
2)每個fd只將本進程掛載到自己的等待隊列一次,直到該fd被從epoll移除,不需要重複掛載。
3)fd事件回調函數是ep_epoll_callback,該函數將發生事件的fd加入到epoll專門的就緒隊列rdllist中,同時喚醒本進程。
4)本進程不需要遍歷每一個fd去監測事件是否發生,而只需要判斷epoll中的就緒隊列rdllist是否爲空即可。
5)epoll返回時,只返回就緒隊列rdllist中的項,避免了無關項的操作,應用層也就不需要再次重複遍歷。
6)epoll內部使用紅黑樹存儲監測fd,支持大量fd的快速查詢、修改和刪除操作。

(4)IO多路複用中select和epoll的區別:

①select支持的併發數有限,epoll支持併發數無上限。因爲select內部的fd存儲由數組實現,而epoll內部的fd存儲由紅黑樹實現;

②select效率會隨着併發數增多而下降,epoll則不會。因爲select是通過遍歷所有的fd來判斷哪個fd有事件發生,所以fd數量增多遍歷時間越長,而epoll是通過判斷就緒隊列是否爲空來判斷事件發生與否並且只返回就緒項,fd增多並不影響;

③select在實現內核傳遞fd消息至用戶空間時需要內存拷貝,而epoll是用共享內存實現的,避免了一些不必要的重複拷貝。


(5)epoll與select/poll機制的相同點:

①主要監測流程是一樣的,都需要將當前進程掛載到對應fd的隊列中去。如果fd有事件發生,調用掛載的回調函數,該回調函數基本的作用是喚醒本進程。

②主事件檢測循環是一樣的,循環檢測是否有事件發生,有則處理事件後返回;沒有則調用schedule_timeout睡眠一會。不同的是,select/poll直接檢測每個fd,而epoll只需檢測就緒隊列rdllist是否有數據即可。

(6)epoll針對select/poll的缺點進行的修改,但在併發不多時select不見得比epoll效率低。

其他相關信息參看:http://blog.csdn.net/xiongchao99/article/details/74524807#t5



發佈了38 篇原創文章 · 獲贊 202 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章