嵌入式大廠面經(jīng) Linux進(jìn)程管理常見面試題(持續(xù)更新中!)
這是一個嵌入式大廠面試題專欄,每天更新高頻面試題。專欄將包含題目描述、詳細(xì)解析、相關(guān)知識點擴(kuò)展以及實際代碼示例。內(nèi)容涵蓋操作系統(tǒng)、驅(qū)動開發(fā)、通信協(xié)議等核心領(lǐng)域,并結(jié)合實際項目經(jīng)驗進(jìn)行分析。每道題目都會附帶面試官可能的追問方向,幫助大家更好地準(zhǔn)備面試!
Linux進(jìn)程調(diào)度和進(jìn)程創(chuàng)建相關(guān)面試題
一、Linux進(jìn)程調(diào)度基礎(chǔ)
1. 進(jìn)程調(diào)度的概念
Linux進(jìn)程調(diào)度是操作系統(tǒng)核心功能之一,負(fù)責(zé)決定哪個進(jìn)程在CPU上運行,以及運行多長時間。調(diào)度器的目標(biāo)是在保證公平性的同時,最大化系統(tǒng)吞吐量和最小化響應(yīng)時間。
2. Linux調(diào)度器的發(fā)展
- O(1)調(diào)度器:Linux 2.6早期版本使用,常數(shù)時間復(fù)雜度
- CFS(完全公平調(diào)度器):從Linux 2.6.23開始引入,現(xiàn)在的主流調(diào)度器
- 實時調(diào)度器:用于實時任務(wù),包括SCHED_FIFO和SCHED_RR策略
- BFS(腦殘調(diào)度器)和MuQSS:第三方調(diào)度器,針對桌面響應(yīng)優(yōu)化
3. CFS調(diào)度器原理
CFS基于"虛擬運行時間"概念,追蹤每個進(jìn)程的運行時間:
- 使用紅黑樹數(shù)據(jù)結(jié)構(gòu)組織進(jìn)程
- 進(jìn)程的虛擬運行時間越小,獲得CPU的優(yōu)先級越高
- 進(jìn)程運行時,其虛擬運行時間增加
- 目標(biāo)是讓所有進(jìn)程的虛擬運行時間接近
4. 調(diào)度策略和優(yōu)先級
Linux支持多種調(diào)度策略:
- SCHED_OTHER(CFS):普通進(jìn)程的默認(rèn)策略
- SCHED_BATCH:批處理進(jìn)程,不需要交互
- SCHED_IDLE:優(yōu)先級最低的進(jìn)程
- SCHED_FIFO:實時進(jìn)程,先進(jìn)先出,不會被搶占(除非被更高優(yōu)先級進(jìn)程)
- SCHED_RR:實時進(jìn)程,時間片輪轉(zhuǎn)
優(yōu)先級系統(tǒng):
- nice值:范圍-20到19,值越小優(yōu)先級越高,默認(rèn)為0
- 實時優(yōu)先級:范圍1-99,值越大優(yōu)先級越高
二、進(jìn)程創(chuàng)建相關(guān)系統(tǒng)調(diào)用
1. fork系統(tǒng)調(diào)用
fork()
是Unix/Linux中創(chuàng)建進(jìn)程的傳統(tǒng)方法:
#include <unistd.h> pid_t fork(void);
特點:
- 創(chuàng)建調(diào)用進(jìn)程的副本(子進(jìn)程)
- 子進(jìn)程獲得父進(jìn)程數(shù)據(jù)空間、堆、棧的副本
- 父子進(jìn)程共享代碼段(只讀)
- 采用寫時復(fù)制(Copy-On-Write)技術(shù)優(yōu)化內(nèi)存使用
- 返回值:父進(jìn)程中返回子進(jìn)程PID,子進(jìn)程中返回0,失敗返回-1
示例:
#include <stdio.h> #include <unistd.h> int main() { pid_t pid = fork(); if (pid < 0) { // 創(chuàng)建失敗 perror("fork failed"); return 1; } else if (pid == 0) { // 子進(jìn)程 printf("子進(jìn)程,PID: %d,父進(jìn)程PID: %d\n", getpid(), getppid()); } else { // 父進(jìn)程 printf("父進(jìn)程,PID: %d,子進(jìn)程PID: %d\n", getpid(), pid); } return 0; }
2. vfork系統(tǒng)調(diào)用
vfork()
是fork()
的一種特殊形式:
#include <unistd.h> pid_t vfork(void);
特點:
- 創(chuàng)建進(jìn)程的目的是執(zhí)行exec系列函數(shù)
- 子進(jìn)程與父進(jìn)程共享地址空間(不使用寫時復(fù)制)
- 父進(jìn)程會被掛起,直到子進(jìn)程調(diào)用exec或exit
- 子進(jìn)程必須小心不修改共享的變量
- 現(xiàn)代系統(tǒng)中,fork的性能已經(jīng)很好,vfork使用較少
示例:
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main() { pid_t pid = vfork(); if (pid < 0) { // 創(chuàng)建失敗 perror("vfork failed"); return 1; } else if (pid == 0) { // 子進(jìn)程 printf("子進(jìn)程,PID: %d\n", getpid()); // 子進(jìn)程必須調(diào)用exec或exit _exit(0); // 注意使用_exit而非exit } else { // 父進(jìn)程 printf("父進(jìn)程,PID: %d,子進(jìn)程PID: %d\n", getpid(), pid); } return 0; }
3. clone系統(tǒng)調(diào)用
clone()
是Linux特有的系統(tǒng)調(diào)用,提供更細(xì)粒度的控制:
#define _GNU_SOURCE #include <sched.h> int clone(int (*fn)(void *), void *stack, int flags, void *arg, ...);
特點:
- 允許選擇父子進(jìn)程間共享的資源(如文件描述符、信號處理等)
- 是實現(xiàn)線程的基礎(chǔ)(pthread庫在底層使用clone)
- 通過flags參數(shù)控制共享程度
- 常用flags: CLONE_FILES:共享文件描述符表CLONE_FS:共享文件系統(tǒng)信息CLONE_VM:共享內(nèi)存空間CLONE_SIGHAND:共享信號處理函數(shù)
示例:
#define _GNU_SOURCE #include <stdio.h> #include <sched.h> #include <stdlib.h> #include <unistd.h> #define STACK_SIZE (1024 * 1024) // 1MB??臻g // 子進(jìn)程執(zhí)行的函數(shù) int child_func(void *arg) { printf("子進(jìn)程,P
剩余60%內(nèi)容,訂閱專欄后可繼續(xù)查看/也可單篇購買
這是一個全面的嵌入式面試專欄。主要內(nèi)容將包括:操作系統(tǒng)(進(jìn)程管理、內(nèi)存管理、文件系統(tǒng)等)、嵌入式系統(tǒng)(啟動流程、驅(qū)動開發(fā)、中斷管理等)、網(wǎng)絡(luò)通信(TCP/IP協(xié)議棧、Socket編程等)、開發(fā)工具(交叉編譯、調(diào)試工具等)以及實際項目經(jīng)驗分享。專欄將采用理論結(jié)合實踐的方式,每個知識點都會附帶相關(guān)的面試真題和答案解析。