同門找工面試題總結

1、什麼是微內核?

       微內核結構由一個非常簡單的硬件抽象層和一組比較關鍵的原語或系統調用組成,這些原語僅僅包括了建立一個系統必需的幾個部分,如任務的創建和刪除,進程、線程管理,內存管理,進程間通信和中斷處理等。在微內核結構中,操作系統的內核只需要提供最基本、最核心的一部分操作即可,而其他的管理程序(如文件系統、網絡協議棧、設備驅動等)則儘可能的放在內核之外,在用戶模式下運行。這些外部程序可以獨立運行,並對外部用戶程序提供操作系統服務,服務程序之間使用進程間通信機制進行交互,只在需要內核的協助時,才通過一套接口對內核發出調用請求。因爲每個服務只是在自己的地址空間運行,所以這些服務之間彼此之間都受到了保護。微內核的目標是將系統服務的實現和系統的基本操作規則分離開來。例如,進程的輸入/輸出鎖定服務可以由運行在微核之外的一個服務組件來提供。這些非常模塊化的用戶態服務用於完成操作系統中比較高級的操作,這樣的設計使內核中最核心的部分的設計更簡單。一個服務組件的失效並不會導致整個系統的崩潰,內核需要做的,僅僅是重新啓動這個組件,而不必影響其它的部分。

       微內核系統的優點是操作系統具有良好的靈活性,它使得操作系統內部結構簡單清晰,程序代碼的維護非常之方便。但是也有不足之處。微內核系統由於核心態只實現了最基本的系統操作,而內核以外的外部服務程序之間由於獨立運行使得系統難以進行良好的整體優化。另外,進程間互相通信的開銷也較單一內核系統要大許多。從整體上看,在當前的硬件條件下,微內核在效率上的損失小於其在結構上獲得的收益,故而選取微內核成爲操作系統的一大潮流。

       linux是典型的宏內核架構,就是說操作系統內核本身是一個不可分割的進程。而微內核結構,是說操作系統內核是一組相互協作的進程,而最核心的進程纔是OS實際的內核,這個進程一般負責其他內核進程之間的交互。微內核的設計可以將很多在宏內核中原本屬於內核的程序移出內核,使得操作系統更加穩定,比如在宏內核中文件系統運行在內核態,而在微內核架構中,文件系統則運行在用戶態,這樣即使文件系統出問題了,也不會使操作系統崩潰。很明顯微內核的架構強於宏內核的設計。現在的OS中,mac os x,gnu hurd等是屬於微內核架構,而傳統的unix和linux都是宏內核架構。一般來說,宏內核更容易實現,微內核實現起來難度更大,主要是因爲微內核架構裏,很多進程通信是異步的,這樣就難於調試,並且更容易有bug,實現後也會更強大。

        學習文章:http://baike.baidu.com/view/928365.htm    http://wenku.baidu.com/view/6f368ed576eeaeaad1f330d4.html

2、內存泄露

       內存泄漏(memory leak)指由於疏忽或錯誤造成程序未能釋放已經不再使用的內存的情況。內存泄漏並非指內存在物理上的消失,而是應用程序分配某段內存後,由於設計錯誤,失去了對該段內存的控制,因而造成了內存的浪費。

       一般我們常說的內存泄漏是指堆內存的泄漏。堆內存是指程序從堆中分配的,大小任意的(內存塊的大小可以在程序運行期決定),使用完後必須顯式釋放的內存。應用程序一般使用malloc,calloc,realloc等函數(C++中使用new操作符)從堆中分配到一塊內存,使用完後,程序必須負責相應的調用free或delete釋放該內存塊,否則,這塊內存就不能被再次使用,我們就說這塊內存泄漏了。

        內存泄露的分類

        1). 常發性內存泄漏。發生內存泄漏的代碼會被多次執行到,每次被執行的時候都會導致一塊內存泄漏。

  2). 偶發性內存泄漏。發生內存泄漏的代碼只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測內存泄漏至關重要。

  3). 一次性內存泄漏。發生內存泄漏的代碼只會被執行一次,或者由於算法上的缺陷,導致總會有一塊且僅一塊內存發生泄漏。比如,在一個Singleton類的構造函數中分配內存,在析構函數中卻沒有釋放該內存。而Singleton類只存在一個實例,所以內存泄漏只會發生一次。

  4). 隱式內存泄漏。程序在運行過程中不停的分配內存,但是直到結束的時候才釋放內存。嚴格的說這裏並沒有發生內存泄漏,因爲最終程序釋放了所有申請的內存。但是對於一個服務器程序,需要運行幾天,幾周甚至幾個月,不及時釋放內存也可能導致最終耗盡系統的所有內存。所以,我們稱這類內存泄漏爲隱式內存泄漏。

       以下這段小程序演示了堆內存發生泄漏的情形:

  void MyFunction(int nSize)

  {

  char* p= new char[nSize];

  if( !GetStringFrom( p, nSize ) ){

  MessageBox(“Error”);

  return;

  }

  …//using the string pointed by p;

  delete[] p;

  }

  當函數GetStringFrom()返回零的時候,指針p指向的內存就不會被釋放。這是一種常見的發生內存泄漏的情形。程序在入口處分配內存,在出口處釋放內存,但是c函數可以在任何地方退出,所以一旦有某個出口處沒有釋放應該釋放的內存,就會發生內存泄漏。

3、棧溢出

      棧溢出就是緩衝區溢出的一種。 由於緩衝區溢出而使得有用的存儲單元被改寫,往往會引發不可預料的後果。程序在運行過程中,爲了臨時存取數據的需要,一般都要分配一些內存空間,通常稱這些空間爲緩衝區。如果向緩衝區中寫入超過其本身長度的數據,以致於緩衝區無法容納,就會造成緩衝區以外的存儲單元被改寫,這種現象就稱爲緩衝區溢出。緩衝區長度一般與用戶自己定義的緩衝變量的類型有關。

  棧溢出就是緩衝區溢出的一種。

4、strcpy函數的編寫與測試

  1. #include <cstdlib>   
  2. #include <iostream>   
  3. #include <cstring>   
  4. using namespace std;  
  5. char *_strcpy(char *strDest, const char *strSrc)  
  6. {  
  7.     assert(strDest != NULL && strSrc != NULL);  
  8.       
  9.     const char *ptrSrc = strSrc;  
  10.     char *ptrDest = strDest;  
  11.       
  12.     while(ptrSrc != NULL && *ptrSrc != '/0')  
  13.         *ptrDest++ = *ptrSrc++;  
  14.       
  15.     *ptrDest = '/0';  
  16.       
  17.     return strDest;  
  18. }  
  19. int main(int argc, char *argv[])  
  20. {  
  21.     char *strSrc = "test string";  
  22.     char *strDest = new char[strlen(strSrc) + 1];  
  23.       
  24.     _strcpy(strDest, strSrc);  
  25.     cout << strDest << endl;  
  26.       
  27.     system("PAUSE");  
  28.     return EXIT_SUCCESS;  
  29. }  

5、c++對象大小的影響因素是什麼?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章