liunx是多任务操做系统,但当任务数量大于CPU数量时,系统会在很短的时间内将CPU轮流分配给任务,并非全部的任务都在同时运行。多线程
每一个任务在运行前,系统都须要事先设置好CPU寄存器和程序计数器。
CPU寄存器是CPU内置的容量小速度极快的内存,程序计数器是用来存储CPU正在执行的指令位置、或者即将执行的下一条指令位置。他们称为CPU的上下文。性能
CPU上下文切换指的是CPU将当前任务的CPU寄存器和程序计数器保存起来,而后加载新任务CPU寄存器和程序计数器,再跳到新任务的程序计数器指的位置,运行新任务。操作系统
保存起来的CPU上下文会存储在系统内核中,等待任务从新调度。线程
保存CPU上下文和恢复CPU上下文是须要系统内核在CPU上运行才能完成的。对象
CPU上下文切换大致能够分为三种,进程上下文切换、线程上下文切换、中断上下文切换。进程
进程上下文切换事件
进程的上下文切换是指从一个进程切换到另外一个进程运行。内存
liunx将进程的运行空间分为内核空间和用户空间。
内核空间具备最高等级,能够直接访问全部系统资源。
用户空间只能访问有限资源,不能直接访问内存等硬件设备,必须经过系统调用深刻内核才能访问这些资源。资源
进程是由内核来管理和调度的,进程的切换只能发生在内核态。进程的上下文不只包括了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的状态。多进程
进程能够在这内核空间和用户空间运行,分别称为进程的用户态和进程的内核态。
从用户态到内核态的转变须要经过系统调用来完成,须要进行CPU上下文切换,保存用户态的CPU上下文,加载内核态的CPU上下文,结束后相反,其中发生了两次CPU上下文切换。这一切都在同一个进程中进行,会消耗系统资源,但并非进程的CPU上下文切换。
进程的上下文切换比系统调用多一步,在保存当前进程的内核状态和CPU寄存器以前,须要先把该进程的虚拟内存和栈等保存下来,而加载了下一个进程的内核状态和CPU寄存器以后,还须要刷新下一个进程的虚拟内存和栈等。
进程上下文切换次数较多,很容易致使CPU将大量时间耗费在寄存器、内核栈以及虚拟内存等资源的保存和恢复上,大大缩短了真正运行进程的时间。致使平均负载升高。
线程的上下文切换
线程和进程的区别,线程是调度的基本单位,进程时资源拥有的基本单位,怎么理解呢?所谓内核中的任务调度,实际上调度的对象是线程,而进程时给线程提供虚拟内存、全局变量等资源的。
你也能够这样理解:
当进程只有一个线程时,能够认为进程就等于线程;
当进程拥有多个线程时,这些线程共享相同的虚拟内存和全局变量等资源,这些资源在上下文切换时并不须要修改。
当线程也有本身的私有数据时,好比本身的栈和寄存器,上下文切换时也须要保存。
根据上面描述的,线程的上下文切换就存在两种状况:
切换同一进程的线程比切换进程消耗更少的系统资源,这就是多线程对比多进程的优点。
中断上下文切换
中断处理拥有比进程更高的优先级
为了快速响应硬件的事件,中断处理会打断进程的正常调度和执行,转而执行中断处理程序,响应设备事件。在打断进程时,须要将当前进程的状态保存下来,中断结束后,再恢复到原有的状态。
中断上下文切换不涉及到进程的用户态。因此即使中断过程打断的是一个正在处于用户态的进程,也不须要保存和恢复这个进程的虚拟内存和全局变量等用户态资源。中断上下文只包括内核态中断服务程序执行所必须的状态,包括CPU寄存器、内存堆栈、硬件中断参数等。
通常中断程序都是短小的。力求尽快执行完成,但当发生过多的中断次数时,也可能带来严重的系统性能问题。
by kocor