大約linux的幾個問題,你能回答幾個?--回覆14-20稱號

weixin_33831673發表於2015-08-17

14.select和poll差異?Poll和epoll的差別?

 

(1)select和poll的差別:(參考:http://blog.csdn.net/mituan2008/article/details/6695177

二者根本的不同是:select()的fd_set是一個位掩碼(bit mask)。因此fd_set有固定的長度。核心在被編譯的時候,能夠不受這個長度的限制,由於select()同意應用程式自己定義FD_SETSIZE的大小,可是這會新增額外的支出。

    在呼叫poll()時須要自己定義pollfd結構體陣列而且須要指定陣列的大小,所以呢這裡原理上講就是沒有限制的。

 

(2)select和poll、epoll的差別(參考http://www.cnblogs.com/Anker/p/3265058.html

A. select,poll實現須要自己不斷輪詢全部fd集合,直到裝置就緒。期間可能要睡眠和喚醒多次交替。而epoll事實上也須要呼叫epoll_wait不斷輪詢就緒連結串列。期間也可能多次睡眠和喚醒交替。可是它是裝置就緒時,呼叫回撥函式,把就緒fd放入就緒連結串列中。並喚醒在epoll_wait中進入睡眠的程式。儘管都要睡眠和交替。可是select和poll在“醒著”的時候要遍歷整個fd集合,而epoll在“醒著”的時候僅僅要推斷一下就緒連結串列是否為空即可了,這節省了大量的CPU時間。

這就是回撥機制帶來的效能提升。

B. select,poll每次呼叫都要把fd集合從使用者態往核心態拷貝一次。並且要把current往裝置等待佇列中掛一次,而epoll僅僅要一次拷貝,並且把current往等待佇列上掛也僅僅掛一次(在epoll_wait的開始,注意這裡的等待佇列並非裝置等待佇列,僅僅是一個epoll內部定義的等待佇列)。

這也能節省不少的開銷。

C. select的幾大缺點:

每次呼叫select,都須要把fd集合從使用者態複製到核心態。這個開銷在fd非常多時會非常大;

同一時候每次呼叫select都須要在核心遍歷傳遞進來的全部fd,這個開銷在fd非常多時也非常大;

select支援的檔案描寫敘述符數量太小了,預設是1024.

D. poll的實現和select很相似。僅僅是描寫敘述fd集合的方式不同,描寫敘述符數量不受限制,poll使用pollfd結構而不是select的fd_set結構,其它的都差點兒相同。

 

15.談談對段頁式管理的認識?什麼時候會出現segment fault(段錯誤、缺頁異常)?

 

什麼是段頁式管理?參考:http://blog.csdn.net/xiucaijiang/article/details/6818359

(http://zhan.renren.com/h5/entry/3602888497996214030

事實上更好的解說在ULK3 page376:缺頁異常處理程式)

 引入段頁式管理的目的:為了獲得分段在邏輯上的長處和分頁在管理儲存空間方面的長處。

(1)用分段方法來分配和管理虛擬儲存器。把程式地址空間分成若干段,而每一段有自己的段名,把每一段分成若干頁。

(2)用分頁方法來分配和管理實存。

即把整個主存分成大小相等的儲存塊,可裝入作業的不論什麼一頁。

(3)邏輯地址結構的表示:一個邏輯地址用三個參數列示:段號S;頁號P;頁內地址d。

(4)段表、頁表、段表地址暫存器。為了進行地址轉換,系統為每個程式建立一個段表,而且要為該程式段表中的每個段建立一個頁表。系統中有一個段表地址暫存器來指出程式的段表起始地址和段表長度。

段頁式管理的優缺點:

 長處

 (1)它提供了大量的虛擬儲存空間。

 (2)能有效地利用主存。為組織多道程式執行提供了方便。

 缺點

 (1)新增了硬體成本、系統的複雜性和管理上的開消。

 (2)存在著系統發生抖動的危急。

 (3)存在著內碎片。

 (4)還有各種表格要佔用主存空間。

 段頁式儲存管理技術對當前的大、中型計算機系統來說。算是最通用、最靈活的一種方案。

什麼時候會出現segment fault?核心中的機制是什麼?

專業解釋請參考ULK3 page376:缺頁異常處理程式,哥如今還沒怎麼弄明確。

16.雜湊表用來做什麼?

雜湊表也叫雜湊表,依據key value對資料進行分組,用於高速插入和查詢

17.core檔案的實現原理是什麼?

請參考本部落格:

http://blog.csdn.net/xuzhina/article/category/1322964

這哥兒們寫了幾十篇文章講述core dump原理,我這裡就不c-c,c-v了

假設面試官問道。就這麼說吧(參考http://www.cnblogs.com/hazir/p/linxu_core_dump.html):

當程式執行的過程中異常終止或崩潰,作業系統會將程式當時的記憶體狀態記錄下來。儲存在一個檔案裡,這樣的行為就叫做Core Dump(中文有的翻譯成“核心轉儲”)。我們能夠覺得 core dump 是“記憶體快照”。但實際上,除了記憶體資訊之外。還有些關鍵的程式執行狀態也會同一時候 dump 下來,比如暫存器資訊(包含程式指標、棧指標等)、記憶體管理資訊、其它處理器和作業系統狀態和資訊。

core dump 對於程式設計人員診斷和除錯程式是非常有幫助的,由於對於有些程式錯誤是非常難重現的。比如指標異常,而 core dump 檔案能夠再現程式出錯時的情景。

18.fork返回0和大於0各自是程式?

返回值為0的是子程式。返回值大於0的是父程式,大於0的返回值為子程式的程式號,出錯返回-1
函式說明:一個現有程式能夠呼叫fork函式建立一個新程式。

由fork建立的新程式被稱為子程式(child process)。

fork函式被呼叫一次但返回兩次。兩次返回的唯一差別是子程式中返回0值而父程式中返回子程式ID。子程式是父程式的副本,它將獲得父程式資料空間、堆、棧等資源的副本。注意,子程式持有的是上述儲存空間的“副本”。這意味著父子程式間不共享這些儲存空間。它們之間共享的儲存空間僅僅有程式碼段。

19.程式執行時堆和棧用來做什麼?

BSS段 data段 text段 堆heap 和 棧stack

BSS段:BSS段(bss segment)一般是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。BSS是英文Block Started by Symbol的簡稱。BSS段屬於靜態記憶體分配。 
  
資料段:資料段(data segment)一般是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。資料段屬於靜態記憶體分配。

 
  
程式碼段:程式碼段(code segment/text segment)一般是指用來存放程式執行程式碼的一塊記憶體區域。這部分割槽域的大小在程式執行前就已經確定,而且記憶體區域通常屬於僅僅讀, 某些架構也同意程式碼段為可寫,即同意改動程式。在程式碼段中,也有可能包括一些僅僅讀的常數變數。比如字串常量等。 
  
堆(heap):堆是用於存放程式執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程式呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態加入到堆上(堆被擴張)。當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減) 
  
棧(stack):棧又稱堆疊,是使用者存放程式暫時建立的區域性變數,也就是說我們函式括弧“{}”中定義的變數(但不包含static宣告的變數,static意味著在資料段中存放變數)。

除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程式棧中。而且待到呼叫結束後,函式的返回值也會被存放回棧中。

因為棧的先進先出特點,所以棧特別方便用來儲存/恢復呼叫現場。

從這個意義上講,我們能夠把堆疊看成一個寄存、交換暫時資料的記憶體區。 

 

20. 執行緒和程式的差別?

(http://www.cnblogs.com/flashsky/articles/642720.html)

執行緒是指程式內的一個執行單元,也是程式內的可排程實體.
與程式的差別:
(1)地址空間:執行緒共享程式的地址空間;而程式有自己獨立的地址空間;
(2)資源擁有:執行緒共享程式的資源,程式是資源分配和擁有的單位
(3)執行緒是處理器排程的基本單位,但程式不是.
4)二者均可併發執行.

進一步展開:

程式和執行緒都是由作業系統所體會的程式執行的基本單元,系統利用該基本單元實現系統相應用的併發性。程式和執行緒的差別在於:

簡而言之,一個程式至少有一個程式,一個程式至少有一個執行緒. 
執行緒的劃分尺度小於程式,使得多執行緒程式的併發性高。

 
另外。程式在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。 
執行緒在執行過程中與程式還是有差別的。每一個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。

可是執行緒不可以獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。 
從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分能夠同一時候執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程式的排程和管理以及資源分配。這就是程式和執行緒的重要差別。

程式是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程式是系統進行資源分配和排程的一個獨立單位. 
執行緒是程式的一個實體,是CPU排程和分派的基本單位,它是比程式更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,僅僅擁有一點在執行中不可缺少的資源(如程式計數器,一組暫存器和棧),可是它可與同屬一個程式的其它的執行緒共享程式所擁有的所有資源. 
一個執行緒可以建立和銷燬,以及執行緒;您可以在同一程式中的多個執行緒之間併發執行.

版權宣告:本文部落格原創文章,部落格,未經同意,不得轉載。

相關文章