總結一些面試題

一、堆和棧的概念與區(qū)別
一個由C/C++編譯的程序占用的內存分為以下幾個部分
1、棧區(qū)(stack)——由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量值等。其操作方式類似于數(shù)據(jù)結構中的棧。
2、堆區(qū)(heap)——一般由程序員分配釋放,若程序員不釋放,程序結束時可能由操作系統(tǒng)回收。它與數(shù)據(jù)結構中的堆是兩回事,分配方式類似于鏈表。
3、全局區(qū)(靜態(tài)區(qū)、static)——全局變量和靜態(tài)變量的存儲是放在一塊兒的,初始化的全局變量和靜態(tài)變量放在一塊區(qū)域,未初始化的在另一塊區(qū)域,程序結束后由系統(tǒng)回收。
4、文字常量區(qū)——常量字符串就放在這里,程序結束后由系統(tǒng)釋放。
5、代碼區(qū)——存放二進制代碼。

申請方式
stack:由系統(tǒng)自動分配。
例如,聲明在函數(shù)中的局部變量 int a;
系統(tǒng)自動在棧中為a開辟空間。
heap:程序員自己申請,并且需要指定大小。
如調用c語言中的malloc函數(shù) p1=(char )malloc(sizeof(char)10);
但是需要注意 p1本身是在棧中。

申請后系統(tǒng)的響應
棧:只要棧的剩余空間大于所申請的空間,系統(tǒng)將為程序提供內存,否則將報異常提示棧溢出。
堆:首先操作系統(tǒng)有一個記錄空閑內存地址的鏈表,當系統(tǒng)接收到程序的申請時,會遍歷該鏈表,尋找第一個空間大于所申請空間的堆結點,然后將該結點從空閑節(jié)點鏈表中刪除,并將該結點的空間分配給程序,另外,對于大多數(shù)系統(tǒng),會在這塊內存空間中首地址處標記本次分配的大小,這樣,代碼中delete語句再能正確釋放該內存空間。另外,找到的空閑節(jié)點可能大于申請空間,系統(tǒng)會將多余部分重新放回空閑鏈表。

申請大小的閑置
棧:在Windows下,棧是向低地址擴展的數(shù)據(jù)結構,是一塊連續(xù)的內存區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預先規(guī)定好的,在Windows下,棧的大小是2M(也有的說是1M,總之是編譯時確定的常數(shù)),如果申請的空間超過棧的剩余空間,將提示stack over flow,因此,能從棧獲得的空間較小。
堆:堆是向高地址擴展的數(shù)據(jù)結構,是不確定的內存區(qū)域。這是由于系統(tǒng)用鏈表來存儲空閑的內存地址,自然是不連續(xù)的,而鏈表的遍歷方向是從低地址向高地址的。堆的大小受限于計算機系統(tǒng)中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,以比較大。

申請效率比較
棧由系統(tǒng)自動分配,速度較快,但程序員無法控制。
堆通過申請來分配,一般速度較慢,而且容易產生內存碎片,不過用起來方便。

存儲內容
棧:在函數(shù)調用時,第一個進棧的是主函數(shù)中后的下一條指令(函數(shù)調用語句的下一條可執(zhí)行語句)的地址,然后是函數(shù)的各個參數(shù),在大部分C編譯器中,參數(shù)是從右向左入棧的,然后是函數(shù)中的局部變量,(靜態(tài)變量不入棧),當函數(shù)調用結束后,局部變量先出棧,然后是參數(shù),最后是棧頂指針指向的最開始存的地址,就是主函數(shù)中的下一條指令,程序由該點繼續(xù)運行。
堆:一般在堆的頭部用一個字節(jié)存放堆的大小,具體內容由程序由安排。

二、線程和進程的概念以及它們的區(qū)別
1、線程是具有一定功能的程序關于某個數(shù)據(jù)集合上的一次運動,進程是系統(tǒng)進行資源調度和分配的一個獨立單位。
2、線程是進程的實體,是CPU調度和分配的基本代為,它是比進程更小的能獨立運行的基本單位。
3、進程作為資源分配的基本單位,作為其下屬的線程都可以享用其被分配到的資源,而且線程可以共享同一塊被分配的資源。而進程之間一般是不能分享彼此的資源的,進程要想相互通信,必須通過進程間相互通信的機制來完成。主要包括:管道、流管道、有名管道。信號量、信號、消息隊列、共享內容、套接字。
程序和進程的區(qū)別
程序是一個靜態(tài)的概念,它是指在計算機的文件系統(tǒng)中以文件形式存儲的一段可執(zhí)行代碼。而進程是一個動態(tài)的概念,它通常指操作系統(tǒng)里的一個程序在一個數(shù)據(jù)集合上一次運行過程的體現(xiàn)。即進程是程序的運行邏輯實際運行起來的載體。

三、什么是死鎖
在兩個或多個并發(fā)進程中,如果每個進程持有某種資源而又等待其他進程釋放它或它們現(xiàn)在保持著的資源,在未改變這種狀態(tài)之前都不能向前推進,稱這一組進程產生了死鎖。通俗的講就是兩個或多個進程無限期的阻塞。相互排斥的一種狀態(tài)。
死鎖產生的四個必要條件:
互斥條件:一個資源一次只能被一個進程使用。
請求與保持條件:一個進程請求資源而阻塞時,對已獲得的資源保持不放。
不剝奪條件:進程獲得的資源,在未完全使用完之前,不能強行剝奪。
循環(huán)等待條件:若干進程之間形成一種頭尾相接的環(huán)形等待資源關系。

解決死鎖的基本方式:一種是預防,即根本不讓死鎖產生。一種是解鎖,發(fā)生死鎖的情況后來解決。

四、進程的幾種狀態(tài)
就緒狀態(tài):進程已獲得除處理機以外的所需資源,等待分配處理機資源。
運行狀態(tài):占用處理機資源運行,處于此狀態(tài)的進程數(shù)小于等于CPU數(shù)。
阻塞狀態(tài):進程等待某種條件,在條件滿足之前無法執(zhí)行。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容