首页 > 系统相关 >lab5:深入理解进程切换

lab5:深入理解进程切换

时间:2023-04-30 11:12:52浏览次数:43  
标签:rq mm next active switch 切换 lab5 进程 prev

目录

linux操作系统分析Lab5:深入理解进程切换

context_switch 函数

content_switch 函数位于 Linux 内核源码目录的 kernel/sched/core.c 中,是 schedule 函数中实现进程切换的函数

/*
 * context_switch - switch to the new MM and the new thread's register state.
 */
static __always_inline struct rq *
context_switch(struct rq *rq, struct task_struct *prev,
	       struct task_struct *next, struct rq_flags *rf)
{
	prepare_task_switch(rq, prev, next);

	/*
	 * For paravirt, this is coupled with an exit in switch_to to
	 * combine the page table reload and the switch backend into
	 * one hypercall.
	 */
	arch_start_context_switch(prev);

	/*
	 * kernel -> kernel   lazy + transfer active
	 *   user -> kernel   lazy + mmgrab() active
	 *
	 * kernel ->   user   switch + mmdrop() active
	 *   user ->   user   switch
	 */
	if (!next->mm) {                                // to kernel
		enter_lazy_tlb(prev->active_mm, next);

		next->active_mm = prev->active_mm;
		if (prev->mm)                           // from user
			mmgrab(prev->active_mm);
		else
			prev->active_mm = NULL;
	} else {                                        // to user
		membarrier_switch_mm(rq, prev->active_mm, next->mm);
		/*
		 * sys_membarrier() requires an smp_mb() between setting
		 * rq->curr / membarrier_switch_mm() and returning to userspace.
		 *
		 * The below provides this either through switch_mm(), or in
		 * case 'prev->active_mm == next->mm' through
		 * finish_task_switch()'s mmdrop().
		 */
		switch_mm_irqs_off(prev->active_mm, next->mm, next);

		if (!prev->mm) {                        // from kernel
			/* will mmdrop() in finish_task_switch(). */
			rq->prev_mm = prev->active_mm;
			prev->active_mm = NULL;
		}
	}

	rq->clock_update_flags &= ~(RQCF_ACT_SKIP|RQCF_REQ_SKIP);

	prepare_lock_switch(rq, next, rf);

	/* Here we just switch the register state and the stack. */
	switch_to(prev, next, prev);
	barrier();

	return finish_task_switch(prev);
}

content_switch 函数有三个参数:rq、prev、next,其中 rq 指向本次进程切换发生的 running queue;prev 和 next 分别指向切换前后进程的进程描述符。

执行过程

1. prepare_task_switch()

该函数在进程切换之前调用,内核会执行与体系结构相关的一些调测指令。上下文切换完成后,必须调用 finish_task_switch,即这两个函数一定是要成对出现的。

2. arch_start_context_switch()

该函数给各个体系结构专有的开始上下文切换的工作提供了入口,不同体系结构的实现不同。

3. switch_mm_irqs_off() 进程地址切换

switch_mm更换通过task_struct->mm描述的内存管理上下文,该工作的细节取决于处理器,主要包括加载页表,刷出地址转换后备缓冲器(部分或者全部),向内存管理单元(MMU)提供新的信息。

3. switch_to()

调用switch_to(),从上一个进程的处理器状态切换到新进程的处理器状态。这包括保存、恢复栈信息和寄存器信息。
switch_to切换处理器寄存器的呢内容和内核栈(虚拟地址空间的用户部分已经通过switch_mm变更,其中也包括了用户状态下的栈,因此switch_to不需要变更用户栈,只需变更内核栈),此段代码严重依赖于体系结构,且代码通常都是用汇编语言编写。

实验总结

通过上述分析,我们已经得到了进程切换过程中发生的主要操作:

__schedule   // kernel/sched/core.c
->context_switch
  ->switch_mm_irqs_off   //进程地址空间切换
  ->switch_to //处理器状态切换

实际上在不同的体系结构下,只有switch_to函数是有较大差异的,因为不同的体系结构下的寄存器和堆栈有所不同,涉及具体的操作自然也是不同的,其他的函数基本上是通用的。

标签:rq,mm,next,active,switch,切换,lab5,进程,prev
From: https://www.cnblogs.com/MonoSirius/p/17365035.html

相关文章

  • HPL:多进程CPU性能测试
    使用HPL进行CPU性能测试CPU型号为:AMDRyzen75800H,本次实验使用两台Linux虚拟机测试,每个虚拟机分配一个CPU。理论浮点峰值=CPU主频×CPU核数×CPU每周期执行浮点运算的次数本机CPU的基准频率为3.2GHZ,加速频率为4.4GHZghz。CPU有8核16线程(一个核虚拟成2个CPU),CPU单个周期浮点计算......
  • 14 进程的等待与唤醒机制
    进程的等待结构:kwlst_t结构用于挂载等待的进程;经常被包含在信号量等结构,是用于保护访问受限的贡献资源;进程等待:krlsched_wait函数:获取当前正在运行的进程,设置进程状态为等待状态,执行脱链操作,并将进程加入等待结构;进程唤醒:krlsched_up函数:从等待数据结构中获取进程,然后设置......
  • Cygwin、MSYS2 Bash封装函数restart,重启Windows程序进程向导,输入序号一键重启对应进程
    概述作用:终端输入restart,根据菜单提示输入序号重启特定的软件或进程,定义的重启函数太多不便于记忆的情况,特别是手机远程终端(如:JuiceSSH)连接的情况下,减少手动输入和误操作,其中判定浏览器进程使用了另一篇文章中预定的函数wmicps,ps2为指向wmicps的alias(详见:https://www.cnblog......
  • 14 进程调度
    进程调度的原因:一是CPU同一时刻只能运行一个进程,并且CPU的个数总是少于进程个数,就需要让进程共用一个CPU;二是当一个进程拿不到资源时就应该让出CPU,否则会一直霸占CPU;1、管理进程:进程的生命周期:进程的状态:运行、睡眠、等待、新建、僵死;组织进程:设计思想:链表数据结构,一个优......
  • 【协程】进程,线程和协程
    进程进程,描述的是程序的执行过程,是运行着程序的代表,在操作系统中,每个进程的内存空间都是独立的,使用多进程并发有两个缺点:一是内核的管理成本高,而是无法简单地通过内存同步数据(进程运行的虚拟内存空间),很不方便,于是多线程模式就出现了。线程线程是操作系统能够运行运算调度的最......
  • ubuntu切换软件源为国内源
    Ubuntu安装完毕之后,默认的源是Ubuntu自己的,但毕竟Ubuntu服务器在国外,我们访问起来会比较慢,可以将软件源切换为国内源,比如:阿里源,清华源,中科大源等等。在这边以清华源为例,其它源也是一样的道理。切换源之前先把配置文件备份一份sudocp/etc/apt/sources.list/etc/apt/sources_init.......
  • 13 进程
    进程:从进程的结构看:进程是一个应用程序运行时刻的实例;从进程的功能看:进程是应用程序运行时所需资源的容器;从操作系统对进程的实现角度看:进程是一堆数据结构;进程的结构:进程必须要有一个地址空间:这个地址空间包括至少两部分:一部分是内核,一部分是用户的应用程序;每个进程拥有x86......
  • Vue项目如何配置、切换主题颜色(mixin + scss方式,简单高效)
    Action一.首先,引入scss依赖(node-sass,sass-loader)npminstallnode-sasssass-loader--save-dev1二.项目样式文件目录介绍1.此处我将项目中的公共样式文件放到了src/style目录下,其中index.scss是以供全局使用的一些基本样式,在main.js文件中引入即可全局使用(图2)。_theme.scs......
  • 进程间通信
    匿名管道/*匿名管道用在具有关系的进程间,原因是共享文件描述符环形队列,双指针-读指针、写指针管道中没有数据,read将会被堵塞管道写满时,write将会被堵塞创建匿名管道#include<unistd.h>int......
  • maven中切换国内源
    国外镜像下载包非常慢,于是使用国内阿里云的,找到~/.m2目录,但是不存在settings.xml,于是手动创建一个,然后贴入一个样例 <settingsxmlns="http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://mave......