嵌入式操作系统任务切换方法对比分析
①切换虚拟内存映射,即负责把虚拟内存从被切换下来的进程映射到新进程中,该功能由函数switcn_mm()实现。
②切换进程的寄存器状态,即负责从一个进程的处理器状态切换到新进程的处理器状态,该功能由函数switcn_to()实现。
在多任务系统中,都会提供一个系统函数来进行进程(任务)间切换,综合来说,它们有两种进程(任务)切换方式:
①由进程(任务)本身直接调用任务切换函数进行进程(任务)切换。在当前进程(任务)因为不能获得必需的资源而立即被堵塞时,就由进程(任务)本身直接调用进程(任务)切换函数进行进程(任务)间调度。在Linux中可以直接调用schedule()函数来实现。
②延迟调用任务切换函数进行进程(任务)切换。此方式是把当前进程(任务)设置一调度标志而以延迟方式调用任务切换函数进行进程(任务)切换。在Linux系统中,总是在恢复用户态进程执行之前,检查这一调度标志,在这里标志是need_resched,如果有这一标志,就调用调度函数进行进程切换。
此种情况主要包括以下几种:
①当前进程用完了它的CPU时间片,由scheduler_tick()函数完成schedule()的延迟调用。
②当一个被唤醒进程的优先级比当前进程优先级高时,由try_to_wake_up()函数完成schedule()的延迟调用。
③当发出系统调用sched_setscheduler()时。在这些情况中,主要由于系统调用或中断而进入内核态,或者当前进程本来在内核态时,返回用户态时发生的。
在VxWorks系统中,任务的优先级为0~255。任务有4种状态:就绪态、悬置态、休眠态和延迟态,如图3所示。
内核缺省调度机制为基于优先级的抢占式调度。采用这种机制,系统把处理机分配给优先级最高的进程,使之执行。一旦出现优先级更高的进程时,该任务被剥夺CPU使用权,而去执行优先级更高的任务。而在相同优先级的多个任务之间,采用时间片轮转调度机制。采用这种机制,当一个任务到达时,它被安排在轮转队列的后面,等待分配给自己的时间片的到来,如果在时间片内没有结束,则在等待属于自己的时间片的到来,直到任务完成。
在VxWorks系统中,对于优先级相同的任务,如果状态为Ready,则可以通过时间片轮转方式公平享有CPU资源。轮转调度法给处于就绪态的每个同优先级的任务分配一个相同的时间片,该时间片的大小由系统调用KernelTimeSlice决定。
在Windows CE系统中,Windows CE 3.0之后,系统支持的优先级增长到256个,0优先级级别最高,255优先级级别最低。0~247的优先级属于实时性优先级,248~255的优先级一般分配给普通应用程序。Windows CE.NET采用基于动态优先级的抢占式多任务机制,越重要的任务,优先级越高。Windows CE.NET在任务调度中采用任务优先级制、优先级动态调整机制和抢占式调度,都是为了最大限度地满足系统的实时性要求。对于一个优先级只有一个任务的简单系统内核,上述的3种调度足以满足要求,但对于Windows CE.NET这样复杂、高性能的多任务实时内核,由于多个任务允许公用一个优先级,则相同优先级的任务要采用Windows CE.NET提供的时间片轮转法实现。具体实现如图4所示。
在没有更高优先级任务就绪时,相同优先级的任务依照就绪的先后次序执行。执行一定的时间片后,无论任务完成与否,均转入下一任务运行。未运行完的任务释放处理器的控制权后转入就绪队列的末尾,依次往复。这样的轮转策略保证了具有相同优先级的任务平等地享有控制权的处理权。在Windows CE系统中,一般设置的时间片大小为10 ms。
3 总结
本文对几种操作系统的内核的主要部分(任务切换与调度)进行了分析比较,便于理解其实时性、可靠性等方面的优缺点,为以后进行系统的移植和开发打下基础。由于笔者时间和精力有限,而且目前的操作系统很多,本文只分析了4种系统,还不够完善。未来可以对其他更多的实时操作系统进行分析比较。
- 记录仪实时多任务调度策略的研究(07-16)
- 基于S3C44B0X+μcLinux的嵌入式以太网设计(07-08)
- μClinux下SDRAM数据交换区的生成和使用(06-04)
- 基于μCLinux的USB芯片FT245BL驱动程序实现(11-27)
- 基于ADSP—BF533的μClinux嵌入式系统移植与开发(07-31)
- ARM-μCLinux嵌入式系统启动引导的实现(07-26)