1. 前后台程序与实时操作系统的区别是什么?
- 前后台程序:在前后台系统中,通常只有一个后台任务和一个前台任务。前台任务响应中断或事件,而后台任务则在没有事件时运行。整个系统结构简单,但对时间敏感的任务响应较差。
- 实时操作系统:在实时操作系统(RTOS)中,多个任务可以被调度,系统通过任务调度器管理任务的执行顺序。RTOS可以保证高优先级任务得到及时的处理,更适合复杂系统中的实时响应需求。
2. 实时系统的基本特性有哪些?
- 确定性:系统能够在确定的时间内完成指定任务,确保任务按时完成。
- 可预测性:系统能够预测在特定条件下的行为,保证在任何情况下系统都能做出可预见的响应。
- 高可靠性:系统能够长时间运行且不出错,尤其在关键应用中,可靠性至关重要。
3. 什么是不可剥夺型内核?它的特点是什么?
- 不可剥夺型内核:任务一旦获得CPU资源,就会持续运行直到它自愿放弃控制权(例如任务完成或主动让出)。这种内核简单且容易实现,但响应性较差,容易引发优先级反转问题。
4. 可剥夺型内核的定义及适用场景是什么?
- 可剥夺型内核:任务在运行时可以被更高优先级的任务打断,从而提高系统的响应能力。适用于需要快速响应外部事件且多任务并行处理的实时系统中。
5. 什么是可重入型函数?它有什么特点?
- 可重入型函数:指在任何时刻被多个任务并发调用时都能正确执行的函数。特点是:
- 不使用静态或全局变量。
- 不依赖于单独的资源或使用互斥机制保护共享资源。
6. 使用可剥夺型内核时,为什么不应直接使用不可重入型函数?
在可剥夺型内核中,不同任务可能会同时调用同一个函数。如果该函数是不可重入的,会导致任务间数据共享和竞争,进而引发未定义行为或数据损坏。
7. 为什么应用程序一定要使用空闲任务?
- 空闲任务:空闲任务是RTOS内核自带的最低优先级任务。当没有其他任务执行时,调度器会运行空闲任务。空闲任务的主要功能是进行系统维护,如回收堆内存、低功耗模式等。确保系统资源得到有效管理。
8. volatile
关键字的作用是什么?在什么情况下需要使用?
volatile
:用于告知编译器不要对该变量进行优化,每次访问都要从内存读取。通常用于访问硬件寄存器、信号量、或者被多个任务或中断处理程序修改的变量。
9. 变量声明时使用volatile
修饰的情况有哪些?
- 硬件寄存器映射的变量。
- 可能在中断程序中改变的变量。
- 多任务环境下,任务之间共享的全局变量。
10. 一个参数可以同时是const
和volatile
吗?为什么?
- 可以。
const
表示该参数不能被程序修改,而volatile
表示每次访问该变量时都要重新读取。典型应用是只读的硬件寄存器,它们的值可能会随时改变,但程序不能修改它们。
11. 一个指针可以是volatile
吗?请解释。
- 可以。
volatile
修饰指针时,表示指针本身所指向的地址是不可预测的。编译器不能优化指针的解引用操作,每次都需要重新读取。
12. 函数int square(volatile int *ptr)
能实现预期目标吗?为什么?
- 能实现预期目标。
volatile
确保在每次计算时都重新读取*ptr
的值,避免编译器优化掉对*ptr
的访问,保证函数每次都使用最新的值来计算平方。
13. 临界区和临界资源的定义是什么?
- 临界区:指访问共享资源的代码段,必须保证一次只允许一个任务进入,以防止数据竞争。
- 临界资源:被多个任务共享且可能引发竞争的资源,访问它时需要保护机制(如互斥锁)。
14. 什么是原子操作?原子性如何影响临界资源的保护?
- 原子操作:指不可被中断的操作,能够一次性完成。原子操作保证在多任务环境中不引发竞争,从而保护临界资源。
15. 如何通过关中断来保护临界资源?
关中断可以阻止中断处理程序打断当前任务,从而防止在访问临界资源时发生竞争。但关中断的范围和时间要控制得当,否则会影响系统的实时性。
16. 什么是自旋锁?它的主要用途是什么?
- 自旋锁:在等待锁释放时,任务会忙等待(不断检查锁的状态),适用于短时间锁定的场景,避免任务切换带来的开销。
17. 死锁的概念是什么?如何避免死锁?
- 死锁:指多个任务互相等待对方释放资源,从而都无法继续执行。避免死锁的措施包括:按固定顺序请求资源、使用超时机制、或者使用死锁检测机制。
18. uCOS操作系统中的任务是如何组成的?
uCOS中的任务由任务控制块(TCB)、堆栈空间、任务代码和任务状态组成。TCB保存任务的优先级、状态、堆栈指针等信息。
19. 什么是空任务控制块链表?它与任务控制块链表有什么区别?
- 空任务控制块链表:保存系统中未使用的任务控制块。任务控制块链表则保存当前正在运行的或等待运行的任务控制块。
20. uCOS的启动过程是怎样的?
uCOS启动过程包括:
- 系统初始化,创建任务控制块和堆栈。
- 创建空闲任务和其他应用任务。
- 启动任务调度器,开始调度任务。
21. 任务的五种状态分别是什么?
- 就绪态:任务可以立即执行。
- 运行态:任务正在执行。
- 阻塞态:任务等待资源或事件。
- 挂起态:任务被挂起,暂时不会执行。
- 终止态:任务已完成或被删除。
22. FreeRTOS的调度方式是什么?
FreeRTOS采用优先级抢占调度方式,最高优先级的任务会被立即调度执行。也支持时间片轮转调度,以在同优先级任务间分配CPU时间。
23. FreeRTOS的任务栈是如何设定的?参考依据是什么?
任务栈的大小在创建任务时设定,依据任务所需的最大栈空间(包括局部变量、函数调用深度等)来设置。如果栈空间不足,可能导致栈溢出和不可预测的行为。
24. FreeRTOS中使用的IPC通信方式有哪些?
- 队列(Queue):用于任务间或任务与中断间传递数据。
- 信号量(Semaphore):用于同步任务或保护共享资源。
- 互斥锁(Mutex):用于任务间互斥访问资源。
- 事件组(Event Group):用于任务间的多条件同步。
25. Linux中FTP服务和SMTP服务的默认端口分别是多少?
- FTP服务:默认端口是21。
- SMTP服务:默认端口是25。
26. 操作系统采用缓冲技术的目的是什么?
缓冲技术通过暂时存储数据,减少I/O操作的频率,从而提高系统性能和资源利用率。
27. 红黑树与AVL树的主要区别是什么?
- 红黑树:通过颜色属性(红/黑)保证在插入或删除后树的高度近似平衡,插入和删除操作更快。
- AVL树:严格平衡二叉树,高度平衡因子为-1、0、1,查询性能稳定但插入和删除操作可能更复杂。
28. Servlet的生命周期可以分为哪几个阶段?
- 加载和实例化:Servlet类被加载并实例化。
- 初始化:调用
init()
方法,Servlet被初始化。 - 请求处理:每次请求调用
service()
方法。 - **销
毁**:调用destroy()
方法,Servlet被销毁。
29. Linux执行ls
命令时,会引起哪些系统调用?
执行ls
命令时,可能涉及的系统调用包括open()
、read()
、write()
、getdents()
(读取目录内容)、close()
等。
30. FreeRTOS移植到哪些平台,移植过程占用哪些硬件资源?
FreeRTOS可以移植到多种微控制器平台,如ARM Cortex-M、AVR、PIC等。移植过程中,主要占用的硬件资源包括:
- 内存:任务堆栈、任务控制块和系统堆栈。
- 处理器时间:用于任务调度和上下文切换。
- 定时器:用于时间片调度和定时操作。