(1)快排是遞迴排序,為啥排序效率也挺高?
快排是通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。最壞情況下的複雜度和冒泡一樣,最好的情況複雜度為o(nlogn)
(2)對已經排序好的陣列實現二分查詢演算法
public static int binsearch(int srcarray, int start, int end, int key)if (start >= end) else if (key > srcarray[mid]) else if (key < srcarray[mid])
return -1;
}
(3)tcp協議屬於哪一層?特點是什麼?怎麼建立連線?
tcp是一種面向連線的、可靠的傳輸層協議;
tcp協議建立在不可靠的網路層ip協議之上,ip不能提供任何可靠性機制,tcp的可靠性完全由自己實現;
tcp採用的最基本的可靠性技術是:
確認與超時重傳
流量控制
tcp是網際網路中的傳輸層協議,使用三次握手協議建立連線。當主動方發出syn連線請求後,等待對方回答syn,ack。這種建立連線的方法可以防止產生錯誤的連線,tcp使用的流量控制協議是可變大小的滑動視窗協議。第一次握手:建立連線時,客戶端傳送syn包(seq=x)到伺服器,並進入syn_send狀態,等待伺服器確認。第二次握手:伺服器收到syn包,必須確認客戶的syn(ack=x+1),同時自己也送乙個syn包(seq=y),即syn+ack包,此時伺服器進入syn_recv狀態。第三次握手:客戶端收到伺服器的syn+ack包,向伺服器傳送確認包ack(ack=y+1),此包傳送完畢,客戶端和伺服器時入established狀態,完成三次握手。
(4)產生死鎖的原因?產生死鎖的條件和如何避免死鎖?
產生死鎖的原因主要是:
(1) 因為系統資源不足。
(2) 程序執行推進的順序不合適。
(3) 資源分配不當等。
如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則
就會因爭奪有限的資源而陷入死鎖。其次,程序執行推進順序與速度不同,也可能產生死鎖。
產生死鎖的四個必要條件:
(1) 互斥條件:乙個資源每次只能被乙個程序使用。
(2) 請求與保持條件:乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之
一不滿足,就不會發生死鎖。
死鎖的解除與預防:
理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和
解除死鎖。所以,在系統設計、程序排程等方面注意如何不讓這四個必要條件成立,如何確
定資源的合理分配演算法,避免程序永久佔據系統資源。此外,也要防止程序在處於等待狀態
的情況下占用資源。因此,對資源的分配要給予合理的規劃。
(5)輪詢和搶占式任務排程有什麼區別?
輪詢任務排程與搶占式任務排程的區別在於搶占式排程可以因為優先順序高的任務搶占cpu,而輪詢的不能。
(6)x86保護模式下的邏輯位址、實體地址和線性位址。
邏輯位址(logical address) 是指由程式產生的和段相關的偏移位址部分。例如,你在進行c語言指標程式設計中,能讀取指標變數本身值(&操作),實際上這個值就是邏輯位址,他是相對於你當前程序資料段的位址,不和絕對實體地址相干。只有在intel實模式下,邏輯位址才和實體地址相等(因為實模式沒有分段或分頁機制,cpu不進行自動位址轉換);邏輯也就是在intel保護模式下程式執行**段限長內的偏移位址(假定**段、資料段如果完全相同)。應用程式設計師僅需和邏輯位址打交道,而分段和分頁機制對你來說是完全透明的,僅由系統程式設計人員涉及。應用程式設計師雖然自己能直接操作記憶體,那也只能在作業系統給你分配的記憶體段操作。
線性位址(linear address) 是邏輯位址到物理位址變換之間的中間層。程式**會產生邏輯位址,或說是段中的偏移位址,加上相應段的基位址就生成了乙個線性位址。如果啟用了分頁機制,那麼線性位址能再經變換以產生乙個實體地址。若沒有啟用分頁機制,那麼線性位址直接就是實體地址。intel 80386的線性位址空間容量為4g(2的32次方即32根位址匯流排定址)。
實體地址(physical address) 是指出目前cpu外部位址匯流排上的定址物理記憶體的位址訊號,是如何位址變換的最終結果位址。如果啟用了分頁機制,那麼線性位址會使用頁目錄和頁表中的項變換成實體地址。如果沒有啟用分頁機制,那麼線性位址就直接成為實體地址了。
(7)cpu流水線是如何提高cpu效能的?
流水線是通過細化流水、提高主頻,使得在乙個機器週期內完成乙個甚至多個操作,其實質是以空間換取時間
(8)#define和typedef的區別是什麼?
1) #define是預處理指令,在編譯預處理時進行簡單的替換,不作正確性檢查,不關含義是否正確照樣帶入,只有在編譯已被展開的源程式時才會發現可能的錯誤並報錯。例如:
#define pi 3.1415926
程式中的:area=pi*r*r 會替換為3.1415926*r*r
如果你把#define語句中的數字9 寫成字母g 預處理也照樣帶入。
2)typedef是在編譯時處理的。它在自己的作用域內給乙個已經存在的型別乙個別名,但是you cannot use the typedef specifier inside a function definition。
3)typedef int * int_ptr;
與#define int_ptr int *
作用都是用int_ptr代表 int * ,但是二者不同,正如前面所說 ,#define在預處理 時進行簡單的替換,而typedef不是簡單替換 ,而是採用如同定義變數的方法那樣來宣告一種型別。也就是說;
//refer to (xzgyb(老達摩))
#define int_ptr int *
int_ptr a, b; //相當於int * a, b; 只是簡單的巨集替換
typedef int* int_ptr;
int_ptr a, b; //a, b 都為指向int的指標,typedef為int* 引入了乙個新的助記符
這也說明了為什麼下面觀點成立
//qunkangli(維護成本與程式設計師的創造力的平方成正比)
typedef int * pint ;
#define pint int *
那麼:const pint p ;//p不可更改,但p指向的內容可更改
const pint p ;//p可更改,但是p指向的內容不可更改。
pint是一種指標型別 const pint p 就是把指標給鎖住了 p不可更改
而const pint p 是const int * p 鎖的是指標p所指的物件。
3)也許您已經注意到#define 不是語句 不要在行末加分號,否則 會連分號一塊置換。
面試筆記3
有關函式宣告的空間問題 乙個函式在宣告後如果不寫函式體是不會分配空間的,所以實現這個函式也就相當於初始化函式這個變數,同時也就引申出了變數如果只宣告的話是不會分配的空間的?可以這麼認為,因為靜態變數跟全域性變數都是自動初始化為0的。另外在c語言中 void fun 等同於 void fun 在c 語...
面試筆記1
今天開始準備找實習了,開始準備實習的東西了。接下來開始寫今天看到的小知識。1.宣告,定義,初始化 宣告是指extern int i 定義是指int i 初始化int i 0 區別在於,宣告不分配儲存空間,在這裡編譯的時候是不管的,只有當需要用到i的時候才去檢查。定義的話,就分配一塊空間給它。初始化的...
實習面試筆記
fib資料庫事務隔離級別有4個 由低到高依次為 read uncommitted,讀到了未提交的事物,只是 add 還沒有 commit read committed,讀到了上一次的commit,也就是說還沒有更新 最新的commit repeatable read,保證讀取最新的 commit,為...