1. 程式人生 > >手把手教你如何玩轉面試(作業系統)

手把手教你如何玩轉面試(作業系統)

        本篇是講解關於JavaWeb崗位面試方面的一些對於作業系統知識的整理,當然,不只是需要知道這個方面的內容,還需要掌握其他方面的知識,我都根據自己的經歷來進行了整理,方便大家進行系統化的學習,只有多複習多研究,才能對技術有更好的掌握,才能拿到更好的offer。

下面是其他方面的知識點,歡迎大家進行瀏覽

一:作業系統總覽

1:作業系統的組成部分有哪些?

(1)程序管理(Processing management):這裡就引出了作業系統中的程序和執行緒的問題 (2)記憶體管理(Memory management):這裡就引出了對於記憶體的內容,比如段式,頁式,段頁式和虛擬記憶體的內容; (3)檔案系統(File system): (4)網路通訊(Networking) (5)安全機制(Security) (6)使用者介面(User interface) (7)驅動程式(Device drivers)

2:作業系統的特徵

(1)併發:同一段時間內多個程式執行(注意區別併發和並行,前者是同一時刻的多個事件,後者是統一時間段內的多個事件) (2)共享:系統中的資源可以被記憶體中多個併發執行的進執行緒共同使用 (3)虛擬:通過時分複用(如分時系統)以及空分複用(如虛擬記憶體)技術實現把一個物理實體虛擬為多個 (4)非同步:系統中的程序是以走走停停的方式執行的,且以一種不可預知的速度推進

3:作業系統的主要功能

(1)處理機管理:處理機分配都是以程序為單位,所以處理機管理也被看做是程序管理。包括程序控制,程序同步,程序通訊和程序排程 (2)儲存器管理(或者記憶體管理):記憶體分配,記憶體保護,地址對映,記憶體擴充 (3)裝置管理:管理所有外圍裝置,包括完成使用者的IO請求;為使用者程序分配IO裝置;提高IO裝置利用率;提高IO速度;方便IO的使用 (4)檔案管理:管理使用者檔案和系統檔案,方便使用同時保證安全性。包括:磁碟儲存空間管理,目錄管理,檔案讀寫管理以及檔案共享和保護 (5)提供使用者介面:程式介面(如API)和使用者介面(如GUI)

4:作業系統的主要目標是什麼?

答:1)、方便性:作業系統使計算機更易於使用     2)、有效性:作業系統允許以更有效的方式使用計算機系統資源。     3)、可擴充性:在作業系統中,允許有效地開發,測試和引進新的系統功能。    4)、開放性:實現應用程式的可移植性和互操作性,要求具有統一的開放的環境

二:程序和執行緒相關知識點

1:建立程序的原因有哪些?

(1)系統初始化 (2)執行了從事建立程序的一個系統呼叫,該系統呼叫被正在執行的程序所呼叫。 (3)使用者請求建立一個新程序 (4)一個批處理作業的初始化

2:程序的組成部分有哪些?

①程式。作用:描述程序要完成的功能。 ②資料集合。作用:程式在執行時所需要的資料和工作區。 ③程式控制塊。作用:包含程序的描述資訊和控制資訊。它是程序存在的唯一標誌。

3:程序建立的過程

1) 申請空白PCB。為新程序申請獲得唯一的數字識別符號,並從PCB集合中索取一個空白PCB。 2) 為新程序分配資源。為新程序的程式和資料以及使用者棧分配必要的記憶體空間。顯然,此時作業系統必須知道新程序所需要的記憶體大小。 3) 初始化程序控制塊。PCB的初始化包括:     ①初始化標識資訊,將系統分配的識別符號和父程序識別符號,填入新的PCB中。     ②初始化處理機狀態資訊,使程式計數器指向程式的入口地址,使棧指標指向棧頂。     ③初始化處理機控制資訊,將程序的狀態設定為就緒狀態或靜止就緒狀態,對於優先順序,通常是將它設定為最低優先順序,除非使用者以顯式的方式提出高優先順序要求。 4) 將新程序插入就緒佇列,如果程序就緒佇列能夠接納新程序,便將新程序插入到就緒佇列中。

4:程序銷燬的原因有哪些?

(1)程序執行完,正常退出。(自願的) (2)程序執行過程中,出錯退出。(自願的),比如:試圖開啟不存在的檔案 (3)程序執行過程中,出現嚴重錯誤。(非自願的),比如執行了非法指令,除數是零 (4)被其他程序殺死。(非自願的)比如,某個程序執行一個系統呼叫通知作業系統殺死某個其他程序。

3:程序和程式之間的區別?(程序與執行緒之間的區別在前面的知識點已經說了)

(1)程序是程式及其資料在計算機的一次執行活動,是一個執行過程,是一個動態的概念。程序的執行實體是程式,離開程式的程序沒有存在的意義。而程式是一組有序的指令集合,是一種靜態概念。 (2)程序是程式的一次執行過程,它是動態地建立和消亡的,具有一定的生命週期,是暫時存在的;而程式則是一組程式碼的集合,它是永久存在的,可長期儲存。 (3)一個程序可以執行一個或幾個程式,一個程式也可以構成多個程序。程序可以建立程序,而程式不能形成新的程式。 (4)程序和程式的組成不同。從靜態角度看,程序由程式、資料和程序控制塊(PCB)三部分組成。而程式是一組有序的指令集合。 (5)程序具有併發性,而程式沒有;

4:程序的狀態有哪些?

分為三種情況;

(1)三種狀態:

(2)五種狀態:

(3)七種狀態:

6:程序同步的含義和原則

答:多程序雖然提高了系統資源利用率和吞吐量,但是由於程序的非同步性可能造成系統的混亂。程序同步的任務就是對多個相關程序在執行順序上進行協調,使併發執行的多個程序之間可以有效的共享資源和相互合作,保證程式執行的可再現性同步機制需要遵循的原則:  1. 空閒讓進:當沒有程序處於臨界區的時候,應該許可其他程序進入臨界區的申請  2. 忙則等待:當前如果有程序處於臨界區,如果有其他程序申請進入,則必須等待,保證對臨界區的互斥訪問  3. 有限等待:對要求訪問臨界資源的程序,需要在有限時間呃逆進入臨界區,防止出現死等  4. 讓權等待:當程序無法進入臨界區的時候,需要釋放處理機,邊陷入忙等 經典的程序同步問題:生產者-消費者問題;哲學家進餐問題;讀者-寫者問題

7:孤兒程序和僵死程序是什麼?它們各自的危害是什麼?

(1)孤兒程序:一個父程序退出,而它的一個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序(程序號為1)所收養,並由init程序對它們完成狀態收集工作。

危害:由於父程序已經死亡,系統會幫助父程序回收處理孤兒程序。所以孤兒程序實際上是不佔用資源的,因為它終究是被系統回收了。不會像殭屍程序那樣佔用ID,損害執行系統

(2)僵死程序:一個程序使用fork建立子程序,如果子程序退出,而父程序並沒有呼叫wait或waitpid獲取子程序的狀態資訊,那麼子程序的程序描述符仍然儲存在系統中。這種程序稱之為僵死程序

危害:如果程序不呼叫wait / waitpid的話, 那麼保留的那段資訊就不會釋放,其程序號就會一直被佔用,但是系統所能使用的程序號是有限的,如果大量的產生僵死程序,將因為沒有可用的程序號而導致系統不能產生新的程序. 此即為殭屍程序的危害,應當避免。

危害的場景:例如有個程序,它定期的產 生一個子程序,這個子程序需要做的事情很少,做完它該做的事情之後就退出了,因此這個子程序的生命週期很短,但是,父程序只管生成新的子程序,至於子程序 退出之後的事情,則一概不聞不問,這樣,系統執行上一段時間之後,系統中就會存在很多的僵死程序,倘若用ps命令檢視的話,就會看到很多狀態為Z的程序。 嚴格地來說,僵死程序並不是問題的根源,罪魁禍首是產生出大量僵死程序的那個父程序。因此,當我們尋求如何消滅系統中大量的僵死程序時,答案就是把產生大 量僵死程序的那個元凶槍斃掉(也就是通過kill傳送SIGTERM或者SIGKILL訊號啦)。槍斃了元凶程序之後,它產生的僵死程序就變成了孤兒進 程,這些孤兒程序會被init程序接管,init程序會wait()這些孤兒程序,釋放它們佔用的系統程序表中的資源,這樣,這些已經僵死的孤兒程序 就能瞑目而去了

8:程序間的通訊方式有哪些(IPC)?

答:程序通訊就是指程序間的資訊交換,交換資訊可以使一個狀態,也可以是很多的byte。程序間同步互斥也存在資訊的交換,因此也屬於是一種IPC,屬於是低階通訊。該低階通訊存在的問題:1)通訊的資料量太少;2)通訊對使用者不透明(資料的傳遞或者同步互斥都需要程式設計師實現) 高階通訊機制(高階通訊的通訊細節被OS隱藏,因此使用起來增加方便而且可以傳送大量的資料,尤其是管道通訊): 1. 共享記憶體(最快的方式):相互通訊的程序共享某些資料結構或者是儲存區,程序之間可以通過這些共享空間進行通訊。分為:1)基於共享資料結構的通訊,如生產者消費者系統中的有界緩衝區;2)基於共享儲存區的通訊,可以傳輸大量資料,通訊的程序之間可以像讀寫普通儲存器一樣讀寫共享儲存區 2. 訊息傳遞系統:程序間通訊採用的是格式化的訊息,可以直接使用OS提供的訊息傳送或者接受原語進行通訊。由於隱藏了通訊細節,所以簡化了通訊程式的複雜性 3. 管道通訊:管道是連線兩個一個讀程序和一個寫程序之間用於實現資料交換的一個共享檔案。為了協調管道通訊雙方,需要管道機制實現如下功能:1)互斥:統一時刻只能有一個程序對管道進行讀寫;2)同步:當讀端發現管道為空的時候需要睡眠等待,直到有資料時候被喚醒,相應的寫端也是在管道已滿的時候等待直到被喚醒;3)確定對方的存在性:只有同時有讀端和寫端,管道才有存在意義

4:訊號量:程序間通訊處理同步互斥的機制。訊號量是一個計數器,可以用來控制多個程序對共享資源的訪問。它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。(關鍵就是通過PV操作)

---------------------------------------------------------------------------------------------------------------------------------------------------------------

知識擴充套件之訊號量與PV操作(非常重要)

原因:為什麼需要擴充套件這個知識點,是有原因的,因為,上面提到了,對於程序之間的通訊來說,其中有一個就是通過訊號量機制(定義就不多說了),那麼為什麼訊號量能夠實現程序之間的通訊呢?它裡面的工作機制又是如何的?這其實在作業系統中是一個非常重要的知識點(因為這個點在《計算機作業系統》書籍中都有進行很多的描述,並且針對這個問題,提出了很多經典的問題,並且自己在騰訊的時候也是有被問到這個,而且在基於這個問題的時候,其實對於Java的併發程式設計中都是有利用這個機制的,所以,自己覺得很有必要對這個問題進行闡述一下自己的理解

 -----------------------------------------------------------------------------------------------------------------------------------------------------------

9:程序與執行緒的區別?

程序:程序是程序實體的執行過程,是系統進行資源分配和排程的一個獨立單位(具有動態、併發、獨立、非同步的特性,以及就緒、執行、阻塞3種狀態;也有5狀態或者7狀態;資源擁有單位的屬性);引入程序是為了使多個程式可以併發的執行,以提高系統的資源利用率和吞吐量。

程序的屬性:(1)每個程序擁有唯一識別符號和程序控制塊,程序控制塊記錄了程序執行的暫存器和棧等現場狀態。 (2)不同的程序可以執行相同的程式,即同一個服務程式被不同的使用者呼叫時,作業系統為它們建立成不同的程序。 (3)在單系統的CPU中,各程序可交替佔用CPU;在多CPU的系統中,各程序可同時佔用不同的CPU,若各CPU同時為一個程序內的各執行緒服務則可縮短程序的處理時間。 (4)一個程序被建立後就開始了他的生命週期,直至終止,程序在生命週期內會經歷阻塞態、就緒態和執行態等各種狀態變化

執行緒:是比程序更小的可獨立執行的基本單位,可以看做是輕量級的程序(具有輕型實體,獨立排程分派單位,可併發執行,共享程序資源等屬性);引入目的是為了減少程式在併發執行過程中的開銷,使OS的併發效率更高。

執行緒是程式執行流的最小單元,由執行緒ID、程式計數器、暫存器集合和堆疊組成。 執行緒是程序中的一個實體,是被系統獨立排程和分派的基本單位,執行緒自己不擁有系統資源,只擁有一點在執行中必不可少的資源。

兩者的對比:  (1)排程: 執行緒是獨立排程的基本單位,程序是資源擁有的基本單位。 在同一程序中,執行緒的切換不會引起程序切換。在不同程序中進行執行緒切換,如從一個程序內的執行緒切換到另一個程序中的執行緒時,會引起程序切換。 (2)擁有資源: 程序是擁有資源的基本單位,而執行緒不擁有系統資源(也有一點必不可少的資源)。 (3)併發性: 不僅程序間可以併發執行,而且多個執行緒之間也可以併發執行,提高吞吐量。 (4)系統開銷: 由於建立或撤銷程序時,系統都要為之分配或回收資源,如記憶體空間、IO裝置等,因此作業系統所付出的開銷遠大於建立或撤銷程序時的開銷。在進行程序切換時,涉及當前執行程序CPU環境的儲存及新排程到程序CPU環境的設定,而執行緒切換時只需儲存和設定少量暫存器內容,開銷很小。此外,由於同一程序內的多個執行緒共享程序的地址空間,因此這些執行緒之間的同步與通訊非常容易實現,甚至無需作業系統的干預。 (5)地址空間和其他資源(如開啟的檔案): 程序的地址空間之間互相獨立,同一程序的各執行緒間共享程序的資源,某程序內的執行緒對於其他程序不可見。 (6)通訊方面: 程序間通訊(IPC)需要程序同步和互斥手段的輔助,以保證資料的一致性,而執行緒間可以直接讀/寫程序資料段(如全域性變數)來進行通訊。

10:為什麼有程序還需要有執行緒?

(1)能夠更好的利用相同地址空間的資源。因為,不同的程序是擁有不同的地址空間的,那它們就不能利用某個程序中的地址空間的資源了。 (2)程序的建立和銷燬,消耗的資源大,而執行緒的建立和銷燬,消耗的資源較小,可以更好的減少資源的浪費。 (3)執行緒可以進行並行執行,這對於有大量的IO處理時,可以提高執行的速度。

11:程序控制塊(PCB)的相關知識-------這個對於程序是相當重要的部分

含義:(1)Process Control Block 又稱為 程序描述符、程序屬性(2)是作業系統用於管理控制程序的一個專門的資料結構(3)記錄程序的各種屬性,描述程序的動態變化過程PCB包含的資訊: 第一部分:程序描述資訊(1)程序識別符號(Process ID),唯一。通常是一個整數(2)程序名。通常基於可執行檔名,不唯一(3)使用者識別符號(user ID)(4)整合組關係 第二部分:程序控制資訊(1)當前的狀態(2)優先順序(priority)(3)程式碼執行入口地址(4)程式的磁碟地址(5)執行統計資訊(執行時間,頁面排程)(6)程序間同步和通訊(7)程序的佇列指標(8)程序的資訊佇列指標 第三部分:擁有的資源和使用情況(1)虛擬地址空間狀況(2)開啟檔案列表 第四部分:CPU現場資訊(1)暫存器值(通用暫存器、程式計數器PC、程式狀態字PSW、棧指標)(2)指向該程序頁表的指標

12:程序的切換

含義:程序切換指從正在執行的程序中收回處理器,讓待執行程序來佔有處理器執行。實質上就是被中斷執行程序與待執行程序的上下文切換程序切換引起模式切換:程序切換必須在作業系統核心模式下完成,這就需要模式切換。模式切換又稱處理器切換,即使用者模式和核心模式的互相切換。程序切換的工作過程(詳細版):1、(中斷/異常等觸發)正向模式切換並壓入PSW/PC 。 (Program Status Word 程式狀態字。program counter 程式計數器。指向下一條要執行的指令)2、儲存被中斷程序的現場資訊。3、處理具體中斷、異常。4、把被中斷程序的系統堆疊指標SP值儲存到PCB。(Stack Pointer 棧指標。Process Control Block 程序控制塊。)5、調整被中斷程序的PCB資訊,如程序狀態)。6、把被中斷程序的PCB加入相關佇列。7、選擇下一個佔用CPU執行的程序。8、修改被選中程序的PCB資訊,如程序狀態。9、設定被選中程序的地址空間,恢復儲存管理資訊。10、恢復被選中程序的SP值到處理器暫存器SP。11、恢復被選中程序的現場資訊進入處理器。12、(中斷返回指令觸發)逆向模式轉換並彈出PSW/PC。程序切換的工程過程(粗略版)1、儲存處理機的上下文,包括程式計數器PC、處理機狀態字PS、其他暫存器2、修改當前執行程序的PCB內容,包括將程序狀態從執行態改成其他狀態(等待狀態/就緒狀態)3、選擇另一個程序(按照排程演算法)4、修改被排程程序的PCB內容,包括把其他狀態改變到執行態5、恢復被選現場(上一次切換出處理機時)的處理機現場,按原保護的程式計數器值重置程式計數器PC,執行新選程序程序切換髮生的時機:程序切換一定發生在中斷/異常/系統呼叫處理過程中,常見的有以下情況:1、阻塞式系統呼叫、虛擬地址異常。導致被中斷程序進入等待態。2、時間片中斷、I/O中斷後發現更改優先順序程序。導致被中斷程序進入就緒態。3、終止用系統呼叫、不能繼續執行的異常。導致被中斷程序進入終止態。注意要點:不是所有的中斷/異常就會引起程序切換,有可能會發生,執行完中斷/異常後,繼續恢復當前程序繼續執行。

13:程序發生排程的情況

1、當程序主動放棄處理機時:原來的程序主動放棄了處理機,選擇申請‘排程’來選擇另外的合適程序(1)正在執行的程序執行完畢:作業系統在處理“程序結束”系統呼叫後影請求重新排程(2)正在執行的程序出I/O請求:當作業系統核心驅動啟動外設I/O後,在I/O請求沒有完成前要講程序變成阻塞狀態,應該請求重新排程(3)正在執行的程序要等待其他程序或系統發出的時間時:如等待另一個程序通訊資料,這時作業系統應將現執行程序掛到等待佇列,並且請求重新排程(4)正在執行的程序暫時得不到所要的系統資源:如要求獨佔資源卻被其他程序佔用,這時等待的程序應阻塞到等待佇列上,並且請求重新排程2、當有新程序就緒時:為了支援可剝奪的排程方式,這時要申請‘排程’才能剝奪老程序(1)當中斷處理程式處理完中斷,如I/O中斷引起某個阻塞程序變成就緒狀態時,應申請重新排程(2)當程序釋放獨佔資源,引起其他等待該資源程序從阻塞狀態進入就緒狀態時,應該申請重新排程(3)當某程序發“傳送訊息”系統呼叫,導致等待該訊息的程序就緒時(4)其他任何原因引起有程序從其他狀態變成就緒狀態,如程序被中級排程選中時3、為了支援可剝奪的排程方式,即使沒有新就緒程序,為了讓所有就緒程序輪流佔用處理機,也可選擇申請‘排程’(1)當時鍾中斷髮生,時鐘中斷處理程式呼叫有關時間片的處理程式,發現正執行程序的時間片到,應請求重新排程,以便讓其他程序佔用處理機(2)在按程序優先順序進行排程的作業系統中,任何原因引起程序的優先順序發生變化時,應請求重新排程。如程序通過系統呼叫自願改變優先順序時或系統處理時鐘中斷時,根據各程序等待處理機的時間長短而調整程序的優先順序

14:程序/任務之間的排程演算法

答:基本排程演算法:  1. 先來先服務排程演算法FCFS:既可以作為作業排程演算法也可以作為程序排程演算法;按作業或者程序到達的先後順序依次排程;因此對於長作業比較有利;  2. 短作業優先排程演算法SJ(P)F:作業排程演算法,演算法從就緒佇列中選擇估計時間最短的作業進行處理,直到得出結果或者無法繼續執行;缺點:不利於長作業;未考慮作業的重要性;執行時間是預估的,並不靠譜  3. 高優先權優先排程演算法HPF:既可以作為作業排程也可以作為程序排程演算法;排程作業時,從就緒佇列中選擇優先順序最高的作業進行處理;由於涉及到了優先順序,因此可以分為搶佔式和非搶佔式;而且優先順序的確定也可以分為靜態優先順序(事先根據程序型別,程序對資源的需求,使用者要求等方面確定一個固定值);動態優先順序(隨程序的推進或者等待時間而增加或者減少)  4. 高相應比演算法HRN:響應比=(等待時間+要求服務時間)/要求服務時間;  5. 時間片輪轉排程RR:按到達的先後對程序放入佇列中,然後給隊首程序分配CPU時間片,時間片用完之後計時器發出中斷,暫停當前程序並將其放到佇列尾部,迴圈  6. 多級反饋佇列排程演算法:目前公認較好的排程演算法;設定多個就緒佇列併為每個佇列設定不同的優先順序,第一個佇列優先順序最高,其餘依次遞減。優先順序越高的佇列分配的時間片越短,程序到達之後按FCFS放入第一個佇列,如果排程執行後沒有完成,那麼放到第二個佇列尾部等待排程,如果第二次排程仍然沒有完成,放入第三佇列尾部…。只有當前一個佇列為空的時候才會去排程下一個佇列的程序。實時排程演算法:  1. 最早截止時間優先排程演算法EDF:演算法根據任務的開始截止時間確定優先順序,截止時間越早,優先順序越高。演算法維護一個實時就緒佇列,最早截止時間的任務排在最前面;可以用於搶佔式排程也可以用於非搶佔式排程;  2. 最低鬆弛度優先排程演算法LLF:鬆弛度=(必須完成時間-本身執行時間-當前時間);演算法根據任務的鬆弛度確定任務的優先順序,鬆弛度代表了任務的緊急程度,任務的緊急程度越高,被賦予的優先順序越高

15:排程演算法的目標?

(1)保證程序排程的儘量公平  (2)保持系統的所有部分儘可能忙碌

16:資源分為什麼?多執行緒之間共享和獨享的資源分別是什麼?

答:資源分為共享資源和獨享資源;

共享的資源有:a. 堆  由於堆是在程序空間中開闢出來的,所以它是理所當然地被共享的;因此new出來的都是共享的(16位平臺上分全域性堆和區域性堆,區域性堆是獨享的)b. 全域性變數 它是與具體某一函式無關的,所以也與特定執行緒無關;因此也是共享的c. 靜態變數雖然對於區域性變數來說,它在程式碼中是“放”在某一函式中的,但是其存放位置和全域性變數一樣,存於堆中開闢的.bss和.data段,是共享的d. 檔案等公用資源  這個是共享的,使用這些公共資源的執行緒必須同步。Win32 提供了幾種同步資源的方式,包括訊號、臨界區、事件和互斥體。獨享的資源有:a. 棧 棧是獨享的b. 暫存器  這個可能會誤解,因為電腦的暫存器是物理的,每個執行緒去取值難道不一樣嗎?其實執行緒裡存放的是副本,包括程式計數器PC

對於程序的一系列流程,最好心裡要有一個過程,這樣的話,對於整個程序的認識就會比較的完善,而沒有必要去死記硬背那些知識點,所以推薦一篇文章:大家可以根據流程並結合我的知識點來進行完善。----->>>>>>

三:死鎖的相關知識

1:死鎖的必要條件和處理方法

定義:死鎖是指多個程序在執行過程中,因為爭奪資源而造成的一種僵局,如果沒有外力推進,處於僵局中的程序就無法繼續執行。死鎖原因:  1. 競爭資源:請求同一有限資源的程序數多於可用資源數  2. 程序推進順序非法:程序執行中,請求和釋放資源順序不合理,如資源等待鏈死鎖產生的必要條件:  1. 互斥條件:程序對所分配的資源進行排他性的使用  2. 請求和保持條件:程序被阻塞的時候並不釋放鎖申請到的資源  3. 不可剝奪條件:程序對於已經申請到的資源在使用完成之前不可以被剝奪  4. 環路等待條件:發生死鎖的時候存在的一個 程序-資源 環形等待鏈死鎖處理:  1. 預防死鎖:破壞產生死鎖的4個必要條件中的一個或者多個;實現起來比較簡單,但是如果限制過於嚴格會降低系統資源利用率以及吞吐量 2. 避免死鎖:在資源的動態分配中,防止系統進入不安全狀態(可能產生死鎖的狀態)-如銀行家演算法 3. 檢測死鎖:允許系統執行過程中產生死鎖,在死鎖發生之後,採用一定的演算法進行檢測,並確定與死鎖相關的資源和程序,採取相關方法清除檢測到的死鎖。實現難度大 4. 解除死鎖:與死鎖檢測配合,將系統從死鎖中解脫出來(撤銷程序或者剝奪資源)。對檢測到的和死鎖相關的程序以及資源,通過撤銷或者掛起的方式,釋放一些資源並將其分配給處於阻塞狀態的程序,使其轉變為就緒態。實現難度大死鎖定理:S為死鎖狀態的充分條件是,當且僅當S的資源分配圖是不能完全簡化的。

2:說說程序的飢餓和死鎖的區別?

它們兩者都是程序與程序之間存在的兩種資源競爭的狀態:

死鎖:如果一個程序集合中的每個程序都在等待只能由該組程序中的其他程序才能引發的事件,那麼,該組程序是死鎖的。

飢餓:主要就是指存在某些程序永遠得不到服務的機會。比如多個檔案進行請求印表機裝置分配印表機問題。如果首先分配給小檔案,那麼大檔案可能永遠得不到列印。對於這問題,比較好的解決方法就是通過先來先服務方式。

四:儲存管理的相關知識

1:虛擬儲存器出現的原因以及其主要的思想?

出現的原因:遇到程式太大,以至於記憶體容納不下,而必須進行分段進行載入記憶體基本思想:程式,資料和堆疊的總大小可能超過可用的實體記憶體的大小。由作業系統把程式當前使用的那部分保留在主存中,而把其他的部分儲存在磁碟上。這樣就實現用小的記憶體大小來執行大的程式。

2:實體地址和虛擬地址分別指什麼?

實體地址:就是記憶體中實際存在的地址,也就是我們電腦中記憶體條中所表示的地址。

虛擬地址:被分成虛擬頁號(高位)和偏移量(低位)是一種虛擬化的地址,是由程式產生的地址。虛擬地址與實體地址不是一一對應關係,它們之間存在對映關係。而轉換就是通過MMU(其中MMU(記憶體管理單元):作用為把虛擬地址對映為實體記憶體地址)來進行。

3:什麼叫做虛擬記憶體?虛擬儲存器的特徵是什麼?

如果存在一個程式,所需記憶體空間超過了計算機可以提供的實際記憶體,那麼由於該程式無法裝入記憶體所以也就無法執行。單純的增加實體記憶體只能解決一部分問題,但是仍然會出現無法裝入單個或者無法同時裝入多個程式的問題。但是可以從邏輯的角度擴充記憶體容量,即可解決上述兩種問題,所以出現了虛擬記憶體;虛擬儲存器定義:就是具有請求調入功能和置換功能,可以從邏輯上對記憶體容量加以擴充的一種儲存器系統。虛擬儲存器都是建立在離散記憶體管理的基礎上。虛擬儲存器的特徵:  1. 多次性:一個作業可以分多次被調入記憶體。多次性是虛擬儲存特有的屬性  2. 對換性:作業執行過程中存在換進換出的過程(換出暫時不用的資料換入需要的資料)  3. 虛擬性:虛擬性體現在其從邏輯上擴充了記憶體的容量(可以執行實際記憶體需求比實體記憶體大的應用程式)。虛擬性是虛擬儲存器的最重要特徵也是其最終目標。虛擬性建立在多次性和對換性的基礎上行,多次性和對換性又建立在離散分配的基礎上

4:頁表是什麼?頁表的表項有哪些結構?頁面的抖動和顛簸又是指什麼?

頁表:把虛擬地址對映到頁幀。(每個程序都有自己的頁表,因為每個程序都有自己的虛擬空間)頁表的結構:(1)快取記憶體禁止位:標識是否被快取(2)訪問位:標識是否被訪問,主要是作用於頁面置換(3)修改位:為了記錄頁面的使用狀況,用於標識是否被修改過(4)保護位:指出一個頁面允許什麼型別的訪問(5)"在/不在"位:標識是否處於記憶體中,如果不在,就需要從磁碟進行載入記憶體(6)頁幀號頁面抖動:剛剛換出的頁面可能又被接下來訪問。頁面顛簸:每執行幾條程式語句,就會發生頁面失效(缺頁)的情況。

5:頁面置換演算法有哪些?

(1)最佳置換演算法:只具有理論意義的演算法,用來評價其他頁面置換演算法。置換策略是將當前頁面中在未來最長時間內不會被訪問的頁置換出去。 (2)先進先出置換演算法:簡單粗暴的一種置換演算法,沒有考慮頁面訪問頻率資訊。每次淘汰最早調入的頁面 (3)最近最久未使用演算法LRU:演算法賦予每個頁面一個訪問欄位,用來記錄上次頁面被訪問到現在所經歷的時間t,每次置換的時候把t值最大的頁面置換出去(實現方面可以採用暫存器或者棧的方式實現) (4)時鐘演算法clock(也被稱為是最近未使用演算法NRU):頁面設定一個訪問為,並將頁面連結為一個環形佇列,頁面被訪問的時候訪問位設定為1。頁面置換的時候,如果當前指標所指頁面訪問為為0,那麼置換,否則將其置為0,迴圈直到遇到一個訪問為位0的頁面 (5)改進型Clock演算法:在Clock演算法的基礎上新增一個修改位,替換時根究訪問位和修改位綜合判斷。優先替換訪問為何修改位都是0的頁面,其次是訪問位為0修改位為1的頁面。 (6)最少使用演算法LFU:設定暫存器記錄頁面被訪問次數,每次置換的時候置換當前訪問次數最少的。存在問題是該訪問暫存器並不能真正反映當前頁面訪問次數,因為訪問速度比較快,所以在更新暫存器的時間間隔內訪問1次和訪問100次都是一樣的。另外,LFU和LRU是很類似的,支援硬體也是一樣的,但是區分兩者的關鍵在於一個以時間為標準,一個以次數為標準(例如對於暫存器 pa 001111 和pb 111000,兩個頁面,如果採用LRU,那麼被淘汰的是pa,如果採用LFU那麼被淘汰的是pb)。 (7)頁面緩衝演算法PBA:置換的時候,頁面無論是否被修改過,都不被置換到磁碟,而是先暫留在記憶體中的頁面連結串列(已修改頁面連結串列和未修改頁面連結串列,也可以不區分)裡面,當其再次被訪問的時候可以直接從這些連結串列中取出而不必進行磁碟IO,當連結串列中已修改也難數目達到一定數量之後,進行依次寫磁碟操作(相當於將多次IO合併為一次)

6:作業系統在什麼情況下會做調頁有關的工作?

(1)程序建立:操心繫統要確定程式和資料最初的大小,併為它們建立一個頁表。 (2)程序執行:必須為新程序重置MMU(記憶體管理單位)和重新整理TLB(快表),以清除以前程序所留下的痕跡。 (3)頁面失效:作業系統必須通過讀硬體暫存器來確定哪個虛擬地址造成頁面失效,並且通過計算磁碟哪個頁面需要被換入。 (4)程序銷燬:作業系統必須釋放程序的頁表,頁面和頁面在磁碟所佔有的空間。

7:頁面失效的處理過程?

(1)硬體陷入核心,在堆疊中儲存程式計數器。大多數機器將當前指令的各種狀態資訊儲存在特殊的CPU暫存器中。 (2)啟動一個彙編程式碼例儲存通用暫存器和其他易失的資訊,以免被作業系統破壞。這個例程將作業系統作為一個過程呼叫。 (3)當作業系統發現一個頁面失效時,試圖查詢需要哪個虛擬頁面。通常一個硬體暫存器包含了這一資訊,如果沒有的話,作業系統必須檢索程式計算器,取出這條指令,用軟體分析這條指令,看看它在頁面失效時正在做什麼。 (4)一旦知道了發生頁面失效的虛擬地址,作業系統檢測這個地址是否有效,並檢查存取與保護是否一致。如果不一致,向程序發出一個訊號或殺掉該程序。如果地址有效而沒有保護錯誤發生,系統則檢查是否有空閒頁幀。如果沒有空閒頁幀,執行頁面置換演算法尋找一個被淘汰的頁面。 (5)如果選擇的頁幀“髒”了,安排將該頁面寫會磁碟,併發生一次上下文切換,掛起產生頁面失效的程序,讓其他程序執行直至磁碟傳輸結束。無論如何,該頁幀被標記為忙,以免因為其他原因而被佔用。 (6)一旦頁幀“乾淨”了後(無論是理科還是在寫回磁碟後),作業系統查詢所需頁面在磁碟上的地址,通過磁碟操作將其載入。該頁面被載入後,產生頁面失效的程序仍然被掛起,並且如果有可執行的使用者程序,則另一個使用者程序執行。 (7)當磁碟中斷髮生,表面該頁面已經裝入時,頁表也已更新以反映它的位置,頁幀也標記為通常的狀態。 (8)恢復發生頁面失效指令以前的狀態,程式計數器重新指向這條指令。 (9)排程頁面失效程序,作業系統返回呼叫它的組合語言例程。 (10)該例程恢復暫存器和其他狀態資訊,回到使用者空間繼續執行,就好像頁面失效沒有發生過一樣。

8:記憶體管理方式

答:記憶體管理方式出現的原因:由於連續記憶體分配方式(單一連續分配,固定分割槽分配,動態分割槽分配,動態重定位分割槽分配)導致的記憶體利用率偏低以及記憶體碎片的問題,進而引出離散的記憶體分配方式。離散記憶體分配可以從OS的記憶體管理角度引出頁式(離散分配的基本單位是頁)管理,也可以從程式編制角度引出段式(離散分配的基本單位是段)管理。

(1)頁式

基本分頁儲存管理中不具備頁面置換功能(即沒有實現虛擬記憶體的功能),因此需要整個程式的所有頁面都裝入記憶體之後才可以執行。因為程式資料儲存在不同的頁面中,而頁面又離散的分佈在記憶體中,因此需要一個頁表來記錄邏輯地址和實際儲存地址之間的對映關係,以實現從頁號到物理塊號的對映。由於頁表也是儲存在記憶體中的,因此和不適用分頁管理的儲存方式相比,訪問分頁系統中記憶體資料需要兩次的記憶體訪問(一次是從記憶體中訪問頁表,從中找到指定的物理塊號,加上頁內偏移得到實際實體地址;第二次就是根據第一次得到的實體地址訪問記憶體取出資料)。  為了減少兩次訪問記憶體導致的效率影響,分頁管理中引入了快表(或者聯想暫存器)機制,包含快表機制的記憶體管理中,當要訪問記憶體資料的時候,首先將頁號在快表中查詢,如果查詢到說明要訪問的頁表項在快表中,那麼直接從快表中讀取相應的物理塊號;如果沒有找到,那麼訪問記憶體中的頁表,從頁表中得到實體地址,同時將頁表中的該對映表項新增到快表中(可能存在快表換出演算法)。  在某些計算機中如果記憶體的邏輯地址很大,將會導致程式的頁表項會很多,而頁表在記憶體中是連續存放的,所以相應的就需要較大的連續記憶體空間。為了解決這個問題,可以採用兩級頁表或者多級頁表的方法,其中外層頁表一次性調入記憶體且連續存放,內層頁表離散存放。相應的訪問記憶體頁表的時候需要一次地址變換,訪問邏輯地址對應的實體地址的時候也需要一次地址變換,而且一共需要訪問記憶體3次才可以讀取一次資料。

(2)段式

分頁是為了提高記憶體利用率,而分段是為了滿足程式設計師在編寫程式碼的時候的一些邏輯需求(比如資料共享,資料保護,動態連結等)。  分段記憶體管理當中,地址是二維的,一維是段號,一維是段內地址;其中每個段的長度是不一樣的,而且每個段內部都是從0開始編址的。由於分段管理中,每個段內部是連續記憶體分配,但是段和段之間是離散分配的,因此也存在一個邏輯地址到實體地址的對映關係,相應的就是段表機制。段表中的每一個表項記錄了該段在記憶體中的起始地址和該段的長度。段表可以放在記憶體中也可以放在暫存器中。  訪問記憶體的時候根據段號和段表項的長度計算當前訪問段在段表中的位置,然後訪問段表,得到該段的實體地址,根據該實體地址以及段內偏移量就可以得到需要訪問的記憶體。由於也是兩次記憶體訪問,所以分段管理中同樣引入了聯想暫存器。分段和分頁的對比:  (1)對程式設計師的透明性:分頁透明,但是分段需要程式設計師顯示劃分每個段。 (2)地址空間的維度:分頁是一維地址空間,分段是二維的。 (3)大小是否可以改變:頁的大小不可變,段的大小可以動態改變。 (4)出現的原因:分頁主要用於實現虛擬記憶體,從而獲得更大的地址空間;分段主要是為了使程式和資料可以被劃分為邏輯上獨立的地址空間並且有助於共享和保護。

(3)段頁式:

先將使用者程式分為若干個段,然後再把每個段分成若干個頁,並且為每一個段賦予一個段名稱。這樣在段頁式管理中,一個記憶體地址就由段號,段內頁號以及頁內地址三個部分組成。 

段頁式記憶體訪問:系統中設定了一個段表暫存器,存放段表的起始地址和段表的長度。地址變換時,根據給定的段號(還需要將段號和暫存器中的段表長度進行比較防止越界)以及暫存器中的段表起始地址,就可以得到該段對應的段表項,從段表項中得到該段對應的頁表的起始地址,然後利用邏輯地址中的段內頁號從頁表中找到頁表項,從該頁表項中的物理塊地址以及邏輯地址中的頁內地址拼接出實體地址,最後用這個實體地址訪問得到所需資料。由於訪問一個數據需要三次記憶體訪問,所以段頁式管理中也引入了高速緩衝暫存器。

9:頁式管理,段式管理以及段頁式管理各自的地址結構是什麼?

(1)頁式:頁號+頁內偏移量 (2)段式:段號+段內偏移量

(3)段頁式:段號+頁號+偏移量

10:頁式管理,段式管理以及段頁式管理各自的地址轉換流程是怎樣?

五:輸入/輸出相關知識

1:常見的I/O裝置有哪些?並且I/O裝置的分類主要是哪幾種?

2:磁碟讀取資料為什麼要先快取到內部的緩衝區,而不是直接儲存在主存?

(1)通過進行內部緩衝,磁碟控制器可以在開始傳送之前進行檢驗和。如果檢驗和是錯誤的,那麼就表明錯誤的訊號將被髮出並且不會進行傳送。 (2)一旦磁碟傳送開始,從磁碟讀出的資料是以固定速率到達的,不論控制器是否準備好接受資料。如果控制器要將資料直接寫入記憶體,則它必須為要傳送的每個字取得系統匯流排的控制。此時,如果其他裝置使用匯流排而導致匯流排忙,則控制器就必須等待。

3:I/O軟體的層次是哪幾種?

(1)中斷處理程式:中斷處理髮生的過程(見自己的部落格) (2)裝置驅動程式 (3)與裝置無關的作業系統軟體:基本功能是執行對所有裝置公共的I/O功能,並且向用戶層軟體提供一個統一的介面。     其介面又分為:1:裝置驅動程式的統一介面   2:緩衝   3:錯誤報告   4:分配與釋放專用裝置   5:提供與裝置無關的塊大小 (4)使用者級I/O軟體

4:CPU的工作狀態有什麼?

大多數計算機系統將CPU執行狀態分為目態與管態。CPU的狀態屬於程式狀態字PSW的一位。CPU交替執行作業系統程式和使用者程式。管態又叫特權態,系統態或核心態。CPU在管態下可以執行指令系統的全集。通常,作業系統在管態下執行。 目態又叫常態或使用者態。機器處於目態時,程式只能執行非特權指令。使用者程式只能在目態下執行,如果使用者程式在目態下執行特權指令,硬體將發生中斷,由作業系統獲得控制,特權指令執行被禁止,這樣可以防止使用者程式有意或無意的破壞系統。 從目態轉換為管態的唯一途徑是中斷。  從管態到目態可以通過修改程式狀態字來實現,這將伴隨這由作業系統程式到使用者程式的轉換。

5:機械硬碟的工作原理

硬碟的構造:

(1)機械手臂(Boom) (2)磁頭(Head) (3)轉軸(Spindle) (4)碟片(Platter)組成,在實際應用中又將碟片分成了磁軌(Track),扇區(Sector)和柱面(Cylinder)

工作方式:

      現代硬碟尋道都是採用CHS(Cylinder Head Sector)的方式,硬碟讀取資料時,讀寫磁頭沿徑向移動,移到要讀取的扇區所在磁軌的上方,這段時間稱為尋道時間(seek time)。因讀寫磁頭的起始位置與目標位置之間的距離不同,尋道時間也不同。目前硬碟一般為2到30毫秒,平均約為9毫秒。磁頭到達指定磁軌後,然後通過碟片的旋轉,使得要讀取的扇區轉到讀寫磁頭的下方,這段時間稱為旋轉延遲時間(rotational latencytime)。

磁碟排程演算法:

(1)先來先服務演算法(FCFS) 這種演算法將對磁碟的IO請求進行排隊,按照先後順序依次排程磁頭。這種演算法的特點是簡單,合理,但沒有減少尋道時間 (2)最短尋道時間演算法(SSFT) 這種演算法優先執行所需讀寫的磁軌離當前磁頭最近的請求。這保證了平均尋道時間的最短,但缺點顯而易見:離當前磁頭比較遠的尋道請求有可能一直得不到執行,這也就是所謂的“飢餓現象”。 (3)掃描演算法(SCAN) 這種演算法在磁頭的移動方向上選擇離當前磁頭所在磁軌最近的請求作為下一次服務物件,這種改進有效避免了飢餓現象,並且減少了尋道時間。但缺點依然存在,那就是不利於最遠一端的磁軌訪問請求。 (4)迴圈掃描演算法(CSCAN) 也就是俗稱的電梯演算法,這種演算法是對最短尋道時間演算法的改進。這種演算法就像電梯一樣,只能從1樓上到15樓,然後再從15樓下到1樓。這種演算法的磁頭排程也是如此,磁頭只能從最裡磁軌到磁碟最外層磁軌。然後再由最外層磁軌移動到最裡層磁軌,磁頭是單向移動的,在此基礎上,才執行和最短尋道時間演算法一樣的,離當前磁頭最近的尋道請求。這種演算法改善了SCAN演算法,消除了對兩端磁軌請求的不公平。

磁碟優化的策略:

(1)對於磁碟讀取來說,大部分的時間都是花在尋到時間上面,所以通過尋道策略可以進行一定的優化; (2)可以利用區域性性特點:所謂的區域性性原理分為時間和空間上的。由於程式是順序執行的,因此當前資料段附近的資料有可能在接下來的時間被訪問到。這就是所謂的空間區域性性。而程式中還存在著迴圈,因此當前被訪問的資料有可能在短時間內被再次訪問,這就是所謂的時間區域性性原理。      提前讀(Read-Ahead) 提前讀也被稱為預讀。根據磁碟原理我們不難看出,在磁碟讀取資料的過程中,真正讀取資料的時間只佔了很小一部分,而大部分時間花在了旋轉延遲和尋道時間上,因此根據空間區域性性原理,每次讀取資料的時間不僅僅讀取所需要的資料,還將所請求資料附近的資料進行讀取。       延遲寫(Delayed write) 同樣,根據時間區域性性原理,最近被訪問的資料有可能再次被訪問,因此當資料更改之後不馬上寫回磁碟,而是繼續放在記憶體中,以備接下來的請求讀取或者修改,是減少磁碟IO的另一個有效手段。

6:說說我們在系統進行開啟的時候,做的哪些工作?

當電源開啟時,BIOS最先執行,然後它讀入主引導記錄並跳轉到主引導記錄。然後這一載入程式進行檢查以瞭解哪個分割槽是活動的。引導扇區包含一個小的程式,它在根目錄中搜索某個程式(或者是作業系統或者是一個更大的啟動程式裝載器)。該程式被裝入記憶體並執行。

7:輸入輸出裝置中的盤有哪些型別?

(1)磁碟 (2)RAID(廉價磁碟冗餘陣列) (3)CD-ROM(光碟) (4)可刻錄的CD (5)可重寫CD (6)DVD(數字通用光碟)

8:中斷處理程式的過程?

(1)儲存沒有被中斷硬體儲存的所有暫存器(包括PSW) (2)為中斷服務過程設定上下文,可能包括設定TLB,MMU和頁表 (3)為中斷服務過程設定堆疊 (4)應答中斷控制器,如果不存在集中的中斷控制器,則再次開發中斷。 (5)將暫存器從它們被儲存的地方(可能是某個堆疊)複製到程序表中。 (6)執行中斷服務過程,從發出中斷的裝置控制器的暫存器中提取訊息。 (7)選擇下一次執行哪個程序,如果中斷導致某個被阻塞的高優先順序程序變為就緒,則可能選擇它現在就執行。 (8)為下一次執行的程序設定MMU上下文,也許還需要設定某個TLB。 (9)裝入新程序的暫存器,包括PSW (10)開始執行新程序。

六:檔案系統的相關知識

1:常見的檔案系統有哪些?

答:其實對於這個問題的話,我是從兩個方面進行回答的,因為隨著現在的技術的發展的話,出現傳統的檔案系統和分散式系統,所以,回答的時候,可以說一下這兩種型別的不同的系統。可以參考下面這兩篇文章:

2:檔案存取方式有哪些?

(1)順序存取:從開始順序讀取檔案的全部位元組和記錄,但不能跳過某一些內容,也不能不按順序讀取; (2)隨機存取(現在都採用這種):以任何次序讀取其中位元組或記錄

3:檔案操作有哪些?

4:說說對於檔案目錄的理解?

4:說說對於檔案描述符的理解

檔案描述符定義:

      檔案描述符(file descriptor)是核心為了高效管理已被開啟的檔案所建立的索引,其是一個非負整數(通常是小整數),用於指代被開啟的檔案,所有執行I/O操作的系統呼叫都通過檔案描述符。程式剛剛啟動的時候,0是標準輸入,1是標準輸出,2是標準錯誤。如果此時去開啟一個新的檔案,它的檔案描述符會是3。POSIX標準要求每次開啟檔案時(含socket)必須使用當前程序中最小可用的檔案描述符號碼,因此,在網路通訊過程中稍不注意就有可能造成串話。

      在linux程序中,預設有三個檔案是開啟的:標準輸入(stdin)0,標準輸出(stdout)1,錯誤輸出(stderr)2,其0,1,2對應的物理裝置分別是鍵盤,顯示器,顯示器;因此,函式 scanf() 使用 stdin,而函式 printf() 使用 stdout。

檔案描述符的結構關係:

       由圖可以理解到,在我們程序的程序控制塊即PCB中有一個結構體指標file,它指向了一個files_struct結構體,這個結構體內儲存著一個指標陣列,其每個元素都是一個指標,這個指標就是開啟檔案的指標,而我們所謂的檔案描述符就是這些指標的下標,所以只要拿著檔案描述符就可以找到對應的檔案。

檔案描述符的生命週期:

(1)建立file物件 (2)根據IO物件的型別註冊各個操作函式(註冊file_operations) (3)將file物件的指標註冊到程序描述符的files數組裡的fd下標處 (4)read、write等等IO操作 (5)呼叫close(fd)釋放file物件

總結:檔案描述符(file_struct)是作業系統用來管理檔案的資料結構,當我們建立一個程序時,會建立檔案描述符表,程序控制塊PCB中的fs指標指向檔案描述符表,當我們建立檔案時,會為指向該檔案的指標FILE*關聯一個檔案描述符並新增在檔案描述符表中。在檔案描述符表中fd相當於陣列的索引,FILE*相當於陣列的內容嗎,指向一個檔案結構體。

七:作業系統相關方面知識

1:時鐘週期,機器週期(CPU週期),指令週期各自的含義是什麼?

指令週期 :取出並執行一條指令的時間。  機器週期 :又稱CPU週期,CPU訪問一次記憶體所花的時間較長,因此用從記憶體讀取一條指令字的最短時間來定義。 時鐘週期:通常稱為節拍脈衝或T週期。處理操作的最基本單位,即CPU主頻。