天天看點

計算機專業面試題

1、加載一張1024*1024大小的圖檔要占用多少記憶體?

答:圖像占用記憶體的公式是:numbytes = width * height * bitsperpixel / 8

如果是黑白圖檔:1024*1024*8/8

如果是彩色圖檔,則一個像素記憶體是3位元組 :1024*1024*24/8

opengl es  紋理的寬和高都要是2次幂數, 假如 start.png本身是 480x320, 但在載入記憶體後, 它其實會被變成一張 512x512 的紋理, 而start.png 則由 101x131 變成 128x256, 預設情況下面,當你在cocos2d裡面加載一張圖檔的時候,對于每一個像素點使用4個byte來表示--1個byte(8位)代表red,另外3個byte分别代表green、blue和alpha透明通道。這個就簡稱rgba8888

在ios上,圖檔會被自動縮放到2的n次方大小。比如一張1024*1025的圖檔,占用的記憶體與一張1024*2048的圖檔是一緻的。圖檔占用記憶體大小的計算的公式是;長*寬*4,是以一張512×512的圖檔,當你使用預設的像素格式去加載它的話,那麼将耗費的記憶體為:512×512×4=1mb

2、tcp/ip三次握手與四次揮手?

注:标志位标示:syn(建立連接配接),ack(确認),psh(push傳送),fin(finish結束),rst(reset重置),urg(urgent緊急)

答:所謂三次握手(three-way handshake)即建立tcp連接配接,就是指建立一個tcp連接配接時,需要用戶端和服務端總共發送3個包以确認連接配接的建立。在socket程式設計中,這一過程由用戶端執行connect來觸發,整個流程如下圖所示:

計算機專業面試題

        (1)第一次握手:client将标志位syn置為1,随機産生一個值seq=j,并将該資料包發送給server,client進入syn_sent狀态,等待server确認。

        (2)第二次握手:server收到資料包後由标志位syn=1知道client請求建立連接配接,server将标志位syn和ack都置為1,ack=j+1,随機産生一個值seq=k,并将該資料包發送給client以确認連接配接請求,server進入syn_rcvd狀态。

        (3)第三次握手:client收到确認後,檢查ack是否為j+1,ack是否為1,如果正确則将标志位ack置為1,ack=k+1,并将該資料包發送給server,server檢查ack是否為k+1,ack是否為1,如果正确則連接配接建立成功,client和server進入established狀态,完成三次握手,随後client與server之間可以開始傳輸資料了。

        syn攻擊:

                在三次握手過程中,server發送syn-ack之後,收到client的ack之前的tcp連接配接稱為半連接配接(half-open connect),此時server處于syn_rcvd狀态,當收到ack後,server轉入established狀态。syn攻擊就是client在短時間内僞造大量不存在的ip位址,并向server不斷地發送syn包,server回複确認包,并等待client的确認,由于源位址是不存在的,是以,server需要不斷重發直至逾時,這些僞造的syn包将産時間占用未連接配接隊列,導緻正常的syn請求因為隊列滿而被丢棄,進而引起網絡堵塞甚至系統癱瘓。syn攻擊時一種典型的ddos攻擊,檢測syn攻擊的方式非常簡單,即當server上有大量半連接配接狀态且源ip位址是随機的,則可以斷定遭到syn攻擊了,使用如下指令可以讓之現行:

                #netstat -nap | grep syn_recv

      所謂四次揮手(four-way wavehand)即終止tcp連接配接,就是指斷開一個tcp連接配接時,需要用戶端和服務端總共發送4個包以确認連接配接的斷開。在socket程式設計中,這一過程由用戶端或服務端任一方執行close來觸發,整個流程如下圖所示:

計算機專業面試題

        由于tcp連接配接時全雙工的,是以,每個方向都必須要單獨進行關閉,這一原則是當一方完成資料發送任務後,發送一個fin來終止這一方向的連接配接,收到一個fin隻是意味着這一方向上沒有資料流動了,即不會再收到資料了,但是在這個tcp連接配接上仍然能夠發送資料,直到這一方向也發送了fin。首先進行關閉的一方将執行主動關閉,而另一方則執行被動關閉,上圖描述的即是如此。

        (1)第一次揮手:client發送一個fin,用來關閉client到server的資料傳送,client進入fin_wait_1狀态。

        (2)第二次揮手:server收到fin後,發送一個ack給client,确認序号為收到序号+1(與syn相同,一個fin占用一個序号),server進入close_wait狀态。

        (3)第三次揮手:server發送一個fin,用來關閉server到client的資料傳送,server進入last_ack狀态。

        (4)第四次揮手:client收到fin後,client進入time_wait狀态,接着發送一個ack給server,确認序号為收到序号+1,server進入closed狀态,完成四次揮手。

        上面是一方主動關閉,另一方被動關閉的情況,實際中還會出現同時發起主動關閉的情況,具體流程如下圖:

計算機專業面試題

3、c++虛函數與普通成員函數有什麼差別?

答:虛函數是隻定義不實作,普通函數既定義又實作;虛函數能被派生類重寫。

4、講述一下快速排序(快排)的原理?

答、高快省的排序算法,假設我們現在對“6  1  2 7  9  3  4  5 10  8”這個10個數進行排序。首先在這個序列中随便找一個數作為基準數(不要被這個名詞吓到了,就是一個用來參照的數,待會你就知道它用來做啥的了)。為了友善,就讓第一個數6作為基準數吧。接下來,需要将這個序列中所有比基準數大的數放在6的右邊,比基準數小的數放在6的左邊,類似下面這種排列:

3  1  2 5  4  6  9 7  10  8

在初始狀态下,數字6在序列的第1位。我們的目标是将6挪到序列中間的某個位置,假設這個位置是k。現在就需要尋找這個k,并且以第k位為分界點,左邊的數都小于等于6,右邊的數都大于等于6。想一想,你有辦法可以做到這點嗎?

排序算法顯神威

方法其實很簡單:分别從初始序列“6  1  2 7  9  3  4  5 10  8”兩端開始“探測”。先從右往左找一個小于6的數,再從左往右找一個大于6的數,然後交換他們。這裡可以用兩個變量i和j,分别指向序列最左邊和最右邊。我們為這兩個變量起個好聽的名字“哨兵i”和“哨兵j”。剛開始的時候讓哨兵i指向序列的最左邊(即i=1),指向數字6。讓哨兵j指向序列的最右邊(即=10),指向數字。

計算機專業面試題

首先哨兵j開始出動。因為此處設定的基準數是最左邊的數,是以需要讓哨兵j先出動,這一點非常重要(請自己想一想為什麼)。哨兵j一步一步地向左挪動(即j--),直到找到一個小于6的數停下來。接下來哨兵i再一步一步向右挪動(即i++),直到找到一個數大于6的數停下來。最後哨兵j停在了數字5面前,哨兵i停在了數字7面前。

計算機專業面試題

現在交換哨兵i和哨兵j所指向的元素的值。交換之後的序列如下:

6  1  2  5  9 3  4  7  10  8

計算機專業面試題
計算機專業面試題

到此,第一次交換結束。接下來開始哨兵j繼續向左挪動(再友情提醒,每次必須是哨兵j先出發)。他發現了4(比基準數6要小,滿足要求)之後停了下來。哨兵i也繼續向右挪動的,他發現了9(比基準數6要大,滿足要求)之後停了下來。此時再次進行交換,交換之後的序列如下:

6  1  2 5  4  3  9  7 10  8

第二次交換結束,“探測”繼續。哨兵j繼續向左挪動,他發現了3(比基準數6要小,滿足要求)之後又停了下來。哨兵i繼續向右移動,糟啦!此時哨兵i和哨兵j相遇了,哨兵i和哨兵j都走到3面前。說明此時“探測”結束。我們将基準數6和3進行交換。交換之後的序列如下:

3  1 2  5  4  6  9 7  10  8

計算機專業面試題

到此第一輪“探測”真正結束。此時以基準數6為分界點,6左邊的數都小于等于6,6右邊的數都大于等于6。回顧一下剛才的過程,其實哨兵j的使命就是要找小于基準數的數,而哨兵i的使命就是要找大于基準數的數,直到i和j碰頭為止。

後面分别遞歸進行排序……

5、講述一下tcp/ip資料的傳輸過程 ?

答、當你把要傳送的資料傳遞給tcp後,tcp把這些資訊分成很多個資料包(這種資料包稱為tcp分組),每一個分組都包含有一個序号。接着tcp分組被傳遞給ip層,ip層把這個tcp分組放在一個ip資料包的資料部分。然後,這個ip資料包被傳到目的主機。目的主機上的ip層,把ip資料包的資料部分(即tcp分組)傳遞給tcp層。tcp接收到分組後,檢查資料包的正确性,如果不正确,通知源計算機重新送該ip包。利用分組的序号來将資料按照原來的順序排列,然後送給應用層。換句話說,ip的工作是把原始資料(資料包)從一地傳送到另一地;tcp的工作是管理這種流動并確定其資料是正确的。在ip層,資訊不是一個恒定的流,而是一個個小的資料包,這種資料包稱為ip資料報。所有要發送的資訊都必須被拆成ip資料包,才能在ip網上傳送。ip資料報中最主要的内容有:源計算機的位址資訊、目的計算機的位址資訊、要傳輸的資料。當發送一個資料包時,計算機首先根據目的位址決定将其發送給誰,如果目的計算機與源計算機在同一個實體網絡中,則直接将這個資料報發送給它。如果目的計算機與源計算機不在同一個實體網絡中,則發送給路由器,路由器這個特殊的計算機連在了兩個網絡之中,是以可以同時與兩個網絡中的計算機通信。路由器在收到資料包後,根據目的位址決定是直接發給目的計算機(如果在同一個實體網絡中),還是轉發給另一台計算機(如果不在同一個實體網絡中)。 

6、c++中有了malloc/free,為什麼還需要new/deltet?

答:malloc 與free 是c++/c 語言的标準庫函數,new/delete 是c++的運算符。它們都可用于申請動态記憶體和釋放記憶體。對于非内部資料類型的對象而言,光用maloc/free 無法滿足動态對象的要求。對象在建立的同時要自動執行構造函數, 對象在消亡之前要自動執行析構函數。由于malloc/free 是庫函數而不是運算符,不在編譯器控制權限之内,不能夠把執行構造函數和析構函數的任務強加于malloc/free。是以c++語言需要一個能完成動态記憶體配置設定和初始化工作的運算符new,以及一個能完成清理與釋放記憶體工作的運算符delete。注意new/delete 不是庫函數。

繼續閱讀