📄 Linux/嵌入式Linux面试模拟卷
一、单选题(每题2分,共20分)
Linux内核中,进程和线程的主要区别是:
A) 进程有独立的地址空间,线程共享
B) 线程调度开销更大
C) 进程不能共享文件描述符
D) 线程不能通过fork()创建
关于Linux系统调用,错误的是:
A) 通过软中断实现
B) 从用户态切换到内核态
C) 调用read()是系统调用
D) 系统调用不会引起上下文切换
在ext4文件系统中,一个文件被删除后,其数据:
A) 立即被物理擦除
B) 只是标记为删除,inode被回收
C) 移动到回收站
D) 需要手动shred才能彻底删除
关于Linux内存管理,正确的是:
A) 所有内存分配都来自堆
B) 共享内存通过mmap()实现
C) malloc()失败一定是因为物理内存不足
D) 内存碎片只发生在用户空间
以下信号中,不能被捕获或忽略的是:
A) SIGINT(Ctrl+C)
B) SIGTERM(终止信号)
C) SIGKILL(强制终止)
D) SIGHUP(终端断开)
关于Linux进程调度,CFS调度器的目标是:
A) 最大化吞吐量
B) 最小化响应时间
C) 公平分配CPU时间
D) 优先处理I/O密集型进程
在嵌入式Linux中,BusyBox的作用是:
A) 轻量级C库
B) 集成常用Unix工具
C) 内核模块管理
D) 文件系统格式
关于strace工具,错误的是:
A) 可以跟踪系统调用
B) 可以跟踪信号传递
C) 会显著降低程序性能
D) 不能跟踪多线程程序
以下文件权限表示所有者有读写执行,同组有读执行,其他有读权限:
A) 755
B) 754
C) 644
D) 750
关于Linux启动流程,正确的顺序是:
A) BIOS → Bootloader → 内核 → init → 用户空间
B) UEFI → 内核 → systemd → 用户空间
C) Bootloader → 内核 → initramfs → 根文件系统
D) 以上都对
二、多选题(每题3分,少选得1分,错选不得分,共15分)
Linux中进程间通信方式包括:
A) 管道
B) 消息队列
C) 共享内存
D) 信号量
E) 套接字
Linux内核的子系统包括:
A) 进程调度
B) 内存管理
C) 文件系统
D) 网络协议栈
E) 设备驱动
可能导致OOM Killer触发的条件:
A) 物理内存耗尽
B) 交换空间不足
C) 进程内存泄漏
D) 内存碎片严重
E) 文件缓存过大
嵌入式Linux的引导加载程序包括:
A) U-Boot
B) GRUB
C) Das U-Boot
D) LILO
E) Barebox
可以用来调试内存泄漏的工具:
A) Valgrind
B) gdb
C) AddressSanitizer
D) mtrace
E) top
三、判断题(每题1分,共10分)
init进程的PID总是1
kill -9可以杀死任何进程
硬链接可以跨文件系统
sudo通过setuid位实现权限提升
Linux中的所有设备都表示为文件
线程有自己的PID
select有文件描述符数量限制(1024)
僵尸进程会占用大量内存
O_DIRECT标志可以绕过页面缓存
用户态和内核态切换需要CPU特权级改变
四、简答题(每题5分,共25分)
描述Linux虚拟内存机制,包括分页、页面置换、MMU的作用。
解释Copy-on-Write(写时复制)原理及其在fork()中的应用。
比较select、poll、epoll的优缺点和适用场景。
描述Linux设备树的用途,在嵌入式系统中为什么重要?
解释Linux内核模块的加载过程,如何解决模块依赖?
五、命令操作题(10分)
根据以下需求写出Linux命令:
a) 查找当前目录下所有包含"error"的.log文件
b) 实时查看系统内存使用情况
c) 杀掉所有名为"myapp"的进程
d) 查看占用80端口的进程
e) 将目录打包成tar.gz并排除某些文件
f) 设置开机自动挂载NFS共享
g) 查看内核启动参数
h) 跟踪进程的系统调用
i) 永久修改文件描述符限制
j) 创建交换文件并启用
六、系统调试题(10分)
分析并解决以下问题:
现象:嵌入式设备运行一段时间后,出现"fork: Cannot allocate memory"错误,但free显示还有可用内存。
可能原因及排查步骤:
可能原因1:进程数达到上限
可能原因2:内存碎片
可能原因3:地址空间耗尽
请写出:
a) 查看当前系统限制的命令
b) 查看内存碎片的工具和方法
c) 查看进程虚拟内存使用
d) 临时解决方案
e) 根本解决方案
七、系统设计题(15分)
设计一个高可靠性嵌入式Linux数据采集系统
硬件环境:
ARM Cortex-A53 四核
1GB RAM,4GB eMMC
多个传感器接口(I2C、SPI)
4G模块
实时时钟
功能需求:
实时采集10个传感器数据(100Hz)
本地存储(循环覆盖,保存7天)
4G断点续传至云端
看门狗防死机
远程升级
请设计:
系统架构(5分):
进程/线程模型
数据流设计
错误处理机制
可靠性设计(5分):
看门狗实现方案
数据完整性保证
掉电保护
自动恢复
性能优化(5分):
实时性保证
内存使用优化
存储优化
网络传输优化
八、编程题(15分)
实现一个多线程高性能日志系统
要求:
#define LOG_BUFFER_SIZE 1024
#define MAX_LOG_WORKERS 4
typedef struct {
int level; // 日志级别
time_t timestamp; // 时间戳
char message[512]; // 日志消息
char thread_name[32];// 线程名
} LogEntry;
typedef struct {
pthread_t workers[MAX_LOG_WORKERS];
LogEntry buffer[LOG_BUFFER_SIZE];
int head; // 生产者指针
int tail; // 消费者指针
int shutdown; // 关闭标志
pthread_mutex_t mutex;
pthread_cond_t not_empty;
pthread_cond_t not_full;
FILE* log_file;
} Logger;
// 需要实现的接口
Logger* logger_init(const char* filename);
void logger_log(Logger* L, int level, const char* fmt, ...);
void logger_destroy(Logger* L);
具体要求:
支持多生产者(多线程写日志)
异步写入文件,不阻塞业务线程
缓冲区满时阻塞生产者
优雅关闭(处理完所有日志)
线程安全
支持日志轮转(加分项)