我知道在内核空间中运行时不能抢占进程。如果这是真的,在 RTOS 中如何保证响应性(如果系统调用需要更多时间来执行)?即使在内核空间中运行,也可以为进程执行上下文切换吗?
3 回答
In a RTOS, each process has a minimum time to run, and the system calls are documented and implemented in a way that ensures the worst case, the maximum time it takes to complete. That is, when you call for example, open()
, the RTOS's system call documentation has a worst time field. If the call doesn't complete in, say 100ms, then it will fail. Application development for RTOS is really different from developing for a general OS. You have to take in account each call's time and such. For example, on QnX you have to tell the OS the maximum response time. If your process doesn't complete in that frame, it will be terminated.
Note: QnX is a RTOS for x86.
进程能否被抢占取决于进程状态的设计。在 linux 上,您有 UNITERUPTIBLE_SLEEP 进程睡眠仍然完成了它所请求的某个服务。(前读)。可能会发生服务从未完成并且进程从未收到信号并且无限休眠(保持系统资源)的情况。
在 RTOS 的情况下,这种方法是不合理的,因为资源(Ex 内存)稀缺。因此,进程永远不会处于 UNITERUPTILBE 状态。因此,操作系统可以过早地向休眠/等待某些服务的进程发送信号。因此,操作系统对进程有更大的控制权,也允许它控制系统资源。
正如@Levente Kurusa 所指出的那样,操作系统可以在一段时间后向进程发送信号,使其要么向操作系统屈服控制(时间切片执行,确保良好的响应时间),要么在等待服务时终止它很久。
RTOS 架构差异很大,因此无法做出一般性陈述。内核空间的概念本身甚至可能与特定的 RTOS 无关,这取决于其设计和运行平台。例如,没有 MMU 的目标无法真正实现这个概念,尽管一些目标具有可能被内核使用的中断或主管的特权执行模式,但这不是一回事,只涉及堆栈和寄存器集的切换和访问某些指令而不是管理内存和 I/O 空间。
许多 RTOS 只是调度内核,仅提供任务调度、计时器、同步和 IPC,并作为静态库提供,因此最终应用程序是单片的。大多数情况下,所有线程都共享一个内存空间,并且由于未实现任务模型,因此“进程”而不是“轻量级”线程的概念。如果有“内核空间”的概念,那么通常只有操作系统调度程序本身会在该模式下运行,所有任务、线程或进程都在该“空间”之外运行。
一个确实广泛使用 MMU 并使用“进程”模型的操作系统是 QNX,它使用微内核架构,因此只有很小一部分系统负责调度在“内核空间”中运行,大部分操作系统和所有用户进程在此之外运行。
然而,在 RTOS 中,中断要么永远不会被禁用,要么会在尽可能短的时间内被禁用,并且调度程序本身是完全确定的。
要更好地理解 RTOS 概念,请查看 Jack Ganssle 的此在线课程。