0%

上下文切换

上下文

首先就要知道,什么是上下文(Context)。一直非常疑惑,到底什么叫上下文。也没太好意思问人,感觉就是很简单的概念。这个观点,也是我去年使用ai的时候,才知道上下文,但是,我理解为上一句话和下一句话,全部组合起来就是上下文,当时,我就是这样去询问ai的。

百度百科的介绍就是:技术系指将一长串的文字或内容,从其中分析出该个段落的摘要以及大意,甚至更进一步,将整篇文章的文意整理出来。此项技术可以应用在解读影片、音讯等档案,使得搜索引擎能够搜寻到文字以外的物件,方便使用者省去大量时间观看影片、聆听音讯,同时也可以帮助使用者提前了解影片与音讯的内容。

上下文简单说来就是一个环境,相对于进程而言,就是进程执行时的环境。
具体来说就是各个变量和数据,包括所有的寄存器变量、进程打开的文件、内存信息等。

进程上下文
可以说:
当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称为该进程的上下文。

也可以说:
所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。

进程切换:
当内核需要切换到另一个进程时,它需要保存当前进程的 所有状态,
即保存当前进程的上下文,以便在再次执行该进程时,能够必得到切换时的状态执行下去。

上下文切换

其实,我们可以把上下文当成一个环境来理解,在RTOS中,每个任务都是属于自己的进程堆栈空间,此时的切换就是可以看成是不同任务之间的切换。这时候上下文环境就是每个任务专属的堆栈空间。

进程上下文的三个部分:用户级上下文、寄存器上下文以及系统级上下文
一个进程的上下文可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。

  • 用户级上下文: 正文、数据、用户堆栈以及共享存储区;
  • 寄存器上下文: 通用寄存器、程序寄存器(IP)、处理器状态寄存器(EFLAGS)、栈指针(ESP);
  • 系统级上下文: 进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈。

当发生进程调度时,进行进程切换就是上下文切换(context switch)。
操作系统必须对上面提到的全部信息进行切换,新调度的进程才能运行。

中断上下文

硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。
这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。

特点:
中断上下文也称原子上下文,该上下文中执行的代码不可阻塞

中断上下文切换:
在发生中断时,内核就在被中断进程的上下文中,在内核态下执行中断服务例程。
但同时会保留所有需要用到的资源,以便中继服务结束时能恢复被中断进程 的执行。

中断上下文代码中注意事项
1.运行于进程上下文的内核代码是可抢占的,但中断上下文则会一直运行至结束,不会被抢占。
所以中断处理程序代码要受到一些限制,在中断代码中不能出现实现下面功能的代码:

2.不能-睡眠或者放弃CPU。
因为内核在进入中断之前会关闭进程调度,一旦睡眠或者放弃CPU,这时内核无法调度别的进程来执行,系统就会死掉。牢记:中断服务子程序一定不能睡眠(或者阻塞)。

3.不能-尝试获得信号量
如果获得不到信号量,代码就会睡眠,导致如上中的结果。

4.不能-执行耗时的任务
中断处理应该尽可能快,因为如果一个处理程序是IRQF_DISABLED类型,他执行的时候会禁止所有本地中断线,而内核要响应大量服务和请求,中断上下文占用CPU时间太长会严重影响系统功能。中断处理程序的任务尽可能放在中断下半部执行。

5.不能-访问用户空间的虚拟地址
因为中断运行在内核空间。

内核层面看待上下文切换

首先就是切换和保存,这个肯定要调用内核api,然后就是切换虚拟内存,如果是mcu就是直接内存切换,也不用考虑用户和特权之间的虚拟内存不同的问题。给任务一个状态,通知内核去调度它,这有点就绪的意思。

其实没啥东西,就是走一个内核同意,虚拟内存切换,独立堆栈空间切换,用户和特权,cpu使用权等东西

总结

上下文切换,别听着那些工程师吹牛有多厉害,他们自己说不定就解释不清楚,但是,你把它当成一个环境,这样就可以解释很多东西啦

-------------下次的来访是什么时候呢[doge]-------------