CPU虚拟化的目标是通过时分共享(Time-Sharing)模拟多个CPU的环境,其核心在于进程的调度和执行,使得每个应用程序都运行在抽象的CPU上。

1.1 进程抽象

进程(Process)是正在运行的程序,操作系统通过进程控制块(Process Control Block, PCB)来管理进程的状态和资源使用信息。进程的关键属性包括:

  • PID(Process Identifier):唯一标识进程的数字。
  • 状态(State):进程的当前状态,如就绪、运行、阻塞等。
  • 地址空间(Address Space):进程可访问的内存范围。
  • 硬件状态(Hardware State):包括寄存器、程序计数器等CPU硬件信息。

进程的创建和销毁依赖于系统API(Application Programming Interface),例如:

  • fork():创建一个子进程,复制父进程的地址空间。
  • wait():使父进程等待子进程结束并获取其退出状态。
  • exec():用新程序替换当前进程的地址空间。
  • kill():向进程发送信号。

1.2 进程执行模型

直接执行(Direct Execution)

进程可以直接在硬件上运行,操作系统作为库(Library OS)提供所需服务。这种模型缺乏监控,导致潜在的安全和效率问题,通常适用于互信环境。

更详细的说,直接执行方式下,操作系统不干涉进程的执行流程,进程的所有指令都直接在硬件上执行。这种方法的优点在于执行速度快,但缺点是缺乏对进程行为的控制,可能导致资源争用和系统崩溃。

受限直接执行(Limited Direct Execution)

操作系统使用事件处理模型(Event Handling Model)来确保进程的安全执行:

  • 拥有内核模式(Kernel Mode)和用户模式(User Mode),以此限制进程执行特权指令。
  • 采用抢占式多任务(Preemptive Multitasking),通过时钟中断(Timer Interrupt)强制CPU控制权的返回。

这种机制通过上下文切换(Context Switching)来管理内核与用户模式的转换,确保每个进程能正确恢复执行。

更详细的说,受限直接执行要求操作系统监控并限制进程的权限。特权指令只能在内核模式下执行,而普通指令则在用户模式下执行。时钟中断确保操作系统可以在必要时打断进程,进行调度或处理其他事件。

1.3 进程调度

进程调度(Process Scheduling)是通过上下文切换选择新进程运行的一项任务,调度的关键是优化周转时间(Turnaround Time)和响应时间(Response Time)。

进程调度策略

  • FIFO(First In, First Out):先到先得的调度策略,简单但可能导致长时间的等待。
  • SJF(Shortest Job First):优先执行最短的任务,优化平均周转时间,但可能导致长任务饥饿。
  • STCF(Shortest Time-to-Completion First):优先执行剩余时间最短的任务,类似于SJF,但更适合抢占式调度。
  • Round Robin(RR):时间片轮转调度,为每个任务分配固定时间片,确保公平性。
  • MLFQ(Multilevel Feedback Queue):多级反馈队列,不需要任务执行时间的先验知识,通过多队列系统降低响应和周转时间。
  • Lottery Scheduling:彩票调度,通过随机选择进程分配CPU时间,确保每个任务都有执行的机会。
  • Stride Scheduling:步调调度,给每个进程分配一个步调值,通过步调值决定进程执行的优先级。
  • CFS(Completely Fair Scheduler):完全公平调度器,按照进程权重分配使用时间,反映在虚拟运行时间(vruntime)上,以保持平等分配。

MLFQ策略

多级反馈队列(Multilevel Feedback Queue, MLFQ)不需要任务执行时间的先验知识,通过多队列系统降低响应和周转时间。任务初始进入高优先级队列,并结合轮转算法(Round Robin)调度。随着时间的推移,若任务未完成,则逐渐降低其优先级。此外,MLFQ定期重置优先级,以防止任务长期处于低优先级队列中。MLFQ已被Windows等操作系统采用。

更详细的说,MLFQ通过动态调整任务优先级,实现了对不同性质任务的有效调度。高优先级任务能够迅速得到处理,而长时间占用CPU的任务则会逐渐降低优先级,从而减少对其他任务的影响。

CFS策略

完全公平调度器(Completely Fair Scheduler, CFS)按照进程权重(Weight)分配使用时间,反映在虚拟运行时间(Virtual Runtime, vruntime)上,以保持平等分配。当前被Linux系统广泛应用。

CFS在调度周期内公平分配进程资源,通过nice值影响优先级,使调度更加灵活,是Linux的主流调度策略。这种策略通过红黑树(Red-Black Tree)管理调度进程,保证操作效率(复杂度为O(logN))。

更详细的说,CFS使用vruntime来衡量进程的实际执行时间,并根据权重调整进程的调度优先级。红黑树的数据结构使得CFS能够快速找到下一个需要调度的进程,确保系统在高负载下仍然保持高效。

总结

CPU虚拟化通过进程调度和执行模型的抽象,使得每个进程都能独立运行在虚拟化的CPU上。直接执行和受限直接执行模型分别代表了两种不同的执行方式,操作系统通过各种调度策略优化系统资源的使用,确保系统的公平性和高效性。MLFQ和CFS是现代操作系统中常用的调度策略,各自具有不同的优势,广泛应用于不同的操作系统中。