首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)

1 前景回顾 1.1 Linux的调度器组成 2个调度器 可以用两种方法来激活调度 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测是否有必要...LINUX完全注释中的一段话 当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称 为该进程的上下文。...在LINUX中,当前进程上下文均保存在进程的任务数据结 构中。在发生中断时,内核就在被中断进程的上下文中,在内核态下执行中断服务例程。...Linux相比与其他操作系统(包括其他类 Unix 系统)有很多的优点,其中有一项就是,其上下文切换和模式切换的时间消耗非常少. 3 context_switch进程上下文切换 linux中进程调度时,...另外需要注意, 内核线程没有自身的用户空间上下文, 其task_struct->mm为NULL, 参见Linux内核线程kernel thread详解–Linux进程的管理与调度(十), 从当前进程”借来

4.3K30
您找到你想要的搜索结果了吗?
是的
没有找到

Linux进程核心调度器之主调度器schedule--Linux进程的管理与调度(十九)

__sched前缀的声明, 在include/linux/sched.h, L416, 如下所示 /* Attach to any functions which should be ignored in...内核抢占是Linux 2.6以后引入的一个重要的概念 我们说:如果进程正执行内核函数时,即它在内核态运行时,允许发生内核切换(被替换的进程是正执行内核函数的进程),这个内核就是抢占的。...加快经常性事件, 是程序开发中一个优化的准则, 那么linux系统中最普遍的进程是什么呢?...1.4.4 switch_to切换进程堆栈和寄存器 执行环境的切换是在switch_to()中完成的, switch_to完成最终的进程切换,它保存原进程的所有寄存器信息,恢复新进程的所有寄存器信息,并执行新的进程...检查指定进程need_resched标志 include/linux/sched.h, L2931 // http://lxr.free-electrons.com/source/include/linux

3.6K31

进程切换分析(1):基本框架

switch_to是一个有魔力的符号,和一般的调用函数不同,当A进程在CPUa调用它切换到B进程的时候,switch_to一去不回,直到在某个cpu上(我们称之CPUx)完成从X进程(就是last进程)...到A进程切换的时候,switch_to返回到A进程的现场。...switch_to完成了具体prev到next进程的切换,当switch_to返回的时候,说明A进程再次被调度执行了。 三、switch_to为什么需要三个参数呢?...\ ((last) = __switch_to((prev), (next))); \ } while (0) 一个switch_to将代码分成两段: AAA...谁知道呢(在A进程调用switch_to 的时候是不知道的)?在A进程调用switch_to之后,cpu就执行B进程了,后续B进程切到哪个进程呢?随后又经历了怎样的进程切换过程呢?

10910

一个在关键路径上面隐藏了11个月的BUG:DragonOS进程切换查错

前言的前面 DragonOS是一个从0开始研发内核及用户态环境的,独立自主的,面向服务器领域的开源操作系统,提供Linux兼容性。...,当__switch_to函数返回时,处理器将会弹出63行压入的“下一个进程的RIP”,这样就完成了进程切换。...r=d4f3de93#9 注意,我为了避免歧义,在这里把原本的switch_proc()宏,改名为switch_to().在下文中,将用switch_to来代指前文的switch_proc宏。...BUG的原因之二:switch_to宏的内联汇编,是未定义行为的代码 我重新思考了很久,我坚信问题一定存在于switch_to和__switch_to这两个地方。...我盯着switch_to()宏的代码看了很久,发现它就是有点不对劲!

14330

linux内核上下文切换解析

linux的上下文切换就是进程线程的切换,也就是切换struct task_struct结构体,一个任务的上下文包括cpu的寄存器,内核栈等,由于1个cpu上的所有任务共享一套寄存器,所以在任务挂起的时候需要保存寄存器...但是Linux为了适用更多的cpu架构没使用处理器相关的上下文切换技术,而是大部分通过软件实现。linux上下文切换就在schedule()函数里,很多地方都会调用这个函数。...先看一段linux2.6.18版本还使用O(1)调度算法的schedule函数代码: /* * schedule() is the main scheduler function. */ asmlinkage...看switch_to宏。...然后切换到next内核栈,至此prev进程就被挂起来了,把next上次被挂起的地址压栈,调用__switch_to函数,__switch_to函数返回的时候会直接跳到标号1或者ret_from_fork

1.2K30

Linux进程调度(三)

进行进程切换,switch_to 返回后,进程已经切换完毕 最后调用 finish_task_switch 对上一个进程做一些清理工作 下面我们来看 switch_to 做了什么,它其实是一个宏定义,...如下: switch_to(prev, next, prev); #define switch_to(prev, next, last) \ do { \ ((last)...进程切换不是只是从进程A切换到进程B吗,为什么在 switch_to 中是三个进程: switch_to(prev, next, prev); #define switch_to(prev, next...{ \ ((last) = __switch_to((prev), (next))); \ } while (0) 那么 switch_to 是怎么实现的呢?...你可以注意到,last 是通过 __switch_to 的函数返回值获取的 以进程C切换到进程A为例,进程C将自己的进程描述符地址放到寄存器中,然后切换到进程A,进程A得到 __switch_to 返回值

2.4K10

分析Linux系统的执行过程

()函数 ,验证对Linux系统进程调度与进程切换过程的理解 十、分析switch_to中的汇编代码,理解进程上下文的切换机制,以及与中断上下文切换的关系 总结 原创作品转载请注明出处 + https:...它定义在linux-3.18.6/include/linux/sched.h文件中。 1....建议使用内核Linux-3.18.6来进行实验,这里用到的 5.0.1 内核有些函数名可能发生了变化。...$ b __switch_to 由以上跟踪结果可以得知,在进行进程间的切换时,各处理函数的调用顺序如下:pick_next_task -> context_switch -> __switch_to...十、分析switch_to中的汇编代码,理解进程上下文的切换机制,以及与中断上下文切换的关系 函数的调用关系: schedule() --> context_switch() --> switch_to

89620

操作系统进程的实现---中---05

操作系统进程的实现---中---05 内核级线程实现 核心级线程的两套栈,核心是内核栈… 整个故事要从进入内核开始——某个中断开始… 切换五段论中的中断入口和中断出口 switch_to难点分析 另一个故事...下面先来看看sys_fork执行完后的代码 将当前线程PCB赋值给eax 判断PCB的状态是否为0,在linux 0.11中,0是就绪状态,而非0是阻塞状态 如果调用了相关sys_read和...---- 再来看看执行调度的具体过程,即_schedule函数执行: 通过相关调度算法,找出切换到哪个线程继续执行 switch_to完成具体切换,主要是完成对内存级线程PCB的切换 ---- switch_to...难点分析 参考: Linux0.11内核–进程的调度schedule和switch_to解析 任务状态段TSS及TSS描述符、局部描述符表LDT及LDT描述符 Linux 0.11用tss切换,但也可以...0.11中switch_to的完整源码实现 switch_to() (sched.h 第173行) /**********************************************

83360

从零手写操作系统之RVOS协作式多任务切换实现-03

下面我们先来看看任务切换的实现流程: 我们可以在程序中调用switch_to函数,手动完成任务的切换,由于任务切换十分频繁,所以这里使用汇编来实现switch_to函数: # void switch_to...switch_to(struct context *next); # 其中函数有一个context指针作为参数,而实际上由a0作为参数寄存器,存放该context指针的值 .globl switch_to....align 4 switch_to: # 交换mscratch和t6寄存器的值--t6指向进程的Context上下文地址 csrrw t6, mscratch, t6 # swap t6...and mscratch # 判断switch_to函数是否是首次调用(t6==0),如果是则跳到标签1处执行 beqz t6, 1f # Note: the first time switch_to...ret call switch_to将要切换的上下文Context地址作为参数传入,由a0参数寄存器保存 switch_to函数首先判断是否为首次调用switch_to函数,如果是,则直接进行上下文恢复操作

21320

从零手写操作系统之RVOS抢占式多任务实现-06

(next); } 在协作式任务切换一节中的switch_to函数实现里面,我们采用的是ret指令进行的函数返回,ret指令执行后,会跳回到ret指令到ra寄存器保存的地址处继续执行。...而在抢占式多任务的实现中,我们的switch_to函数是在中断处理程序中执行的,所以函数返回靠的应该是mret指令,而非ret指令: 而对于mret指令而言,我们需要知道: 因此,和...函数 switch_to(next); } 因为没有采用中断调用,因此为了让switch_to函数能够像被中断调用那样执行,我们也需要提前将任务在上下文中间中的mepc寄存器值设置好才可以。...但是本节抢占式多任务的实现中,我们已经改变了switch_to函数的工作逻辑,改为mret配合mepc实现任务切换执行。...; //return_pc += 4; } return return_pc; } switch_to函数实现复用抢占式多任务更改后的版本。

30640

Linux进程调度器概述--Linux进程的管理与调度(十五)

CFS调度器 linux-2.6~至今 4 Linux的调度器设计 4 Linux的调度器设计 2个调度器 可以用两种方法来激活调度 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制...这包括保存、恢复栈信息和寄存器信息 switch_to切换处理器寄存器的呢内容和内核栈(虚拟地址空间的用户部分已经通过switch_mm变更, 其中也包括了用户状态下的栈, 因此switch_to不需要变更用户栈...为什么switch_to需要3个参数 在新进程被选中执行时, 内核恢复到进程被切换出去的点继续执行, 此时内核只知道谁之前将新进程抢占了, 但是却不知道新进程再次执行是抢占了谁, 因此底层的进程切换机制必须将此前执行的进程...因此使用了一个3个参数, 但是逻辑效果是相同的, 仿佛是switch_to是带有两个参数的函数, 而且返回了一个指向此前运行的进程的指针. switch_to(prev, next, last); 即...prev = last = switch_to(prev, next); 其中返回的prev值并不是做参数的prev值, 而是prev被再次调度的时候抢占掉的那个进程last. 4.8 处理进程优先级

3.5K20

内核地址空间大冒险4:线程切换

sleep系统调用 我是一个线程,生活在Linux帝国。一直以来辛勤工作,日子过得平平淡淡,可今天早上发生了一件事让我回想起来都后怕。...小伙子,回来啦,走,带你们去context_switch()” 进入这个context_switch()之后,长者又带着我又做了一些准备工作,比如把当前的进程地址空间换成了小T的,最终我们来到了一个叫switch_to...告别了长者,我和小T踏上了这神秘的switch_to,跟随着一步一步的指令,我把自己线程上下文的寄存器都保存到了我的内核栈上面,然后将栈指针指向了小T的内核栈,最后把小T保存在他内核栈的指令地址加载进指令寄存器...在小H的带领下,我们又来到了那个叫switch_to地方,只不过这一次我的角色变了。 小H一顿和我之前一样的操作,把执行流程交给了我。

83320
领券