版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
2025年linux軟件工程師筆試題及答案一、基礎(chǔ)題(每題5分,共40分)1.簡述Linux文件系統(tǒng)中inode的作用,并說明如何查看一個文件的inode編號。答案:inode是Linux文件系統(tǒng)中存儲文件元數(shù)據(jù)的結(jié)構(gòu),包含文件大小、權(quán)限、創(chuàng)建/修改時間、數(shù)據(jù)塊指針等信息(文件名存儲在目錄的塊中,不占用inode)。每個文件/目錄對應(yīng)唯一inode號。查看inode編號可使用`ls-i`命令(如`ls-i/etc/passwd`),或`stat`命令查看輸出中的"Inode"字段。2.當執(zhí)行`rmfile.txt`時,文件數(shù)據(jù)是否立即被操作系統(tǒng)擦除?說明原因。答案:不會立即擦除。rm命令僅刪除文件的目錄項(即斷開文件名與inode的鏈接),并減少inode的鏈接計數(shù)。當鏈接計數(shù)降為0且無進程打開該文件(即文件描述符引用計數(shù)為0)時,文件占用的數(shù)據(jù)塊才會被標記為可重用。數(shù)據(jù)本身會在后續(xù)寫入新數(shù)據(jù)時被覆蓋。3.寫出`psaux`輸出中"VSZ"和"RSS"字段的含義,并說明二者的區(qū)別。答案:VSZ(VirtualMemorySize)是進程虛擬內(nèi)存總大小,包括進程可訪問的所有內(nèi)存區(qū)域(代碼段、數(shù)據(jù)段、共享庫、未分配但保留的空間等);RSS(ResidentSetSize)是進程當前駐留物理內(nèi)存的大?。▽嶋H占用的RAM)。VSZ可能遠大于RSS,因為虛擬內(nèi)存中很多區(qū)域未被實際加載到物理內(nèi)存(如未使用的共享庫頁面)。4.編寫一個shell腳本,統(tǒng)計當前系統(tǒng)中所有狀態(tài)為"ESTABLISHED"的TCP連接數(shù)量(要求使用netstat或ss命令)。答案:```bash!/bin/bash使用ss命令更高效(替代netstat)ss-tstateestablished|awk'NR>1{count++}END{printcount}'或使用netstatnetstat-ant|grepESTABLISHED|wc-l```(注:ss命令比netstat更高效,因為它直接讀取內(nèi)核網(wǎng)絡(luò)棧數(shù)據(jù)結(jié)構(gòu))5.說明硬鏈接(hardlink)和符號鏈接(symboliclink)的區(qū)別,以及創(chuàng)建它們的命令。答案:硬鏈接通過增加inode的鏈接計數(shù)實現(xiàn),與原文件共享同一inode,無法跨文件系統(tǒng)創(chuàng)建,刪除原文件不影響硬鏈接(只要鏈接計數(shù)>0);符號鏈接是獨立文件,存儲原文件路徑,可跨文件系統(tǒng),原文件刪除后符號鏈接變?yōu)椤皵噫湣?。?chuàng)建硬鏈接用`ln源文件硬鏈接名`,符號鏈接用`ln-s源文件符號鏈接名`。6.簡述Linux內(nèi)核中進程(process)和線程(thread)的區(qū)別,以及內(nèi)核如何調(diào)度它們。答案:進程是資源分配的基本單位(擁有獨立的地址空間、文件描述符表等),線程是調(diào)度執(zhí)行的基本單位(共享進程的資源,僅擁有獨立的寄存器、棧、線程ID等)。Linux內(nèi)核通過輕量級進程(LWP)實現(xiàn)線程,每個線程在內(nèi)核中表現(xiàn)為獨立的task_struct結(jié)構(gòu),調(diào)度時與普通進程使用相同的調(diào)度算法(如CFS),但共享父進程的資源。7.當使用`tar-czvfarchive.tar.gzdir/`打包目錄時,`-z`和`-v`參數(shù)的作用分別是什么?若要排除目錄中所有擴展名為.swap的文件,應(yīng)如何修改命令?答案:`-z`表示使用gzip壓縮算法;`-v`表示顯示詳細輸出(列出處理的文件)。排除.swap文件可使用`--exclude='.swap'`參數(shù),完整命令:`tar-czvfarchive.tar.gz--exclude='.swap'dir/`。8.簡述Linux系統(tǒng)中用戶空間與內(nèi)核空間的隔離機制,以及用戶程序如何調(diào)用內(nèi)核功能。答案:通過CPU的特權(quán)級(x86的ring0/ring3)實現(xiàn)隔離,內(nèi)核運行在ring0(特權(quán)模式),用戶程序運行在ring3(用戶模式),用戶空間無法直接訪問內(nèi)核內(nèi)存或硬件。用戶程序通過系統(tǒng)調(diào)用(如`open()`、`read()`)陷入內(nèi)核,觸發(fā)軟中斷(如x86的int0x80或syscall指令),切換到內(nèi)核態(tài)執(zhí)行對應(yīng)內(nèi)核函數(shù),完成后返回用戶態(tài)。二、進階題(每題8分,共40分)1.簡述Linux內(nèi)核模塊(kernelmodule)的加載過程,并說明如何查看已加載模塊的依賴關(guān)系。答案:加載過程:①用戶使用`insmod`或`modprobe`命令將模塊二進制文件(.ko)加載到內(nèi)核;②內(nèi)核檢查模塊的合法性(如MagicNumber、符號表);③執(zhí)行模塊初始化函數(shù)(`module_init()`注冊的函數(shù)),可能申請內(nèi)存、注冊設(shè)備驅(qū)動、創(chuàng)建文件系統(tǒng)節(jié)點等;④更新內(nèi)核模塊鏈表,記錄模塊信息(如引用計數(shù))。查看依賴關(guān)系可使用`modinfo模塊名`(顯示depends字段)或`lsmod`(列出所有模塊及其引用計數(shù)),`modprobe-d模塊名`也可查看依賴樹。2.解釋虛擬內(nèi)存(VirtualMemory)到物理內(nèi)存(PhysicalMemory)的映射機制,涉及哪些關(guān)鍵數(shù)據(jù)結(jié)構(gòu)和硬件支持?答案:虛擬內(nèi)存通過頁表(PageTable)映射到物理內(nèi)存。x86-64系統(tǒng)使用四級頁表(PML4、PDPT、PD、PT),每個頁表項(PTE)存儲物理頁框號(PFN)及訪問權(quán)限、臟位等標志。硬件支持包括MMU(內(nèi)存管理單元)負責地址轉(zhuǎn)換,TLB(轉(zhuǎn)換后援緩沖器)緩存最近使用的頁表項以加速轉(zhuǎn)換。當虛擬頁未映射到物理內(nèi)存(缺頁中斷)時,內(nèi)核從磁盤(交換分區(qū)或文件)加載對應(yīng)頁到物理內(nèi)存,并更新頁表。3.簡述CFS(CompletelyFairScheduler)調(diào)度器的核心思想,說明其如何實現(xiàn)“公平”調(diào)度。答案:CFS基于“虛擬運行時間”(vruntime)實現(xiàn)公平調(diào)度。每個進程的vruntime根據(jù)實際運行時間和權(quán)重(nice值轉(zhuǎn)換而來)計算(vruntime=實際運行時間(NICE_0_LOAD/進程權(quán)重))。CFS維護一個紅黑樹(rbtree),按vruntime排序,每次選擇vruntime最小的進程運行,確保所有進程的vruntime盡可能接近,避免進程長時間等待。對于實時進程(優(yōu)先級高于0),CFS會讓位于實時調(diào)度類(如FIFO/RR)。4.說明epoll的LT(LevelTriggered)和ET(EdgeTriggered)模式的區(qū)別,并舉例說明ET模式的使用注意事項。答案:LT模式(水平觸發(fā)):當文件描述符就緒(如可讀)時,epoll會重復(fù)通知(只要數(shù)據(jù)未被完全讀?。?;ET模式(邊緣觸發(fā)):僅在狀態(tài)變化時通知一次(如從不可讀到可讀的瞬間)。ET模式要求用戶必須一次性讀取所有可用數(shù)據(jù)(如循環(huán)調(diào)用`read()`直到返回EAGAIN),否則可能丟失事件。例如,使用ET模式監(jiān)聽socket可讀事件時,需在`read()`返回-1且`errno==EAGAIN`時停止讀取,否則剩余數(shù)據(jù)不會再次觸發(fā)通知,導(dǎo)致數(shù)據(jù)積壓。5.簡述Linux內(nèi)核中內(nèi)存泄漏(MemoryLeak)的常見場景及調(diào)試方法。答案:常見場景:①內(nèi)核模塊中申請內(nèi)存(如`kmalloc()`、`vmalloc()`)后未釋放;②分配的內(nèi)核對象(如`structtask_struct`)未正確釋放引用計數(shù);③設(shè)備驅(qū)動中DMA緩沖區(qū)未正確釋放。調(diào)試方法:①使用`kmemleak`工具(需內(nèi)核配置`CONFIG_DEBUG_KMEMLEAK`),通過`echoscan>/sys/kernel/debug/kmemleak`觸發(fā)掃描,輸出泄漏的內(nèi)存地址和調(diào)用棧;②`slabtop`查看slab緩存使用情況,定位異常增長的緩存;③內(nèi)核調(diào)試符號(`CONFIG_DEBUG_INFO`)配合`gdb`分析內(nèi)核轉(zhuǎn)儲(kdump);④自定義鉤子函數(shù)(如覆蓋`kmalloc`/`kfree`)記錄分配/釋放操作。三、編程題(每題10分,共30分)1.編寫C程序,使用多線程實現(xiàn)文件拷貝功能,要求支持指定線程數(shù)(通過命令行參數(shù)傳入)和分塊大?。ㄈ缑烤€程處理1MB數(shù)據(jù))。需處理文件大小不能被分塊數(shù)整除的情況。答案:```cinclude<stdio.h>include<stdlib.h>include<pthread.h>include<fcntl.h>include<unistd.h>include<sys/stat.h>typedefstruct{intsrc_fd,dest_fd;off_tstart;off_tend;size_tblock_size;}ThreadArgs;voidcopy_thread(voidarg){ThreadArgsargs=(ThreadArgs)arg;charbuffer=malloc(args->block_size);if(!buffer){perror("malloc");pthread_exit(NULL);}lseek(args->src_fd,args->start,SEEK_SET);lseek(args->dest_fd,args->start,SEEK_SET);off_tcurrent=args->start;while(current<args->end){size_tread_size=(args->end-current)<args->block_size?(args->end-current):args->block_size;ssize_tbytes_read=read(args->src_fd,buffer,read_size);if(bytes_read<=0)break;write(args->dest_fd,buffer,bytes_read);current+=bytes_read;}free(buffer);returnNULL;}intmain(intargc,charargv[]){if(argc!=5){fprintf(stderr,"Usage:%s<src><dest><thread_num><block_size(MB)>\n",argv[0]);return1;}intsrc_fd=open(argv[1],O_RDONLY);intdest_fd=open(argv[2],O_WRWR|O_CREAT|O_TRUNC,0644);if(src_fd<0||dest_fd<0){perror("open");return1;}structstatst;fstat(src_fd,&st);off_tfile_size=st.st_size;intthread_num=atoi(argv[3]);size_tblock_size=atoi(argv[4])10241024;//MB轉(zhuǎn)字節(jié)pthread_tthreads=malloc(thread_numsizeof(pthread_t));ThreadArgsargs=malloc(thread_numsizeof(ThreadArgs));off_tchunk_size=file_size/thread_num;for(inti=0;i<thread_num;i++){args[i].src_fd=src_fd;args[i].dest_fd=dest_fd;args[i].start=ichunk_size;args[i].end=(i==thread_num-1)?file_size:(i+1)chunk_size;args[i].block_size=block_size;pthread_create(&threads[i],NULL,copy_thread,&args[i]);}for(inti=0;i<thread_num;i++){pthread_join(threads[i],NULL);}close(src_fd);close(dest_fd);free(threads);free(args);return0;}```關(guān)鍵點:通過`lseek`定位各線程的讀寫位置,使用`pthread_create`創(chuàng)建線程,每個線程處理獨立的文件區(qū)間,最后`pthread_join`等待所有線程完成。處理剩余數(shù)據(jù)通過最后一個線程覆蓋`file_size`解決。2.編寫信號處理程序,當進程收到SIGINT信號(Ctrl+C)時,先輸出"CaughtSIGINT,cleaningup...",然后執(zhí)行自定義清理函數(shù)(如釋放動態(tài)分配的內(nèi)存),最后正常退出。要求信號處理函數(shù)中不直接調(diào)用非異步安全函數(shù)。答案:```cinclude<stdio.h>include<stdlib.h>include<signal.h>include<unistd.h>volatilesig_atomic_tsigint_received=0;voiddynamic_data=NULL;voidcleanup(){if(dynamic_data){free(dynamic_data);dynamic_data=NULL;printf("Cleanedupdynamicdata\n");}}voidsigint_handler(intsig){sigint_received=1;//僅設(shè)置標志,異步安全}intmain(){dynamic_data=malloc(1024);//模擬動態(tài)分配if(!dynamic_data){perror("malloc");return1;}structsigactionsa;sa.sa_handler=sigint_handler;sigemptyset(&sa.sa_mask);sa.sa_flags=0;sigaction(SIGINT,&sa,NULL);while(!sigint_received){printf("Running...\n");sleep(1);}printf("CaughtSIGINT,cleaningup...\n");cleanup();//在主循環(huán)中調(diào)用清理函數(shù)(非信號處理函數(shù)內(nèi))return0;}```關(guān)鍵點:信號處理函數(shù)僅設(shè)置原子標志(`sig_atomic_t`保證操作原子性),主循環(huán)檢測到標志后調(diào)用清理函數(shù),避免在信號處理函數(shù)中調(diào)用`printf`、`free`等非異步安全函數(shù)(可能導(dǎo)致競態(tài)條件或崩潰)。3.編寫C程序,使用共享內(nèi)存(shm)實現(xiàn)兩個進程間的通信:進程A向共享內(nèi)存寫入字符串"HellofromA",進程B讀取該字符串并輸出。要求處理共享內(nèi)存的創(chuàng)建、連接、分離和刪除。答案:```c//進程A(寫入端)include<stdio.h>include<stdlib.h>include<string.h>include<sys/ipc.h>include<sys/shm.h>defineSHM_KEY0x1234defineSHM_SIZE1024intmain(){intshmid=shmget(SHM_KEY,SHM_SIZE,IPC_CREAT|0666);if(shmid<0){perror("shmget");return1;}charshm_addr=shmat(shmid,NULL,0);if(shm_addr==(char)-1){perror("shmat");return1;}strcpy(shm_addr,"HellofromA");printf("Wrotetosharedmemory:%s\n",shm_addr);shmdt(shm_addr);//分離共享內(nèi)存//不立即刪除,等待進程B讀取return0;}//進程B(讀取端)include<stdio.h>include<stdlib.h>include<sys/ipc.h>include<sys/shm.h>defineSHM_KEY0x1234defineSHM_SIZE1024intmain(){intshmid=shmget(SHM_KEY,SHM_SIZE,0666);if(shmid<0){perror("shmget");return1;}charshm_addr=shmat(shmid,NULL,0);if(shm_addr==(char)-1){perror("shmat");return1;}printf("Readfromsharedmemory:%s\n",shm_addr);shmdt(shm_addr);//分離shmctl(shmid,IPC_RMID,NULL);//標記為刪除(所有進程分離后釋放)return0;}```關(guān)鍵點:進程A使用`IPC_CREAT`創(chuàng)建共享內(nèi)存,進程B通過相同key獲?。籤shmat`連接內(nèi)存,`shmdt`分離;`shmctl(IPC_RMID)`標記共享內(nèi)存為待刪除(實際刪除發(fā)生在最后一個進程分離后)。四、綜合題(20分)假設(shè)某Linux服務(wù)器出現(xiàn)CPU使用率持續(xù)90%以上的問題,請設(shè)計排查流程,并說明可能的原因及對應(yīng)的解決方法。答案:排查流程:1.確認負載來源:使用`top`或`htop`查看CPU占用最高的進程(關(guān)注%CPU列),記錄進程PID。2.分析進程行為:-若為用戶進程(如應(yīng)用程序),使用`strace-pPID`
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年秋季泉州市豐澤區(qū)云山實驗小學(xué)語文頂崗教師招聘模擬筆試試題及答案解析
- 2025廣東中山大學(xué)腫瘤防治中心肝臟外科陳敏山教授課題組自聘技術(shù)員招聘2人備考筆試題庫及答案解析
- 2025廣西北海銀灘開發(fā)投資股份有限公司招聘2人參考考試試題及答案解析
- 高級管理學(xué)考試題及答案
- 德州教師招考真題及答案
- 零碳園區(qū)碳中和目標制定計劃
- 智算數(shù)據(jù)處理綠色化方案
- 燕子課件模板
- 副科長崗位職責與考核內(nèi)容
- 律師職業(yè)面試技巧與專業(yè)問題解析
- 2025安徽淮北市消防救援支隊招聘政府專職消防文員17人考試歷年真題匯編帶答案解析
- 2025湖南日報融媒傳播有限公司招聘7人筆試考試參考試題及答案解析
- 2025年法醫(yī)學(xué)案例分析與判斷及答案解析
- 股東借款協(xié)議書范本
- CCAA合格評定基礎(chǔ)重點資料
- 護理人文關(guān)懷與醫(yī)患溝通技巧
- 北京市順義區(qū)2024-2025學(xué)年八年級上學(xué)期期末考試英語試卷
- 《化工企業(yè)可燃液體常壓儲罐區(qū)安全管理規(guī)范》解讀課件
- 2025至2030等靜壓行業(yè)發(fā)展研究與產(chǎn)業(yè)戰(zhàn)略規(guī)劃分析評估報告
- 聽障兒童家庭康復(fù)訓(xùn)練
- 2024年考研政治真題及考點解析
評論
0/150
提交評論