LINUX應用開發工程師職位(含答案)


就業模擬測試題-LINUX應用開發工程師職位

本試卷從考試酷examcoo網站導出,文件格式為mht,請用WORD/WPS打開,並另存為doc/docx格式后再使用

試卷編號:143989
試卷錄入者:yisonghua(遠見)
試卷總分:118
出卷時間:2012-09-12 18:23
答題時間:150分鍾
姓名: 學號: 班級:

說明:應用開發可考察的點非常多,關鍵的還是C語言和數據結構,此份試卷中包括了一部分的基本C語言,數據結構和SHELL編程沒有涉及,請各位下來再精心准備C語言和數據結構,也了解一下shell編程(課件已經共享到考試酷班級空間里面),多看《程序員面試寶典》和一些經典的面試題。此份試卷中的分數表示的作用是“相應知識點的重要程度”,5分題是必須掌握的,其他的相應重要性依次降低。
1.寫一個"標准"宏MIN ,這個宏輸入兩個參數並返回較小的一個。[5分]

參考答案:
#define MIN(A,B) ((A) <= (B) ? (A) : (B))
解析:
這個測試是為下面的目的而設的:
1) 標識#define在宏中應用的基本知識。這是很重要的。因為在 嵌入(inline)操作符 變為標准C的一部分之前,宏是方便產生嵌入代碼的唯一方法,對於嵌入式系統來說,為了能達到要求的性能,嵌入代碼經常是必須的方法。
2)三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能產生比if-then-else更優化的代碼,了解這個用法是很重要的。
3) 懂得在宏中小心地把參數用括號括起來

2.用預處理指令#define 聲明一個常數,用以表明1年中有多少秒[2分]

參考答案:
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
解析:
) #define 語法的基本知識(例如:不能以分號結束,括號的使用,等等)
2)懂得預處理器將為你計算常數表達式的值,因此,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。
3) 意識到這個表達式將使一個16位機的整型數溢出-因此要用到長整型符號L,告訴編譯器這個常數是的長整型數。
4) 如果你在你的表達式中用到UL(表示無符號長整型),那么你有了一個好的起點。記住,第一印象很重要

3.以下3個關鍵詞,記得不要完全照搬網上的說法,加上自己的一點自己的理解和整理

static有什么用途?(請至少說明兩種)[5分]

參考答案:
在C語言中,關鍵字static有三個明顯的作用:
1)在函數體,一個被聲明為靜態的變量在這一函數被調用過程中維持其值不變。
2) 在模塊內(但在函數體外),一個被聲明為靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。
3) 在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地范圍內使用。

4.關鍵字const有什么含意?[5分]

參考答案:
《程序員面試寶典》中是這樣說的:
1.定義const常量
2.const可以修飾函數的參數和返回值,在C++中,還可以修飾函數的定義體
被const修飾的東西都受到保護,可以防止意外的改動,能提高程序的健壯性
擴展:
下面聲明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
/******/
前兩個的作用是一樣,a是一個常整型數
第三個意味着a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以)
第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)
最后一個意味着a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)

5.關鍵字volatile有什么含意?並給出三個不同的例子?[5分]

參考答案:
優化器在用到這個變量時必須每次重新從內存去讀寫這個變量的值,而不是使用保存在cache中數據。
下面是volatile變量的幾個例子:
1、中斷服務程序中修改的供其它程序檢測的變量需要加volatile;
2、多任務環境下各任務間共享的標志應該加volatile;
3、存儲器映射的硬件寄存器通常也要加volatile說明,因為每次對它的讀寫都可能由不同意義;

6.解釋下面a的含義:
a) int a; 一個整型數
b) int *a; 一個指向整型數的指針
c) int **a; 一個指向指針的的指針,它指向的指針是指向一個整型數
d) int a[10]; 一個有10個整型數的數組
e) int *a[10]; 一個有10個指針的數組,該指針是指向一個整型數的
f) int (*a)[10]; 一個指向有10個整型數數組的指針
g) int (*a)(int); 一個指向函數的指針,該函數有一個整型參數並返回一個整型數
h)int (*a[10])(int); 一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數 [每空1分]


7.已知:
char str[] = "farsight";
char *p = malloc( 100 );
int n = 10;
void Foo ( char var[100]){}
請計算
sizeof (str ) = 9
sizeof ( p ) = 4
sizeof ( n ) = 4
sizeof ( var ) = 4 [每空1分]


8.嵌入式系統總是要用戶對變量或寄存器進行位操作。給定一個整型變量a,寫兩段代碼,第一個設置a的bit 3,第二個清除a 的bit 3。在以上兩個操作中,要保持其它位不變。[5分]

參考答案:
volatile unsigned int *a;

*a |=(1<<3);
*a &= ~(1<<3);

9.請說說進程和線程的差別?[5分]

參考答案:
進程是系統資源(比如打開的文件描述,信號等)管理的最小單位,線程是最小的執行單位.linux中用戶空間的進程,線程對LINUX內核來說,都是任務 
 線程與進程的區別: 
  (1)調度:線程作為調度和分配的基本單位,進程作為擁有資源的基本單位 
 (2)並發性:不僅進程之間可以並發執行,同一個進程的多個線程之間也可並發執行  
(3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有獨立餓系統資源,但可以訪問隸屬於進程的資源.  
(4)系統開銷:在創建或撤消進程時,由於系統都要為之分配和回收資源,導致系統的開銷明顯大於創建或撤消線程時的開銷。


10.進程間通訊有幾種方式,各有特點?[5分]

參考答案:
A:進程間通信IPC包括6種,分別是:管道、消息隊列、共享內存、信號量、信號、SOCKET域套接字
管道: 是存在於內存中的特殊文件,不支持lseek操作,是一種半雙工通信,有固定的讀端和寫端,它分為無名管道和有名管道,無名管道可用於具有親緣關系的進程間通信,有名管道則除無名管道特點外,還可用於無親緣關系的進程間通信。
信號:一種異步通信方式,不僅可用於用戶進程/線程之間,也可用於內核與用戶進程/線程之間,信號的處理速度快於其它IPC,其編程方法是通過安裝信號處理函數(句柄)進行。
消息隊列、共享內存、信號量都是一種IPC對象,是一種資源,都是通過鍵值獲取一個資源號。消息隊列使用簡單,效率最低;共享內存是將內存中的一段內存隱射到用戶空間,使用效率最高,但其對數據的保護需要借助信號量進行;
信號量(semaphore),也叫信號量是用於不同進程或一個給定進程中不同線程同步的手段
SOCKET域套接字:通過網絡socket編程接口實現進程間通信。

11.線程的資源保護機制,各有什么特點?[5分]

參考答案:
線程間資源保護機制包括3種:無名信號量、互斥鎖、條件變量。
無名信號量常用與對線程間一個或多個資源訪問的進行互斥或同步,和它類似的還有進程間的信號量(有名信號量),但用於線程時無名信號量的效率比較高
互斥鎖常用於對線程間一個資源訪問的進行互斥,防止多個線程同一時刻訪問共同的資源
條件變量 以互斥鎖為基礎,它實現線程間同步的機制

12.LINUX應用開發中如果保證一個程序在系統中只有唯一的一個實例在運行?
提示: 參考進程課程中守護進程代碼中的文件鎖[3分]

參考答案:
最佳解決方法:采用對特定文件的一部分加上記錄鎖的方式。
void test_to_locked (){
int fd;
struct flock lock;
char *buf = "abdcefghijklmnopqrstuvwxyz";
//begin to test file lock
fd = open ("/tmp/mylock.lock", O_RDWR | O_CREAT, 0777);
if (fd < 0) {
perror ("Open file error");
exit (1);
}
write (fd, buf, strlen (buf));
fsync (fd);
//file be locked?
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 10;
lock.l_type = F_WRLCK;
lock.l_pid = -1;
if (fcntl (fd, F_GETLK, &lock) < 0) {
perror ("fcntl failed!");
exit (1);
}//
if(lock.l_type == F_WRLCK)
if (lock.l_type != F_UNLCK) {
printf ("have a daemon. so quit!\n");
exit (1);
}
//locked file
lock.l_type = F_WRLCK;
if (fcntl (fd, F_SETLKW, &lock) < 0) {
printf ("Lock file failed: type = %d\n", lock.l_type);
exit (1);
}
printf ("xxx program have runned\n");}

13.(擴展)描述實時系統的基本特性?常見的實時系統有哪些?LINUX是否是實時系統?如何提高LINUX系統和應用的實時性?[4分]

參考答案:
實時系統(Real Time Operating System)的定義:
實時系統是指規定的時限內必須完成規定的操作做出相應響應的系統。系統行為的具有可預測性,意思是實時操作系統面對變化的負載(從最小到最壞的情況)時必須確定性地保證滿足時間要求。請注意,它是指必須要滿足時間響應的確定性,而不是指速度的快慢!
實時系統根據實時不滿足時候帶來的后果不同,分為:
硬實時:超過時限完成任務會導致災難性后果
軟實時:超過時限完成對任務會帶來系統性能的嚴重下降
評價一個操作系統實時性好壞的三大性能指標是:搶占延遲、中斷延遲、調度延遲
常見的硬實時系統有Vxworks, ucos-II/III, FreeRTOS,Wince(4.0以上版本),threadX等.標准的LINUX不是實時系統。
LINUX系統級的實時性提高主要有2種方式:
增加一層硬實時系統,把標准LINUX內核作為一個最低優先級任務去運行,這種方式有RT-Linux, Xenomai,RTAI,系統層次如下:
   
另外一種方式是: 通過修改標准的內核,增加實時性,這種方式主要有社區的Ingo Molnar的patch(http://www.kernel.org/pub/linux/kernel/projects/rt/)和 TimeSys的內核修改,層次如下:
   
不管采用哪種實時LINUX,都需要非常慎重和要經過嚴格的測試才能部署

應用方面: 如果標准的LINUX,可以通過nice命令或者nice()函數,加大相應任務的時間片提高任務所謂的“實時性”(注,這個並非真正的實時性,而是增加特定時間段里面重要任務運行的時間而非指實時任務就緒后立即去搶非實時任務的CPU的概念),如果使用系統級改進的實時系統,則采用相應的API調用去提高實時任務的實時性:
硬實時編程實例:(以下不用掌握)
   

軟實時編程實例:

更多的參考:https://rt.wiki.kernel.org 和實時性講座視頻http://v.youku.com/v_show/id_XMTAyODU1OTc2.html

14.(擴展)解釋一下嵌入式系統中的優先級翻轉,什么情況下優先級會出現翻轉,以及如何避免優先級翻轉?[4分]

參考答案:
優先級翻轉 (百度詞條 http://baike.baidu.com/view/2422471.htm 解釋的非常到位,摘錄如下)更詳細請查看:參考視頻 http://v.youku.com/v_show/id_XMTAyODU1OTc2.html 第27分30秒左右的視頻段 

 所謂優先級翻轉問題(priority inversion)即當一個高優先級任務通過信號量機制訪問共享資源時,該信號量已被一低優先級任務占有,而這個低優先級任務在訪問共享資源時可能又被其它一些中等優先級任務搶先,因此造成高優先級任務被許多具有較低優先級任務阻塞,實時性難以得到保證。
  例如:有優先級為A、B和C三個任務,優先級A>B>C,任務A,B處於掛起狀態,等待某一事件發生,任務C正在運行,此時任務C開始使用某一共享資源S。在使用中,任務A等待事件到來,任務A轉為就緒態,因為它比任務C優先級高,所以立即執行。當任務A要使用共享資源S時,由於其正在被任務C使用,因此任務A被掛起,任務C開始運行。如果此時任務B等待事件到來,則任務B轉為就緒態。由於任務B優先級比任務C高,因此任務B開始運行,直到其運行完畢,任務C才開始運行。直到任務C釋放共享資源S后,任務A才得以執行。在這種情況下,優先級發生了翻轉,任務B先於任務A運行。  
  解決優先級翻轉問題有優先級天花板(priority ceiling)和優先級繼承(priority inheritance)兩種辦法。  
  優先級天花板是當任務申請某資源時, 把該任務的優先級提升到可訪問這個資源的所有任務中的最高優先級, 這個優先級稱為該資源的優先級天花板。這種方法簡單易行, 不必進行復雜的判斷, 不管任務是否阻塞了高優先級任務的運行, 只要任務訪問共享資源都會提升任務的優先級。
 優先級繼承是當任務A 申請共享資源S 時, 如果S正在被任務C 使用,通過比較任務C 與自身的優先級,如發現任務C 的優先級小於自身的優先級, 則將任務C的優先級提升到自身的優先級, 任務C 釋放資源S 后,再恢復任務C 的原優先級。這種方法只在占有資源的低優先級任務阻塞了高優先級任務時才動態的改變任務的優先級,如果過程較復雜, 則需要進行判斷。

15.TCP/IP的分層和OSI模型的分層?[5分]

參考答案:
 
   
擴展:補充知識需要去看和理解一下,關於二層交換機,三層交換機,路由器的知識請參考:
http://network.51cto.com/art/201204/327555_1.htm 和 http://baike.baidu.com/view/116622.htm 

16.TCP/IP 建立連接的3次握手過程和關閉鏈接的4次握手?[5分]

參考答案:


 參看繪圖的左邊部分,關鍵點:

1. 要標注 客戶端(client)和服務器(server)
2.三次握手一定是由客戶端發起
3.SYN, ACK/ FIN,ACK一定要標示
    

17.建立socket的API函數(或者叫步驟)?[5分]

參考答案:
 參看繪圖部分,
關鍵點:
1. 要標注 客戶端(client)和服務器(server)
2.連接一定是先由客戶端發起
3.客戶端、服務器之間的連接一定是在connect()和accept()之間進行
4.服務器端accpet()返回的是新的套接字描述符,客戶端一定是和新套接字進行通信
5.面試如遇到,最好把函數的API里面參數補全

 

18.ARP/RARP協議是什么?ICMP是什么協議,他們各處於哪一層?
提示: 最好去查一下各是什么作用[5分]

參考答案:
參考如下手繪中的相關部分:


1.ARP/RARP:地址解析/逆向地址解析, arp是IP地址解析為MAC地址 RARP MAC地址解析為IP地址,在TCP/IP協議族里面它處於網絡層它們處於網絡接口與物理層
2.ICMP是(Internet Control Message Protocol)Internet控制報文協議。它是TCP/IP協議族的一個子協議,用於在IP主機、路由器之間傳遞控制消息,在TCP/IP協議族里面它處於網絡層
   

19.廣播和多播的區別? [2分]

參考答案:
參考: http://net.chinaunix.net/5/2008/11/13/1311505.shtml 自己再總結一下

20.列舉你所知道的盡可能多的TCP/IP中應用層協議
提示: HTTP,FTP,TELNET這些都是[3分]

參考答案:
   
嵌入式相關協議:
網頁: http,
文件傳輸: ftp
遠程登錄:telnet ssh
郵件收發:pop3/imap, smtp
NTP: 網絡時鍾,用於低成本產品,節省
SNMP 簡答網絡管理協議,經常用於網絡設備的集中管理,網上招聘和職位有專門的SNMP工程師
RTP/RTSP:常用於視頻監控,網絡播放音視頻的設備
   

21.(擴展)RTP/RTSP協議的作用和基本原理?
注: 視頻監控中經常需要要到這個協議,最近視頻監控企業網上招聘比較多,請准備[5分]

參考答案:
RTP/RTSP協議是實時網絡傳輸協議, 它可以根據網絡狀態調整畫面質量,並可實現暫停、快進、快退等實時交互動作。

整個RTSP協議棧是在TCP/IP協議棧之上建立的,
RTP協議服務媒體數據的傳輸;
RTCP負責檢查網絡狀況,如網絡流量監測、網絡阻塞監測;
RTSP提供控制功能,如播放、暫停、前進、后退等功能。
RTP/RTSP協議的分層和工作模式如下:
    
    
RTSP協議的沒有統一的API,該協議的實現有 FFmpeg、Live555等開源項目

具體介紹參考: http://blog.c114.net/html/40/26740-55502.html

22.(擴展)如何解決網絡通信中出現網絡異常(或叫超時)的問題?可以采取哪些措施提高網絡的性能?[5分]

參考答案:
可以采用2個方式:
內核中:網卡驅動中 2.6內核里面,使能1s的周期性檢查定時器 網卡硬件或者我們通過GPIO,插拔網線時候產生中斷,處理相應中斷 這樣就能立即檢測到
應用層: 采用心跳檢測 客服端服務器創建相應的鏈路,然后根據業務邏輯每隔一定的時間,相互通信,以驗證雙方的網絡是否處於保活狀態

23.(擴展)網絡為什么會發生擁塞,發生擁塞的時候網絡如何處理?[4分]

參考答案:
參考下圖中偏右邊的手繪圖


真正過程參考:http://blog.csdn.net/machh/article/details/6731780
     

24.描述內存分配方式以及它們的區別?
提示:從局部變量,靜態,全局變量,malloc()所處的內存位置去考慮[4分]

參考答案:
1) 從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static 變量。
2) 在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置於處理器的指令集。
3) 從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc 或new 申請任意多少的內存,程序員自己負責在何時用free 或delete 釋放內存。動態內存的生存期由程序員決定,使用非常靈活,但問題也最多。

25.請畫出linux程序運行時的內存映射並加以說明
提示: LINUX程序是通過ELF格式進行運行的[4分]

參考答案:


看下面圖里面的exec()的過程   

26.(擴展)下面是一個16×16的黑白圖片:
static unsigned short stopwatch[] = {
0x07c6,
0x1ff7,
0x383b,
0x600c,
0x600c,
0xc006,
0xc006,
0xdf06,
0xc106,
0xc106,
0x610c,
0x610c,
0x3838,
0x1ff0,
0x07c0,
0x0000,
};
如何修改聲明,可以使之在源代碼中形象地表現出圖形的模樣?[2分]

參考答案:
上述圖標實際上是高度是16點,寬是2個字節,實際上,字符庫里面16×16的點陣字符和此類似。 把一個字節里面的所有值用二進制表示為0x0~0xff,再把字節中的每一位1用"x"表示,0用"_"表示,比如:#define ________ 0x0
#define _______X 0x1
#define ______X_ 0x2
#define ______XX 0x3
#define _____X__ 0x4
//...
#define XXXXXXX_ 0xfe
#define XXXXXXXX 0xff
比如ASCII字符"6"就可以表示為:
const unsigned char acFont16B_ASCII_0036[16] = { /* code 0036 */
________,
________,
________,
__XXX___,
_X__XX__,
XX______,
XX______,
XXXXX___,
XX__XX__,
XX__XX__,
XX__XX__,
XX__XX__,
_XXXX___,
________,
________,
________
};
又比如ASCII字符"E"就可以表示為:
const unsigned char acFont16B_ASCII_0045[ 16] = { /* code 0045 */
________,
________,
________,
_XXXXXX_,
_XX_____,
_XX_____,
_XX_____,
_XXXXXX_,
_XX_____,
_XX_____,
_XX_____,
_XX_____,
_XXXXXX_,
________,
________,
________
};
再比如漢字“財”:
const unsigned char acFontF16x16_HKS_8CA1[ 32] = { /* code 8CA1 */
________,___X____,
_XXXXX__,___X____,
_X___X__,___X____,
_XXXXX__,___X____,
_X___X_X,XXXXXXX_,
_X___X__,__XX____,
_XXXXX__,__XX____,
_X___X__,_X_X____,
_X___X__,_X_X____,
_XXXXX__,X__X____,
_______X,___X____,
__X_X_X_,___X____,
__X__X__,___X____,
_X___XX_,___X____,
X____X__,_X_X____,
________,__X_____
};

27.2個快速判斷你的LINUX水平的問題:
1.你經常看什么技術類書籍?列舉一下你經常去的技術類網站?
2.你寫過多少行C語言代碼? 你實現過的數據結構算法?
[4分]

參考答案:
列幾本比較經典的:
LINUX的應用開發:
《unix高級環境編程》
《TCP/IP詳解》
底層驅動參考書:
Jonathan Corbet等 《Linux device drivers》 3rd
Robert Love 《linux kernel development》 3rd
宋寶華 《linux驅動開發詳解》 2nd
技術類網站:
www.kernel.org 內核源代碼的網站
lwn.net 可免費看一周前所有技術類專題和周刊,強烈推薦
http://free-electrons.com/ 很多的linux,android免費的培訓講義

C語言代碼方面,一般C完全掌握的代碼量是寫過1~2萬行,請根據自己的實際情況和結合企業需求回答

數據結構:一般關鍵包括線性表,棧和隊列,串,多維數組,二叉樹等
冒泡,二分查找,拆半查找等

============ 本試卷共計27題,此處為結束標志。考試酷examcoo ============


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM