
本文概述
进程、线程和进程间通信是嵌入式Linux开发的基础,也是面试必问题。面试官想听的不是“进程就是运行的程序”,而是你懂不懂进程与线程的本质区别(资源与调度的粒度)、进程隔离与共享的取舍、以及各种IPC(管道、消息队列、共享内存、信号量、信号、Socket)的适用场景。本文从“进程是资源容器、线程是调度单位”讲起,讲进程和线程的内存模型区别、创建方式(fork/pthread)、以及常用IPC方式(管道、消息队列、共享内存+信号量、信号、Socket)的原理和选择,强调IPC选择依赖数据量、实时性和同步需求,不套固定模式。
核心要点
进程是资源分配的单位(独立地址空间),线程是调度执行的单位(共享进程资源)
进程隔离性强、切换开销大,线程共享内存、切换快但需同步
fork创建进程(写时复制),pthread_create创建线程(共享地址空间)
IPC方式:管道(单向流)、消息队列(有界消息)、共享内存(最快+需信号量同步)、信号(异步通知)、Socket(跨机)
共享内存是嵌入式进程间传大数据最快的方式,但必须配合同步机制
选择IPC:小数据/事件用信号或消息队列,大数据高频用共享内存,跨设备用Socket
面试官考察点
考察点拆解
面试官问进程线程IPC,重点考察:第一,你懂不懂进程和线程的本质区别(资源vs调度);第二,你会不会选IPC方式(管道、共享内存、信号量等各适用什么);第三,你懂不懂共享内存为什么必须配合信号量;第四,有没有在嵌入式系统里实际用过。
追问方向:进程线程区别、fork和pthread、共享内存为什么快、信号量和互斥锁区别、IPC怎么选。
回答思路
答题主线
建议按“进程vs线程 → 创建方式 → IPC方式 → 选择与同步”来答,先讲清模型再落到IPC。
先讲区别:资源容器 vs 调度单位。
讲创建:fork vs pthread。
讲IPC:管道/消息队列/共享内存/信号/Socket。
讲选择:按数据量和同步需求。
参考回答
我先讲进程和线程的区别,再讲进程间通信。
第一,进程与线程。
进程是资源分配的单位:每个进程有独立的地址空间,进程间数据隔离,一个进程崩溃不影响其他进程;
线程是调度执行的单位:同一进程内的线程共享地址空间和资源,切换开销小,但需要同步来保护共享数据。
所以:进程隔离性强、更稳但通信和切换开销大;线程共享内存、效率高但并发访问要加锁。
第二,创建方式。进程用fork(复制当前进程,Linux用写时复制优化),线程用pthread_create(在同一地址空间创建执行流)。嵌入式里多任务常用多线程(共享数据方便),需要隔离或部署独立程序用多进程。
第三,IPC方式。
管道:单向字节流,适合父子进程间简单流式数据,无名管道/命名管道(FIFO);
消息队列:按消息单元传递,有界、可带类型,适合小数据、按消息处理的场景;
共享内存:多进程映射同一块内存,直接读写,最快,适合大数据高频交换,但必须配合信号量/互斥锁同步(否则读写竞争);
信号:异步通知事件(如SIGINT),适合事件通知,不传大数据;
Socket:网络套接字,适合跨主机/跨设备通信,也常用于本机进程通信(Unix域套接字)。
第四,选择。小数据/事件用信号或消息队列;大数据、高频、低延迟用共享内存+信号量;跨设备/跨主机用Socket;简单流式用管道。实际系统常组合使用(如共享内存传数据+信号量同步+信号触发)。












