日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

百度2015校园招聘软件开发笔试题及答案

發(fā)布時間:2024/8/23 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 百度2015校园招聘软件开发笔试题及答案 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

簡單題(本題共30分)

請簡述Tcp-ip的3次握手以及4次揮手過程?并解釋為何關閉連接需要4次揮手(10分)

詳細答案參見TCP/IP協(xié)議三次握手與四次握手流程解析

  • TCP三次握手、四次揮手過程如下:

    通常情況下,一個正常的TCP連接,都會有三個階段:1、TCP三次握手; 2、數(shù)據(jù)傳送; 3、TCP四次揮手

    • SYN: (同步序列編號,Synchronize Sequence Numbers)該標志僅在三次握手建立TCP連接時有效。表示一個新的TCP連接請求。
    • ACK: (確認編號,Acknowledgement Number)是對TCP請求的確認標志,同時提示對端系統(tǒng)已經(jīng)成功接收所有數(shù)據(jù)。
    • FIN: (結束標志,FINish)用來結束一個TCP回話.但對應端口仍處于開放狀態(tài),準備接收后續(xù)數(shù)據(jù)。
  • 四次揮手的原因:

    這是因為服務端的LISTEN狀態(tài)下的SOCKET當收到SYN報文的建連請求后,它可以把ACK和SYN(ACK起應答作用,而SYN起同步作用)放在一個報文里來發(fā)送。但關閉連接時,當收到對方的FIN報文通知時,它僅僅表示對方?jīng)]有數(shù)據(jù)發(fā)送給你了;但未必你所有的數(shù)據(jù)都全部發(fā)送給對方了,所以你可以未必會馬上會關閉SOCKET,也即你可能還需要發(fā)送一些數(shù)據(jù)給對方之后,再發(fā)送FIN報文給對方來表示你同意現(xiàn)在可以關閉連接了,所以它這里的ACK報文和FIN報文多數(shù)情況下都是分開發(fā)送的。

  • 不能兩次握手連接的原因:

    3次握手完成兩個重要的功能,既要雙方做好發(fā)送數(shù)據(jù)的準備工作(雙方都知道彼此已準備好),也要允許雙方就初始序列號進行協(xié)商,這個序列號在握手過程中被發(fā)送和確認。

    現(xiàn)在把三次握手改成僅需要兩次握手,死鎖是可能發(fā)生的。作為例子,考慮計算機S和C之間的通信,假定C給S發(fā)送一個連接請求分組,S收到了這個分組,并發(fā)送了確認應答分組。按照兩次握手的協(xié)定,S認為連接已經(jīng)成功地建立了,可以開始發(fā)送數(shù)據(jù)分組。可是,C在S的應答分組在傳輸中被丟失的情況下,將不知道S是否已準備好,不知道S建立什么樣的序列號,C甚至懷疑S是否收到自己的連接請求分組。在這種情況下,C認為連接還未建立成功,將忽略S發(fā)來的任何數(shù)據(jù)分組,只等待連接確認應答分組。而S在發(fā)出的分組超時后,重復發(fā)送同樣的分組。這樣就形成了死鎖。

  • SYN攻擊

    在三次握手過程中,服務器發(fā)送SYN-ACK之后,收到客戶端的ACK之前的TCP連接稱為半連接(half-open connect).此時服務器處于Syn_RECV狀態(tài).當收到ACK后,服務器轉入ESTABLISHED狀態(tài).

    Syn攻擊就是 攻擊客戶端 在短時間內偽造大量不存在的IP地址,向服務器不斷地發(fā)送syn包,服務器回復確認包,并等待客戶的確認,由于源地址是不存在的,服務器需要不斷的重發(fā)直 至超時,這些偽造的SYN包將長時間占用未連接隊列,正常的SYN請求被丟棄,目標系統(tǒng)運行緩慢,嚴重者引起網(wǎng)絡堵塞甚至系統(tǒng)癱瘓。

    Syn攻擊是一個典型的DDOS攻擊。檢測SYN攻擊非常的方便,當你在服務器上看到大量的半連接狀態(tài)時,特別是源IP地址是隨機的,基本上可以斷定這是一次SYN攻擊.在Linux下可以如下命令檢測是否被Syn攻擊

    netstat -n -p TCP | grep SYN_RECV

    一般較新的TCP/IP協(xié)議棧都對這一過程進行修正來防范Syn攻擊,修改tcp協(xié)議實現(xiàn)。主要方法有SynAttackProtect保護機制、SYN cookies技術、增加最大半連接和縮短超時時間等.但是不能完全防范syn攻擊。

  • 2MSL TIME_WAIT狀態(tài)


    TIME_WAIT狀態(tài)的存在有兩個理由:(1)讓4次握手關閉流程更加可靠;4次握手的最后一個ACK是是由主動關閉方發(fā)送出去的,若這個ACK丟失,被動關閉方會再次發(fā)一個FIN過來。若主動關閉方能夠保持一個2MSL的TIME_WAIT狀態(tài),則有更大的機會讓丟失的ACK被再次發(fā)送出去。(2)防止lost duplicate對后續(xù)新建正常鏈接的傳輸造成破壞。lost duplicate在實際的網(wǎng)絡中非常常見,經(jīng)常是由于路由器產生故障,路徑無法收斂,導致一個packet在路由器A,B,C之間做類似死循環(huán)的跳轉。IP頭部有個TTL,限制了一個包在網(wǎng)絡中的最大跳數(shù),因此這個包有兩種命運,要么最后TTL變?yōu)?,在網(wǎng)絡中消失;要么TTL在變?yōu)?之前路由器路徑收斂,它憑借剩余的TTL跳數(shù)終于到達目的地。但非常可惜的是TCP通過超時重傳機制在早些時候發(fā)送了一個跟它一模一樣的包,并先于它達到了目的地,因此它的命運也就注定被TCP協(xié)議棧拋棄。另外一個概念叫做incarnation connection,指跟上次的socket pair一摸一樣的新連接,叫做incarnation of previous connection。lost duplicate加上incarnation connection,則會對我們的傳輸造成致命的錯誤。大家都知道TCP是流式的,所有包到達的順序是不一致的,依靠序列號由TCP協(xié)議棧做順序的拼接;假設一個incarnation connection這時收到的seq=1000, 來了一個lost duplicate為seq=1000, len=1000, 則tcp認為這個lost duplicate合法,并存放入了receive buffer,導致傳輸出現(xiàn)錯誤。通過一個2MSL TIME_WAIT狀態(tài),確保所有的lost duplicate都會消失掉,避免對新連接造成錯誤。

    該狀態(tài)為什么設計在主動關閉這一方:
    (1)發(fā)最后ack的是主動關閉一方
    (2)只要有一方保持TIME_WAIT狀態(tài),就能起到避免incarnation connection在2MSL內的重新建立,不需要兩方都有

    如何正確對待2MSL TIME_WAIT

    RFC要求socket pair在處于TIME_WAIT時,不能再起一個incarnation connection。但絕大部分TCP實現(xiàn),強加了更為嚴格的限制。在2MSL等待期間,socket中使用的本地端口在默認情況下不能再被使用。若A 10.234.5.5:1234和B 10.55.55.60:6666建立了連接,A主動關閉,那么在A端只要port為1234,無論對方的port和ip是什么,都不允許再起服務。顯而易見這是比RFC更為嚴格的限制,RFC僅僅是要求socket pair不一致,而實現(xiàn)當中只要這個port處于TIME_WAIT,就不允許起連接。這個限制對主動打開方來說是無所謂的,因為一般用的是臨時端口;但對于被動打開方,一般是server,就悲劇了,因為server一般是熟知端口。比如http,一般端口是80,不可能允許這個服務在2MSL內不能起來。解決方案是給服務器的socket設置SO_REUSEADDR選項,這樣的話就算熟知端口處于TIME_WAIT狀態(tài),在這個端口上依舊可以將服務啟動。當然,雖然有了SO_REUSEADDR選項,但sockt pair這個限制依舊存在。比如上面的例子,A通過SO_REUSEADDR選項依舊在1234端口上起了監(jiān)聽,但這時我們若是從B通過6666端口去連它,TCP協(xié)議會告訴我們連接失敗,原因為Address already in use.

  • 操作系統(tǒng)的內存管理淘汰算法有哪些,請列出并簡要說明?(10分)

    進程運行時,若其訪問的頁面不在內存而需將其調入,但內存已無空閑空間時,就需要從內存中調出一頁程序或數(shù)據(jù),送入磁盤的兌換區(qū)。選擇調出頁面的算法就稱為頁面置換算法。好的頁面置換算法應有較低的頁面更換頻率。

    • 最佳(OPT)置換算法是理論算法,它將不再使用的頁面換出,而實際中不能預知哪個頁面不再使用,但是這個算法是最優(yōu)算法,可以作為評測其他算法的性能。
    • 先進先出(FIFO)置換算法優(yōu)先淘汰最先進入內存中的頁面。該算法實現(xiàn)簡單,但算法跟內存的實際運行規(guī)律不符,不管該頁面是否經(jīng)常使用,這樣就有可能導致缺頁率增加,導致頁面置換次數(shù)增加。
    • 最近最少(LRU:least recently used)使用置換算法當需要淘汰某頁,選擇離當前時間最近的一段時間內最久沒有使用過的頁先淘汰。在這里采用一個頁面集大小的棧存儲最近訪問的頁面。頁面按時間順序壓如棧中。如果被訪問的頁在棧中,則從棧中移出頁面,壓入棧頂。這樣棧底記錄離當前時間最近的一段時間內最久沒有使用過的頁。
    • 最不經(jīng)常使用(LFU:least frequently used)置換算法 LFU在需要淘汰某一頁時,首先淘汰到當前時間為止、被訪問次數(shù)最少的那一頁。這只要在頁面集中給每一頁增設一個訪問計數(shù)器即可實現(xiàn)。每當該頁被訪問時,訪問計數(shù)器加1,而發(fā)生一次缺頁中斷時,則淘汰計數(shù)值最小的那一頁,并將所有的計數(shù)器清零。
    • 最近最不經(jīng)常使用(NRU:not recently used)算法 NRU在需要淘汰某一頁時,從那些最近一個時期內未被訪問的頁中任選一頁淘汰。只要在頁表中增設一個訪問位即可實現(xiàn)。當某頁被訪問時,訪問位置1。否則,訪問位置0。系統(tǒng)周期性地對所有引用位清零。當需淘汰一頁時,從那些訪問位為零的頁中選一頁進行淘汰。如果引用位全0或全1,NRU算法退化為FIFO算法。

    詳解可參照:操作系統(tǒng)內存管理淘汰算法的實現(xiàn) 和 內存管理的頁面置換算法有哪些

    進行數(shù)據(jù)庫設計時通常需要遵守哪些范式,請列舉并說明?(10分)

    設計關系數(shù)據(jù)庫時,遵從不同的規(guī)范要求,設計出合理的關系型數(shù)據(jù)庫,這些不同的規(guī)范要求被稱為不同的范式,各種范式呈遞次規(guī)范,越高的范式數(shù)據(jù)庫冗余越小。

    目前關系數(shù)據(jù)庫有六種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,還又稱完美范式)。

    • 第一范式 所有的域都應該是原子性的,即數(shù)據(jù)庫表的每一列都是不可分割的原子數(shù)據(jù)項,而不能是集合,數(shù)組,記錄等非原子數(shù)據(jù)項。即實體中的某個屬性有多個值時,必須拆分為不同的屬性。在符合第一范式(1NF)表中的每個域值只能是實體的一個屬性或一個屬性的一部分。簡而言之,第一范式就是無重復的域。
    • 第二范式要求實體的屬性完全依賴于主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那么這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關系。為實現(xiàn)區(qū)分通常需要為表加上一個列,以存儲各個實例的唯一標識。簡而言之,第二范式就是在第一范式的基礎上屬性完全依賴于主鍵。
    • 第三范式 在1NF基礎上,任何非主屬性不依賴于其它非主屬性[在2NF基礎上消除傳遞依賴]

    詳細講解參見數(shù)據(jù)庫范式

    算法與程序設計題(本題共45分)

    尋找一個簡單鏈表的中項,如果存在兩個則返回前一個.請給出算法描述并給出代碼(15分)

    分析:可以借助于兩個指針,快慢指針,快指針一次走兩步,慢指針一次走一步,當快指針走到尾端時,慢指針即指向中項位置。空間復雜度為0(1)時間復雜度為O(n).

    struct ListNode {struct ListNode *next;int key; };ListNode* getMID(ListNode* head) {if (NULL == head)return NULL;ListNode *first = head;ListNode *second = head;while(NULL != second->next){if(NULL == second->next->next)break;first = first->next;second = second->next->next;}return first; }

    拓展:借助快慢指針,可以判斷單向鏈表中是否有環(huán),依據(jù)就是如果有環(huán),快指針與慢指針總會相遇

    在由N個正數(shù)的集合S中:找出最大元素C,滿足C=A+B,其中A,B都是集合S中元素.請給出算法描述、代碼與時間復雜度分析(15分)

    算法步驟:

  • 首先對集合進行排序,從小到大排序,可以選擇排序算法較快的快速|歸并|堆排序,n?log(n)復雜度
  • 找最大滿足條件的元素C。兩層循環(huán),外層循環(huán)從大到小依次尋找C。內層循環(huán),分別從頭尾向中間尋找元素A B,是的 C = A + B,找到后即跳出兩層循環(huán)。時間復雜度O(n2)
  • 程序復雜度為O(n2)

    int FindSum(int A[],int n){sort(A,A+n);int left,right,sum;for(int i = n - 1;i >= 2;--i){left = 0,right = i - 1;while(left < right){sum = A[left] + A[right];if(sum == A[i]){return A[i];}else if(sum > A[i]){--right;}else{++left;}}}return -1; }

    使用堆棧(Stack)來模擬隊列(FIFO)功能,要求數(shù)據(jù)必須存儲在堆棧內部.需要實現(xiàn)enqueue(入棧),dequeue(出棧),isEmpty(判空)三個功能,并給出單元測試.(15分)

    思路:兩個堆棧實現(xiàn)隊列
    s1為入棧的,s2為出棧的
    1. 入隊列:直接壓入s1即可
    2. 出隊列:如果s2不為空,把s2中的棧頂元素直接彈出;否則,把s1的所有元素全部彈出壓入s2中,再彈出s2的棧頂元素.

    stack<int> A; stack<int> B; //入隊 void enqueue(int value[],int len) {for (int i = 0; i < len; i++){A.push(value[i]);}if (B.empty()){while(!A.empty()){B.push(A.top());A.pop();}} } 出隊 void dequeue() {while(!B.empty()){B.pop();//其他操作} while(!A.empty()){B.push(A.top());A.pop();}while(!B.empty()){B.pop();//其他操作} } //判斷是否為空 bool isEmpty() {return (A.empty() && B.empty()); }

    拓展:通過隊列實現(xiàn)棧

    兩個隊列A與B,兩個隊列指針,指針qQueue指向一個非空隊列(當然如果A、B都是空的話,指向其一),指針tmp始終指向另外一個空隊列
    1. 入棧: 直接進入qQueue指向的隊列;
    2. 出棧: qQueue指向的隊列是否為空,非空時,將其指向的隊列數(shù)據(jù)移動pop到tmp指向的隊列,獲取最后一個數(shù)據(jù)即可,交換qQueue與tmp。

    詳細講解參見兩個棧實現(xiàn)隊列 兩個隊列實現(xiàn)棧

    系統(tǒng)設計題(本題共25分)

    手機推送服務設計,在各個手機端應用都有一定的云控制能力,可以再某些情況下云端發(fā)送各種數(shù)據(jù)或者命令道手機端,例如發(fā)送一個強制升級的命令或者手機app配置變換的數(shù)據(jù)包,以及發(fā)送一個信息給特定人群(某個地區(qū))
    請設計一個以長鏈接為主的云端控制服務,為了聚焦主要問題,可以忽略掉低速手機網(wǎng)絡(例如:2g網(wǎng)絡)手機終端等因素\用戶登錄的需求.服務需要承擔定向、定量的推送需求,在設計中要盡量高的吞吐能力和容錯能力。
    需要完成
    a)基本的模塊視圖
    b)鏈接管理主要設計思路。單臺機器承擔更多鏈接,但是鏈接多了后管理鏈接(鏈接中斷、鏈接查找)都會出現(xiàn)性能瓶頸,請嘗試給出思路。
    c)嘗試給出提高容錯能力(避免因為某臺物理機器或者某個機器上的程序掛掉導致整個系統(tǒng)不可用)的思路

    后續(xù)分析…

    參考:

    • http://www.cnblogs.com/newpanderking/p/3972280.html
    • 深入淺出TCP協(xié)議的2MSL TIME_WAIT狀態(tài)
    • Linux中TCP連接過程簡介

    總結

    以上是生活随笔為你收集整理的百度2015校园招聘软件开发笔试题及答案的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。