四 上下文切换

一  前言

 对“平均负载”一课的学习后,你可能会有疑问,进程在竞争cpu的时候并没有正在的运行,为何会导致系统的负载升高,其实贼魁祸首就是“上下文切换”。

我们经常说linux是一个多任务的系统,它支持很多任务同时在运行。这里的“同时”仅仅是一个相对时间,其实他并非真正的在运行,只是系统在很短的时间内,将cpu

轮流分配给他们,造成了错觉。

二  何为“上下文”

任务运行前,cpu都需要知道任务从哪里加载,从哪里开始,这对应cpu的两个概念“寄存器”和“程序计数器”。

cpu寄存器:cpu内置的容量小、但速度极快的内存

cpu计数器:cpu正在执行的指令的位置、或者即将执行的吓一条指令的位置。

而这里的从哪里加载从哪里开始就是“上下文”了。

三  何为“上下文切换”

先把前一个任务的上下文(cpu寄存器和程序计数器)保存下来,然后加载新的任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器的新位置,运行新任务。

保存的上下文会存储在系统内核中,在任务重新被调度时再加载进来,因此不会影响任务的状态,看起来还是连续的。

四 都说“任务”,何为“任务”,有哪些场景

任务:进程,线程、中断等等。

上下文切换的场景:进程上下文切换、线程上下文切换、中断上下文切换

A  进程上下文切换

两个概念:

内核空间:最高权限,可访问所有资源

用户空间:不能访问内存等硬件设备,必须通过系统调用陷入到内核中,才能访问这些资源。

进程状态:内核态进程、用户态进程。

一次系统调用涉及:保存用户态,切换到内核态,然后保存内核态,切换到用户态,所以:一次系统调用,其实发生了两次cpu上下文切换。

五  什么时候会切换、进程什么时候会被调度到cpu上运行

1  进程执行完成

2  cpu时间被划分为一段段时间片,这些时间片被轮流分配给各个进程,但某个进程的时间片被耗尽了,就会被挂起,切换到其他等待cpu的进程上。

3  正在运行的进程资源不足了(内存等等)

4  程序有设置sleep()这样的函数时,也会主动挂起

5  中断,硬件中断,进程会被挂起,转而执行内核中的中断服务程序。 

猜你喜欢

转载自www.cnblogs.com/fengzhihai/p/10071958.html
今日推荐