天天看點

linux面試準備2

1. 線程的實作方式. (也就是使用者線程與核心線程的差別)

  1. 核心級線程:切換由核心控制,當線程進行切換的時候,由使用者态轉化為核心态。切換完畢要從核心态傳回使用者态;可以很好的利用smp,即利用多核cpu。windows線程就是這樣的。
  2. 使用者級線程核心的切換由使用者态程式自己控制核心切換,不需要核心幹涉,少了進出核心态的消耗,但不能很好的利用多核Cpu,目前Linux pthread大體是這麼做的。

    線程的實作可以分為兩類:使用者級線程(User-Level Thread)和核心線線程(Kernel-Level Thread),後者又稱為核心支援的線程或輕量級程序。在多線程作業系統中,各個系統的實作方式并不相同,在有的系統中實作了使用者級線程,有的系統中實作了核心級線程。

    使用者線程指不需要核心支援而在使用者程式中實作的線程,其不依賴于作業系統核心,應用程序利用線程庫提供建立、同步、排程和管理線程的函數來控制使用者線程。不需要使用者态/核心态切換,速度快,作業系統核心不知道多線程的存在,是以一個線程阻塞将使得整個程序(包括它的所有線程)阻塞。由于這裡的處理器時間片配置設定是以程序為基本機關,是以每個線程執行的時間相對減少。

  3. 核心線程:由作業系統核心建立和撤銷。核心維護程序及線程的上下文資訊以及線程切換。一個核心線程由于I/O操作而阻塞,不會影響其它線程的運作。Windows NT和2000/XP支援核心線程。

使用者線程運作在一個中間系統上面。目前中間系統實作的方式有兩種,即運作時系統(Runtime System)和核心控制線程。“運作時系統”實質上是用于管理和控制線程的函數集合,包括建立、撤銷、線程的同步和通信的函數以及排程的函數。這些函數都駐留在使用者空間作為使用者線程和核心之間的接口。使用者線程不能使用系統調用,而是當線程需要系統資源時,将請求傳送給運作時,由後者通過相應的系統調用來擷取系統資源。核心控制線程:系統在分給程序幾個輕型程序(LWP),LWP可以通過系統調用來獲得核心提供的服務,而程序中的使用者線程可通過複用來關聯到LWP,進而得到核心的服務。

以下是使用者級線程和核心級線程的差別:

  1. 核心支援線程是OS核心可感覺的,而使用者級線程是OS核心不可感覺的。
  2. 使用者級線程的建立、撤消和排程不需要OS核心的支援,是在語言(如Java)這一級處理的;而核心支援線程的建立、撤消和排程都需OS核心提供支援,而且與程序的建立、撤消和排程大體是相同的。
  3. 使用者級線程執行系統調用指令時将導緻其所屬程序被中斷,而核心支援線程執行系統調用指令時,隻導緻該線程被中斷。
  4. 在隻有使用者級線程的系統内,CPU排程還是以程序為機關,處于運作狀态的程序中的多個線程,由使用者程式控制線程的輪換運作;在有核心支援線程的系統内,CPU排程則以線程為機關,由OS的線程排程程式負責線程的排程。
  5. 使用者級線程的程式實體是運作在使用者态下的程式,而核心支援線程的程式實體則是可以運作在任何狀态下的程式。

核心線程的優點:

  1. 當有多個處理機時,一個程序的多個線程可以同時執行。

缺點:

  1. 由核心進行排程。

使用者程序的優點:

  1. 線程的排程不需要核心直接參與,控制簡單。
  2. 可以在不支援線程的作業系統中實作。
  3. 建立和銷毀線程、線程切換代價等線程管理的代價比核心線程少得多。
  4. 允許每個程序定制自己的排程算法,線程管理比較靈活。這就是必須自己寫管理程式,與核心線程的差別
  5. 線程能夠利用的表空間和堆棧空間比核心級線程多。
  6. 同一程序中隻能同時有一個線程在運作,如果有一個線程使用了系統調用而阻塞,那麼整個程序都會被挂起。另外,頁面失效也會産生同樣的問題。

缺點:

  資源排程按照程序進行,多個處理機下,同一個程序中的線程隻能在同一個處理機下分時複用

2. 使用者态和核心态的差別

  核心态與使用者态是作業系統的兩種運作級别,當程式運作在3級特權級上時,就可以稱之為運作在使用者态,因為這是最低特權級,是普通的使用者程序運作的特權級,大部分使用者直接面對的程式都是運作在使用者态;反之,當程式運作在0級特權級上時,就可以稱之為運作在核心态。運作在使用者态下的程式不能直接通路作業系統核心資料結構和程式。當我們在系統中執行一個程式時,大部分時間是運作在使用者态下的,在其需要作業系統幫助完成某些它沒有權力和能力完成的工作時就會切換到核心态。

這兩種狀态的主要差别是: 處于使用者态執行時,程序所能通路的記憶體空間和對象受到限制,其所處于占有的處理機是可被搶占的 ; 而處于核心态執行中的程序,則能通路所有的記憶體空間和對象,且所占有的處理機是不允許被搶占的。

通常來說,以下三種情況會導緻使用者态到核心态的切換:

  1. 系統調用

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

  2. 異常

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

  3. 外圍裝置的中斷

      當外圍裝置完成使用者請求的操作後,會向CPU發出相應的中斷信号,這時CPU會暫停執行下一條即将要執行的指令轉而去執行與中斷信号對應的處理程式,如果先前執行的指令是使用者态下的程式,那麼這個轉換的過程自然也就發生了由使用者态到核心态的切換。比如硬碟讀寫操作完成,系統會切換到硬碟讀寫的中斷處理程式中執行後續操作等。

    這3種方式是系統在運作時由使用者态轉到核心态的最主要方式,其中系統調用可以認為是使用者程序主動發起的,異常和外圍裝置中斷則是被動的。

3. 使用者棧和核心棧的差別

   作業系統中,每個程序會有兩個棧,一個使用者棧,存在于使用者空間,一個核心棧,存在于核心空間。當程序在使用者空間運作時,cpu堆棧指針寄存器裡面的内容是使用者堆棧位址,使用使用者棧;當程序在核心空間時,cpu堆棧指針寄存器裡面的内容是核心棧空間位址,使用核心棧。

  核心棧是記憶體中屬于作業系統空間的一塊區域,其主要用途為:

  1. 儲存中斷現場,對于嵌套中斷,被中斷程式的現場資訊依次壓入系統棧,中斷傳回時逆序彈出;
  2. 儲存作業系統子程式間互相調用的參數、傳回值、傳回點以及子程式(函數)的局部變量。

    使用者棧是使用者程序空間中的一塊區域,用于儲存使用者程序的子程式間互相調用的參數、傳回值、傳回點以及子程式(函數)的局部變量。

    PS:那麼為什麼不直接用一個棧,何必浪費那麼多的空間呢?

    如果隻用系統棧。系統棧一般大小有限,如果中斷有16個優先級,那麼系統棧一般大小為15(隻需儲存15個低優先級的中斷,另一個高優先級中斷處理程式處于運作),但使用者程式子程式調用次數可能很多,那樣15次子程式調用以後的子程式調用的參數、傳回值、傳回點以及子程式(函數)的局部變量就不能被儲存,使用者程式也就無法正常運作了。

    如果隻用使用者棧。我們知道系統程式需要在某種保護下運作,而使用者棧在使用者空間(即cpu處于使用者态,而cpu處于核心态時是受保護的),不能提供相應的保護措施(或相當困難)。

4. 死鎖的概念,導緻死鎖的原因

  可以把死鎖定義為一組互相競争系統資源或進行通信的程序間的“永久”阻塞。當一組程序中的每個程序都在等待某個事件(典型的情況是等待所請求的資源釋放),而隻有在這組程序中的其他被阻塞的程序才可以觸發該事件,這時就稱這組程序發生死鎖。因為沒有事件能夠被觸發,是以死鎖是永久性的。

産生死鎖的原因主要是:

  1. 因為系統資源不足。
  2. 程序運作推進的順序不合适。
  3. 資源配置設定不當等

導緻死鎖的4個必要條件:

  1. 互斥條件:程序要求對所配置設定的資源進行排它性控制,即在一段時間内某資源僅為一程序所占用。
  2. 請求和保持條件:當程序因請求資源而阻塞時,對已獲得的資源保持不放。
  3. 不剝奪條件:程序已獲得的資源在未使用完之前,不能剝奪,隻能在使用完時由自己釋放。
  4. 循環等待條件:在發生死鎖時,必然存在一個程序–資源的環形鍊。

    死鎖預防政策是試圖設計一種系統來排除發生死鎖的可能性,方法分為兩類:間接的死鎖預防方法(防止前面三個列出的三個必要條件中的任何一個的發生);直接的死鎖的預防方法(防止循環等待的發生)。

5. 程序排程算法。(周轉時間 = 程式結束時間 – 開始服務時間、帶權周轉時間= 周轉時間 / 要求服務時間)

一、先來先服務和短作業(程序)優先排程算法

  1. 先來先服務排程算法。先來先服務(FCFS)排程算法是一種最簡單的排程算法,該算法既可用于作業排程, 也可用于程序排程。FCFS算法比較有利于長作業(程序),而不利于短作業(程序)。由此可知,本算法适合于CPU繁忙型作業, 而不利于I/O繁忙型的作業(程序)。
  2. 短作業(程序)優先排程算法。短作業(程序)優先排程算法(SJ/PF)是指對短作業或短程序優先排程的算法,該算法既可用于作業排程, 也可用于程序排程。但其對長作業不利;不能保證緊迫性作業(程序)被及時處理;作業的長短隻是被估算出來的。

二、高優先權優先排程算法

  1. 優先權排程算法的類型。為了照顧緊迫性作業,使之進入系統後便獲得優先處理,引入了最高優先權優先(FPF)排程算法。 此算法常被用在批處理系統中,作為作業排程算法,也作為多種作業系統中的程序排程,還可以用于實時系統中。當其用于作業排程, 将後備隊列中若幹個優先權最高的作業裝入記憶體。當其用于程序排程時,把處理機配置設定給就緒隊列中優先權最高的程序,此時, 又可以進一步把該算法分成以下兩種:

    1)非搶占式優先權算法

    2)搶占式優先權排程算法(高性能計算機作業系統)

  2. 優先權類型 。對于最高優先權優先排程算法,其核心在于:它是使用靜态優先權還是動态優先權, 以及如何确定程序的優先權。
  3. 高響應比優先排程算法

    為了彌補短作業優先算法的不足,我們引入動态優先權,使作業的優先等級随着等待時間的增加而以速率a提高。 該優先權變化規律可描述為:優先權=(等待時間+要求服務時間)/要求服務時間;即 =(響應時間)/要求服務時間

三、基于時間片的輪轉排程算法

  1. 時間片輪轉法。時間片輪轉法一般用于程序排程,每次排程,把CPU配置設定隊首程序,并令其執行一個時間片。 當執行的時間片用完時,由一個記時器發出一個時鐘中斷請求,該程序被停止,并被送往就緒隊列末尾;依次循環。
  2. 多級回報隊列排程算法 ,不必事先知道各種程序所需要執行的時間,它是目前被公認的一種較好的程序排程算法。 其實施過程如下:

      1) 設定多個就緒隊列,并為各個隊列賦予不同的優先級。在優先權越高的隊列中, 為每個程序所規定的執行時間片就越小。

      2) 當一個新程序進入記憶體後,首先放入第一隊列的末尾,按FCFS原則排隊等候排程。 如果他能在一個時間片中完成,便可撤離;如果未完成,就轉入第二隊列的末尾,在同樣等待排程…… 如此下去,當一個長作業(程序)從第一隊列依次将到第n隊列(最後隊列)後,便按第n隊列時間片輪轉運作。

      3) 僅當第一隊列空閑時,排程程式才排程第二隊列中的程序運作;僅當第1到第(i-1)隊列空時, 才會排程第i隊列中的程序運作,并執行相應的時間片輪轉。

      4) 如果處理機正在處理第i隊列中某程序,又有新程序進入優先權較高的隊列, 則此新隊列搶占正在運作的處理機,并把正在運作的程序放在第i隊列的隊尾。

繼續閱讀