线程池有了解吗?

线程池就是预先创建一组线程,放在一个「池子」里等待任务。当有新任务到来时,从池中取一个空闲线程去执行,执行完后线程不销毁,而是归还到池中继续等待。

核心优势:

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 支持三种调度策略,默认是 抢占式 + 时间片轮转 组合。

  1. 抢占式调度(Pre-emptive,默认)
    核心规则:高优先级就绪任务可立即抢占当前低优先级任务,无需等待当前任务主动让出 CPU。
  2. 时间片轮转调度(Time-Slicing,同优先级)
    核心规则:相同优先级的就绪任务轮流执行,每个任务运行一个时间片(默认 1ms)后切换。
  3. 合作式调度(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 做事件驱动
  • 全局变量 + 锁:简单直接,但要注意同步
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐