百度校園招聘 研發工程師筆試題(濟南站)

2021-06-25 07:14:17 字數 3053 閱讀 8685

一,簡答題(30分)

1,當前計算機系統一般會採用層次結構儲存資料,請介紹下典型計算機儲存系統一般分為哪幾個層次,為什麼採用分層儲存資料能有效提高程式的執行效率?(10分)

所謂儲存系統的層次結構,就是把各種不同儲存容量、訪問速度和**的儲存器按層次結構組成多層儲存器,並通過管理軟體和輔助硬體有機組合成統一的整體,使所存放的程式和資料按層次分布在各種儲存器中。目前,在計算機系統中通常採用**層次結構來構成儲存系統,主要由高速緩衝儲存器cache、主儲存器和輔助儲存器組成。

儲存系統多級層次結構中,由上向下分**,其容量逐漸增大,速度逐級降低,成本則逐次減少。整個結構又可以看成兩個層次:它們分別是主存一輔存層次和cache一主存層次。這個層次系統中的每一種儲存器都不再是孤立的儲存器,而是乙個有機的整體。它們在輔助硬體和計算機作業系統的管理下,可把主存一輔存層次作為乙個儲存整體,形成的可定址儲存空間比主儲存器空間大得多。由於輔存容量大,**低,使得儲存系統的整體平均**降低。由於cache的訪問速度可以和cpu的工作速度相媲美,故cache一主存層次可以縮小主存和cpu之間的速度差距,從整體上提高儲存器系統的訪問速度。儘管cache成本高,但由於容量較小,故不會使儲存系統的整體**增加很多。

綜上所述,乙個較大的儲存系統是由各種不同型別的儲存裝置構成,是乙個具有多級層次結構的儲存系統。該系統既有與cpu相近的速度,又有極大的容量,而成本又是較低的。其中快取記憶體解決了儲存系統的速度問題,輔助儲存器則解決了儲存系統的容量問題。採用多級層次結構的儲存器系統可以有效的解決儲存器的速度、容量和**之間的矛盾。 

2,unix/linux系統中殭屍程序是如何產生的?有什麼危害?如何避免?(10分)

乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下乙個稱為殭屍程序(zombie)的資料結構(系統呼叫exit,它的作用是使程序退出,但也僅僅限於將乙個正常的程序變成乙個殭屍程序,並不能將其完全銷毀)。

在linux程序的狀態中,殭屍程序是非常特殊的一種,它已經放棄了幾乎所有記憶體空間,沒有任何可執行**,也不能被排程,僅僅在程序列表中保留乙個位置,記載該程序的退出狀態等資訊供其他程序收集,除此之外,殭屍程序不再占有任何記憶體空間。它需要它的父程序來為它收屍,如果他的父程序沒安裝sigchld訊號處理函式呼叫wait或waitpid()等待子程序結束,又沒有顯式忽略該訊號,那麼它就一直保持殭屍狀態,如果這時父程序結束了,那麼init程序自動會接手這個子程序,為它收屍,它還是能被清除的。但是如果如果父程序是乙個迴圈,不會結束,那麼子程序就會一直保持殭屍狀態,這就是為什麼系統中有時會有很多的殭屍程序。

避免zombie的方法: 

1)在svr4中,如果呼叫signal或sigset將sigchld的配置設定為忽略,則不會產生僵死子程序。另外,使用svr4版的sigaction,則可設定sa_nocldwait標誌以避免子程序              僵死。 

linux中也可使用這個,在乙個程式的開始呼叫這個函式 signal(sigchld,sig_ign);  

2)呼叫fork兩次。

3)用waitpid等待子程序返回.

3,簡述unix/linux系統中使用socket庫編寫伺服器端程式的流程,請分別用對應的socket通訊函式表示(10分)

tcp socket通訊

伺服器端流程如下:

1.建立serversocket

2.初始化 serveraddr(伺服器位址)

3.將socket和serveraddr 繫結 bind

4.開始監聽 listen

5.進入while迴圈,不斷的accept接入的客戶端socket,進行讀寫操作write和read

6.關閉serversocket

客戶端流程:

1.建立clientsocket

2.初始化 serveraddr

3.鏈結到伺服器 connect

4.利用write和read 進行讀寫操作

5.關閉clientsocket

這個列表是乙個berkeley套接字api庫提供的函式或者方法的概要:

socket() 建立乙個新的確定型別的套接字,型別用乙個整型數值標識,並為它分配系統資源。

bind() 一般用於伺服器端,將乙個套接字與乙個套接字位址結構相關聯,比如,乙個指定的本地埠和ip位址。

listen() 用於伺服器端,使乙個繫結的tcp套接字進入監聽狀態。

connect() 用於客戶端,為乙個套接字分配乙個自由的本地埠號。 如果是tcp套接字的話,它會試圖獲得乙個新的tcp連線。

accept() 用於伺服器端。 它接受乙個從遠端客戶端發出的建立乙個新的tcp連線的接入請求,建立乙個新的套接字,與該連線相應的套接字位址相關聯。

send()和recv(),或者write()和read(),或者recvfrom()和sendto(), 用於往/從遠端套接字傳送和接受資料。

close() 用於系統釋放分配給乙個套接字的資源。 如果是tcp,連線會被中斷。

gethostbyname()和gethostbyaddr() 用於解析主機名和位址。

select() 用於修整有如下情況的套接字列表: 準備讀,準備寫或者是有錯誤。

poll() 用於檢查套接字的狀態。 套接字可以被測試,看是否可以寫入、讀取或是有錯誤。

getsockopt() 用於查詢指定的套接字乙個特定的套接字選項的當前值。

setsockopt() 用於為指定的套接字設定乙個特定的套接字選項。

二,演算法與程式設計題

1,使用c/c++編寫函式,實現字串反轉,要求不使用任何系統函式,且時間複雜度最小,函式原型:char* reverse_str(char* str)。(15分)

獲取首尾指標,然後將首尾指標指向的元素交換,將首指標指向下乙個,將尾指標指向前乙個,交換指標指向的元素,然後重複執行,直到首尾指標相遇。

2,給定乙個如下格式的字串(1,(2,3),(4,(5,6),7))括號內的元素可以是數字,也可以是另乙個括號,請實現乙個演算法消除巢狀的括號,比如把上面的表示式變成:(1,2,3,4,5,6,7),如果表示式有誤請報錯。(15分)

使用棧和佇列實現

好像當時懵了,太睏。就開始亂寫了。寫的是首先找出query_topic_info陣列和adwords_topic_info陣列的最大值,然後返回其乘積

百度2015校園招聘筆試題 研發工程師(西安站)

一 簡述題 1.請簡述tcp ip的三次握手和四次揮手?並解釋為何關閉連線需要四次揮手?2.作業系統的記憶體淘汰演算法有哪些?請列出並簡要說明?3.進行資料庫設計的時候需要遵循哪些正規化,請列出並說明?二 演算法與程式設計題 1.尋找乙個單項鍊表的中項,若存在兩個則返回前乙個,請列出演算法描述並給出...

百度2016研發工程師筆試題(六)

2016 研發工程師筆試題 六 的會話有四個過程,請選出不是的乙個 a.建立連線 b.發出響應資訊 c.發出請求資訊 d.傳輸資料 2.osi 參考模型中,網路層的主要功能是 a.路由選擇,擁塞控制與網路互連 b.提供可靠的端一端服務,透明地傳送報文 c.資料格式變換,資料加密與解密,資料壓縮與恢復...

百度2013研發工程師A筆試

1 動態鏈結庫和靜態鏈結庫的優缺點 動態鏈結的優點 1 不占用源程式 段,節省空間。2 使程式更容易更新。3 減少物理頁面的切入。4 增加程式的可擴充套件性 動態鏈結的缺點 1 效能損失 2 相容性問題 靜態鏈結的優點 1 裝載速度快。2 不存在版本相容的問題 靜態鏈結的缺點 1 體積問題 2 可擴...