cpu上下文:cpu寄存器和程序计数器
进程也可以在用户空间运行也可以在,内核空间运行,在用户空间运行的话,称之为进程的用户态,在内核空间运行的话,称之为进程的内核态。
cpu的上下文切换对应三种情况:
进程上下文切换,线程上下文切换,中断上下文切换
用户态到内核态只能通过系统调用。系统调用将用户态的进程,陷入到内核态。
系统调用:是特殊的上下文切换,特权模式的切换。他是在进程内的上下文切换。首先它先将cpu寄存器中的用户态指令保存,然后为了执行内核态的代码,将cpu寄存器指向内核态指令的位置,然后跳转到内核态执行内核任务。系统调用结束后,恢复之前保存的用户态,恢复到用户态,然后在用户空间继续执行任务。一次系统调用,要经历两次cpu的上下文切换。
进程上下文切换:从一个进程切换到另一个进程。
进程是由系统进行管理和分配的。
进程切换的时候:在恢复上下文的时候,是使用cpu的,这个一部分时间,也是会导致负载均很上升的。因为会将时间浪费在cpu寄存器,内核栈和虚拟内存的恢复和保存中,实际的cpu运算时间变少。
进程什么时候被调用到cpu上的五种情况:
1:由于系统资源不足的时候,会导致当前进程挂起,用系统管理进程的调用。
2:当前进程自行sleep,自动挂起,其他进程就可以进入cpu上。
3:当中断程序启动,会将cpu上的进程挂起,会转为执行内核中的中断进程
4:当进程的时间片执行完了,本进程会被系统挂起,每一个时间片轮询,那么等待中的进程,都有机会可以进入到cpu上。
5:当优先级高的进程来的时候,为了保证优先执行,当前进程会被挂起,转而执行优先级高的进程
线程上下文切换:包括两种情况,线程在不同进程之间的切换,线程在同一个进程之间的切换。
线程是调度的最小单位,进程是资源分配的最小单位。所以实际上来说,所谓的内核调用,其实都是线程之间的切换。进程是为其提供虚拟内存和全局变量等资源。
线程在同一个进程之间的切换:同一个进程在切换的时候,因为全局变量和虚拟内存是共享的不用去切换,可以省下很多资源。当然了线程独有的资源如栈和寄存器是要进行切换的,相对线程在不同进程之间的切换,这也是多线程比较火的原因。
中断上下文切换:为了响应设备硬件的中断,将会中断进程的正常调度和执行。中断进程不涉及用户态,所以当正在执行的进程是在用户空间的话,不用保存用户态进程和恢复不用管其虚拟内存和全局变量等资源。中断进程优先级高于其他的进程。所以当有其他进程在内核执行的话,会被挂起,优先执行中断线程,中断一般是短小精悍的以便于快熟处理。如果中断过多的话,也会影响系统的性能,所以这个中断的话,也是性能检测的一部分。