程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 百度2014校園招聘-研發工程師筆試題(濟南站)

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

編輯:關於C語言

轉載自:http://blog.csdn.net/yaoyuandejiushizhu/article/details/11879047

一,簡答題(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分)

使用棧和隊列實現

SouthEast

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


本文出自 “驿落黃昏” 博客,請務必保留此出處http://yiluohuanghun.blog.51cto.com/3407300/1299814

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved