【嵌入式刷题进程与线程(二)】
(关中断 / 关调度器会阻塞整个系统,Mutex 只阻塞竞争的任务,不影响其他任务和中断)进程有独立地址空间,创建/切换开销大,通信需IPC,但互不影响安全性高。线程共享进程地址空间,创建/切换轻量,直接读写共享变量,但一个崩溃全部完蛋。线程池就是预先创建一组线程,放在一个「池子」里等待任务。当有新任务到来时,从池中取一个空闲线程去执行,执行完后线程不销毁,而是归还到池中继续等待。线程是CPU调度
嵌入式刷题进程与线程(二)
- 线程池有了解吗?
- 进程和线程的区别是什么?在嵌入式Linux开发中,什么情况下选择多进程,什么情况下选择多线程?
- 进程和线程的区别是什么?进程/线程间常见的通信方式有哪些?
- 进程跟线程的区别是什么?二者应用场景分别是什么?
- 除了按序获取,还有什么更常见的方法?
- FreeRTOS中任务调度方式有哪些?怎么设置任务优先级?抢占式调度和非抢占式调度有什么区别?
- FreeRTOS临界资源保护有哪些方式?最简单的锁方案是什么?
- FreeRTOS任务划分怎么做的?如何根据功能模块合理划分任务?
- FreeRTOS的调度是通过哪个中断进行的?在哪个中断进行一次任务管理?
- Linux 下多线程之间可以通过哪些方式通信?
线程池有了解吗?
线程池就是预先创建一组线程,放在一个「池子」里等待任务。当有新任务到来时,从池中取一个空闲线程去执行,执行完后线程不销毁,而是归还到池中继续等待。
核心优势:
1.避免频繁创建/销毁线程的开销
2.控制并发数量,防止线程爆炸
(最多只开 8 个线程
剩下任务排队
CPU 始终稳定,不会过载)
3.任务排队,用队列缓冲突发请求
进程和线程的区别是什么?在嵌入式Linux开发中,什么情况下选择多进程,什么情况下选择多线程?
进程是操作系统资源分配的基本单位,有独立的地址空间、文件描述符等资源;线程是CPU调度的基本单位,同一进程的线程共享地址空间和资源。
核心区别:
- 进程间内存隔离,通信需要IPC机制;线程共享内存,通信简单但要做同步
- 创建/切换进程开销大,线程开销小
- 一个线程崩溃可能影响整个进程,进程间互不影响
选择依据:
- 多进程:需要高隔离性(如服务端不同请求)、防止一个模块崩溃拖垮全部
- 多线程:需要频繁共享数据(如音视频编解码)、追求低开销和高性能
- 嵌入式Linux中,数据密集共享用多线程,独立性要求高的用多进程。
进程和线程的区别是什么?进程/线程间常见的通信方式有哪些?
进程 vs 线程:
进程有独立地址空间,是资源分配单位;线程共享进程空间,是调度单位
进程切换开销大(需要切换页表等),线程切换开销小(只切换寄存器和栈)
进程间相互隔离安全性高,线程间共享数据方便但需要同步
进程间通信(IPC)
管道(匿名管道 / 命名管道 FIFO)
消息队列
共享内存
信号量
信号
套接字(Socket)
选择原则:同机大数据量用共享内存,小数据量用管道/消息队列,跨网络用 Socket。
线程间通信
全局变量 / 共享内存(天然共享)
互斥锁、信号量、条件变量、屏障
线程私有数据(不共享)
进程跟线程的区别是什么?二者应用场景分别是什么?
简单来说:进程是资源分配的基本单位,线程是CPU调度的基本单位。
进程有独立地址空间,创建/切换开销大,通信需IPC,但互不影响安全性高。线程共享进程地址空间,创建/切换轻量,直接读写共享变量,但一个崩溃全部完蛋。
应用场景:进程适合需要隔离和安全的场景;线程适合需要高效协作和共享数据的场景。嵌入式RTOS中的"任务"更接近线程——共享地址空间,各有独立栈。
除了按序获取,还有什么更常见的方法?
按序获取是什么意思?
线程 1 只能拿第 1、3、5… 个任务
线程 2 只能拿第 2、4、6… 个任务
线程和任务是绑定顺序的,不能乱拿
更常见:使用公共任务队列 + 线程竞争获取
“所有任务放进同一个队列
所有线程都去这个队列取任务
谁先空闲,谁就取下一个可用任务
不绑定顺序,不按固定线程分配”
这就是线程池、生产者 - 消费者模型的标准做法。
FreeRTOS中任务调度方式有哪些?怎么设置任务优先级?抢占式调度和非抢占式调度有什么区别?
一、FreeRTOS 任务调度方式(3 种)
FreeRTOS 支持三种调度策略,默认是 抢占式 + 时间片轮转 组合。
- 抢占式调度(Pre-emptive,默认)
核心规则:高优先级就绪任务可立即抢占当前低优先级任务,无需等待当前任务主动让出 CPU。 - 时间片轮转调度(Time-Slicing,同优先级)
核心规则:相同优先级的就绪任务轮流执行,每个任务运行一个时间片(默认 1ms)后切换。 - 合作式调度(Co-operative,非抢占式)很少用
核心规则:任务必须主动调用 taskYIELD()、vTaskDelay() 或进入阻塞,才会释放 CPU;调度器不会强制切换。
优先级值越大越高(0最低),xTaskCreate() 指定初始优先级,运行时 vTaskPrioritySet() 动态修改。
抢占式保证高优先级的实时性,时间片轮转保证同优先级的公平性。
FreeRTOS临界资源保护有哪些方式?最简单的锁方案是什么?
临界资源:多个任务 / 中断会同时访问、修改的变量、缓冲区、硬件寄存器等,不能同时被操作,否则数据会乱。
1.关中断(最简单):taskENTER_CRITICAL() / taskEXIT_CRITICAL(),适合极短临界区
2.挂起调度器:vTaskSuspendAll(),只禁止任务切换不关中断
3.互斥量Mutex:任务级的锁,支持优先级继承
4.二值信号量:简单同步/互斥,不支持优先级继承(支持优先级继承的 “二值信号量” = 互斥锁(Mutex))
5.计数信号量:控制同时访问的任务数
最简单方案就是关中断,但持续时间要尽可能短。任务间互斥推荐用Mutex。(关中断 / 关调度器会阻塞整个系统,Mutex 只阻塞竞争的任务,不影响其他任务和中断)
FreeRTOS任务划分怎么做的?如何根据功能模块合理划分任务?
FreeRTOS任务划分原则:
- 按功能模块:传感器采集、通信、显示、控制各一个任务
- 按实时性:要求高的给高优先级独立任务
- 按阻塞行为:等待不同事件的逻辑分到不同任务
建议:不要太多任务(5-10个),高优先级任务要短、处理完就阻塞,用消息队列/事件组做任务间协调。
典型划分:传感器采集(中)→ 数据处理(中)→ 控制输出(高)→ 通信(中)→ 日志(低)。
FreeRTOS的调度是通过哪个中断进行的?在哪个中断进行一次任务管理?
FreeRTOS调度涉及两个关键中断:
- SysTick:周期性触发(默认1ms),更新时钟节拍、检查延时任务是否到期。如果需要切换就挂起
- PendSV:实际执行上下文切换,被设为最低优先级,确保所有其他中断处理完后才切换
为什么用PendSV而不在SysTick里切换?因为SysTick可能打断其他中断,PendSV在最低优先级执行保证切换时没有中断在处理。
(SysTick 是定时中断,优先级比较高
如果在 SysTick 中断里直接做任务切换
→ 它可能突然打断正在执行的其他中断
切换上下文是大事,不能在别的中断没执行完时乱切
→ 会出问题、会崩溃)
Linux 下多线程之间可以通过哪些方式通信?
Linux 下多线程通信的方式:
- 互斥锁 + 条件变量:最常用的生产者-消费者模式,条件变量实现阻塞等待和通知
- 信号量(sem_t):控制并发数量或做同步通知
- 读写锁:允许多个线程同时读,但同一时间只能一个线程写
- 原子操作:简单标志位和计数器
- 管道(pipe)/ eventfd:线程间也可以用,配合 epoll 做事件驱动
- 全局变量 + 锁:简单直接,但要注意同步
更多推荐



所有评论(0)