1、进程和线程的区别?
-
进程是程序的一次执行实例,拥有独立的地址空间和系统资源,进程间隔离性强、开销大。
-
线程是进程内的执行单元,多个线程共享所属进程的资源,但各自拥有独立的栈和寄存器状态。线程轻量、通信高效,但需同步机制保障安全。
2、RTOS与一般操作系统的区别?
RTOS强调确定性的响应时间,确保任务在规定时间内完成(实时性);而一般操作系统更关注吞吐量和多任务处理。
硬实时系统 :任务必须在严格时间限制内完成,任何延迟都不可接受(如汽车安全气囊、工业控制)。软实时系统:任务应尽量在时间限制内完成,偶尔延迟可容忍(如多媒体播放)。
3、FreeRTOS是什么?有什么特点?
FreeRTOS是一个开源、轻量级、可裁剪的实时操作系统内核,专为资源受限的微控制器设计,支持任务管理、调度、同步、通信、内存管理等核心功能。
特点:
-
开源免费(MIT协议),社区活跃,文档丰富。
-
轻量级,最小可裁剪至几KB的RAM和ROM。
-
支持抢占式调度、时间片轮转、协作式调度。
-
提供丰富的任务间通信机制(队列、信号量、互斥量、事件组等)。
-
支持任务通知(Task Notifications)等高效通信方式。
4、FreeRTOS中任务有哪几种状态?
任务有4种状态:
-
运行态(Running):当前正在执行的任务。
-
就绪态(Ready):已准备就绪,等待CPU执行。
-
阻塞态(Blocked):等待某个事件(延时、信号量、队列等),不占用CPU。
-
挂起态(Suspended):被挂起的任务,不参与调度,需显式恢复。
5、FreeRTOS支持哪些调度策略?
FreeRTOS默认支持:
-
抢占式调度:高优先级任务可随时打断低优先级任务。
-
协作式调度:任务主动让出CPU(如调用taskYIELD()),不支持抢占。
-
时间片轮转:相同优先级任务按时间片轮流执行。
调度器触发时机:系统节拍中断(SysTick)发生时、任务主动阻塞时、中断中唤醒高优先级任务时、任务删除或优先级变更时。
6、什么是死锁?如何预防?
死锁是多个进程/线程互相等待对方释放资源,形成循环依赖,导致所有任务都无法继续执行。
死锁的四个必要条件(互斥、持有并等待、不可剥夺、循环等待),破坏任一即可预防死锁。
预防方法:
-
按固定顺序加锁,所有任务以相同顺序请求资源。
-
一次性请求所有需要的资源(资源一次性分配)。
-
使用超时机制,在请求锁时设置超时,超时则放弃并处理错误。
-
使用银行家算法等动态分配算法。
7、信号量(Semaphore)和互斥锁(Mutex)的区别?
-
互斥锁:用于保护共享资源,确保一次只有一个任务访问,避免数据竞争。具有优先级继承机制防止优先级反转。
-
信号量:用于任务间同步和资源管理。分为计数信号量(管理多个资源实例)和二进制信号量(功能类似互斥锁,但无优先级继承)。
核心区别:互斥锁用于资源互斥访问,有优先级继承机制;信号量用于同步和资源计数,更灵活。
8、什么是优先级反转?如何解决?
优先级反转是指低优先级任务持有资源时阻塞了高优先级任务,而中等优先级任务抢占CPU使低优先级任务无法释放资源,导致高优先级任务被间接阻塞。
解决方案:
-
优先级继承:持有资源的低优先级任务暂时继承等待它的最高优先级任务的优先级,直到释放资源。
-
优先级天花板协议:将共享资源的优先级设为系统中可能访问该资源的最高优先级。
9、什么是任务切换?任务切换时发生了什么?
任务切换是操作系统将处理器从一个任务切换到另一个任务的过程:
-
保存当前任务上下文(寄存器、PC、栈指针等)到任务栈中。
-
选择下一个要运行的任务(按优先级调度算法)。
-
从新任务栈中恢复其上下文。
-
执行新任务。
10、Linux内核空间和用户空间的通信方式有哪些?
系统调用、ioctl、netlink、mmap共享内存、管道/命名管道、消息队列、信号、socket。
11、Linux内核的内存分配方式有哪些?
-
伙伴系统:管理物理页框,分配大内存,通过合并相邻空闲块解决外部碎片。
-
slab/slub/slob:基于伙伴系统,分配小内存,缓存常用内核对象。
-
vmalloc:分配虚拟地址连续但物理地址可能不连续的内存。
-
kmem_cache:slab的专用对象缓存池。
12、FreeRTOS中任务间通信有哪些方式?
-
队列(Queue):任务间传递数据,支持FIFO,可阻塞等待。
-
信号量(Semaphore):任务同步和资源管理(二进制信号量、计数信号量、互斥量)。
-
事件组(Event Groups):一个任务等待多个事件,支持"与/或"条件。
-
任务通知(Task Notifications):轻量级、高效的同步方式,每个任务自带通知值。
-
消息缓冲区(Message Buffer)/流缓冲区(Stream Buffer):用于变长数据传输。