进程是什么?
进程是对计算机系统对正在运行的程序的一种抽象
什么是上下文?
系统保持跟踪程序运行期间所需的所有状态信息,这种状态称为‘上下文’,上下文切换的信息会一直被保存在CPU的内存中,直到被再次使用。
什么是上下文切换?
上下文切换 就是把当前正在cpu寄存器运行的进程 切换到并运行另一个进程。这个切换的过程描述为 ‘上下文切换’。
切换的原因?切换的流程
引起线程上下文切换的原因如下
(1)当前正在执行的任务完成,系统的CPU正常调度下一个任务。
(2)当前正在执行的任务遇到I/O等阻塞操作,调度器挂起此任务,继续调度下一个任务。
(3)多个任务并发抢占锁资源,当前任务没有抢到锁资源,被调度器挂起,继续调度下一个任务。
(4)用户的代码挂起当前任务,比如线程执行yield()方法,让出CPU。
(5)硬件中断。
上下文的切换流程如下
(1)挂起一个进程,将这个进程在CPU中的状态(上下文信息)存储于内存的PCB中。
(2)在PCB中检索下一个进程的上下文并将其在CPU的寄存器中恢复。
(3)跳转到程序计数器所指向的位置(即跳转到进程被中断时的代码行)并恢复该进程。
上下文切换的开销
上下文切换会对性能造成负面影响,同时也是是操作系统内核优化的一个关键参数指标。
在任务间发生切换需要花费大量的时间用于处理诸如:保存和恢复寄存器和内存页表、更新内核相关数据结构等操作。
上下文切换通常是计算密集型的。也就是说, 它需要相当可观的处理器时间, 在每秒几十上百次的切换中, 每次切换都需要纳秒量级的时间。所以, 上下文切换对系统来说意味着消耗大量的CPU时间。
从Linux内核内部实现来看, 上下文切换所花费的延迟时间是从调度器选好要调度的任务后到把任务上下文切换到另一个任务所花费的时间。即context_switch () 函数的开销。