1.首先,需要搞明白什么是上下文切换?(面试题)
上下文切换就是从当前执行任务切换到另一个任务执行的过程。但是,为了确保下次能从正确的位置继续执行,在切换之前,会保存上一个任务的状态。
2. 然后,需要明白进程与线程的区别?(网上很多,这里简单说明)
1).线程是进程的一部分。进程是表示资源分配的基本单位,又是调度运行的基本单位,是程序执行的一个实例; 线程是进程中执行运算的最小单位,即执行处理机调度的基本单位,是进程中的一个执行流。
2).内存空间不同。每一个进程拥有自己独立的内存空间,而线程共享进程的内存空间。
3. 所以,进程上下文切换与线程上下文切换最主要的区别就是线程的切换虚拟空间内存是相同的(因为都是属于自己的进程),但是,进程切换的虚拟空间内存则是不同的。
同时,这两种上下文切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。
线程上下文切换比进程上下文切换快的多。
补充:多线程是如何实现的?
主要是cpu通过给每个线程分配cpu时间片来实现多线程的。即使是单核处理器(cpu)也可以执行多线程处理。
时间片是cpu分配给各个线程的时间,因为时间片非常短,所以cpu通过不停地切换线程执行,让我们感觉多个线程时同时执行的,时间片一般是几十毫秒(ms)。
4. 在进行上下文切换时,cpu通过时间片分配算法来循环执行任务,java中的时间片分配算法有哪些?
最简单最常用的就是基于时间片轮转调度算法。时间片轮转调度算法是非常公平的处理机分配方式,可以使就绪队列的每个进程每次仅运行一个时间片。
原理:在时间片轮转调度算法中,系统根据先来先服务的原则,将所有的就绪进程排成一个就绪队列,并且每隔一段时间产生一次中断,激活系统中的进程调度程序,完成一次处理机调度,把处理机分配给就绪队列队首进程,让其执行指令。当时间片结束或进程执行结束,系统再次将cpu分配给队首进程。