20135202闫佳歆--week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程--实验及总结...

week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程

1.环境搭建:

rm menu -rf
git clone https://github.com/megnning/menu.git
cd menu
ls
make rootfs
qemu -kernel ../linux-3.18.6/arch/x86/boot/bzImage -initrd ../rootfs.img -s -S
gdb
file ../linux-3.18.6/vmlinux
target remote:1234

这一堆都是常用配置了,不赘述。

2.使用gdb跟踪分析一个schedule()函数

首先设置几个断点,分别是schedule, pick_next_task,context_switch,switch_to。最后一个switch_to设置失败了,我也无法定位到它,这个另外再说。
设置断点如下:
enter description here

发现一个对schdule的调用:
enter description here

schdule函数定义如下:
enter description here
__visible保证任何地方都能够调用这个函数实现进程的切换。
它首先要建立一个进程描述符,用来表示当前进程,而具体的调度过程交由__schedule()函数执行。

由这张图可以看出来,两个重要的函数context_switch和pick_next_task函数都在__schedule函数中。
enter description here

首先看到的是pick_next_task函数:
enter description here
next指针指向的是由这个函数选择出来的进程,pick_next_task函数里面封装了许多进程调度的算法,通过这个函数就能寻找出适当的下一个执行进程。内部如下:
enter description here

然后看到了context_switch函数,这个函数的功能是进程上下文切换
enter description here

关于switch_to:
switch_to是关键上下文切换的相关代码,切换堆栈和寄存器的状态,利用了prev和next两个参数:prev指向当前进程,next指向被调度的进程。
这段是汇编相关无法跟踪,我只找到了一个__switch_to的函数,这个函数的返回值应该是eax的值。
enter description here

对于switch_to的代码分析如下:

31  #define switch_to(prev, next, last)                    
32  do {                                 
33    /*                              
34     * Context-switching clobbers all registers, so we clobber  
35     * them explicitly, via unused output variables.     
36     * (EAX and EBP is not listed because EBP is saved/restored  
37     * explicitly for wchan access and EAX is the return value of   
38     * __switch_to())                     
39     */                                
40    unsigned long ebx, ecx, edx, esi, edi;                
41                                    
42    asm volatile("pushfl\n\t"      /* 保存当前进程的标志位 */   
43             "pushl %%ebp\n\t"        /* 保存当前进程的堆栈基址EBP   */ 
44             "movl %%esp,%[prev_sp]\n\t"  /* 保存当前栈顶ESP   */ 
45             "movl %[next_sp],%%esp\n\t"  /* 把下一个进程的栈顶放到esp寄存器中,完成了内核堆栈的切换,从此往下压栈都是在next进程的内核堆栈中。   */ 46             "movl $1f,%[prev_ip]\n\t"    /* 保存当前进程的EIP   */ 
47             "pushl %[next_ip]\n\t"   /* 把下一个进程的起点EIP压入堆栈   */    
48             __switch_canary                   
49             "jmp __switch_to\n"  /* 因为是函数所以是jmp,通过寄存器传递参数,寄存器是prev-a,next-d,当函数执行结束ret时因为没有压栈当前eip,所以需要使用之前压栈的eip,就是pop出next_ip。  */ 以上四行代码实际是使用next进程的进程堆栈,但是还算成prev的进程执行,内核堆栈的切换和进程切换完成并不同时间。50             "1:\t"               /* 认为next进程开始执行。 */         
51             "popl %%ebp\n\t"     /* restore EBP   */    
52             "popfl\n"         /* restore flags */  
53                                    
54             /* output parameters 因为处于中断上下文,在内核中prev_sp是内核堆栈栈顶prev_ip是当前进程的eip */                
55             : [prev_sp] "=m" (prev->thread.sp),     
56               [prev_ip] "=m" (prev->thread.ip),  //[prev_ip]是标号        
57               "=a" (last),                 
58                                    
59               /* clobbered output registers: */     
60               "=b" (ebx), "=c" (ecx), "=d" (edx),      
61               "=S" (esi), "=D" (edi)             
62                                         
63               __switch_canary_oparam                
64                                    
65               /* input parameters: next_sp下一个进程的内核堆栈的栈顶next_ip下一个进程执行的起点,一般是$1f,对于新创建的子进程是ret_from_fork*/                
66             : [next_sp]  "m" (next->thread.sp),        
67               [next_ip]  "m" (next->thread.ip),       
68                                         
69               /* regparm parameters for __switch_to(): */  
70               [prev]     "a" (prev),              
71               [next]     "d" (next)               
72                                    
73               __switch_canary_iparam                
74                                    
75             : /* reloaded segment registers */           
76            "memory");                  
77  } while (0)

简而言之,原理如下:

schedule()函数选择一个新的进程来运行:

使用pick_next_task内部封装的调度算法执行选择
并调用context_switch进行上下文的切换
context_switch又调用switch_to来进行关键上下文切换
switch_to切换堆栈和寄存器的状态,利用了prev和next两个参数:
prev指向当前进程,next指向被调度的进程。

3.学习笔记

请走链接 学习笔记

转载于:https://www.cnblogs.com/20135202yjx/p/5392618.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java jni技术_JNI技术简介

JNI(Java Native Interface)提供一种Java字节码调用C/C的解决方案,JNI描述的是一种技术。NDK(Native Development Kit)Android NDK 是一组允许您将 C 或 C(“原生代码”)嵌入到 Android 应用中的工具,NDK描述的是工具集。 能够在 Android 应用中使用原生…

python 读取mysql大量数据处理_python使用多线程快速把大量mysql数据导入elasticsearch...

使用python多线程,运行时自定义线程数,自动计算每个线程处理的数据量,连接mysql读取数据,处理成需要的字段入到elasticsearch。运行效果图:10个线程 运行会在这里实时刷新,方便查看每个线程处理到的id数&am…

java web redis_java web redis使用(二)

上篇中已经安装好redis,然后下面就说怎么在java web中用客户端来使用regis使用jedis java客户端一:一个简单的示例代码:public static void main(String[] args) {Jedis jedis new Jedis( "147.151.240.234" , 6379 );jedis.set("foo&…

mysql 主从_搭建mysql主从并编写监控主从状态脚本

要求:两台centos7虚拟机分为主和从安装mysqlyum -y install mysql mysql-server关闭防火墙service iptables stopsetenforce 0上面的主从都做。修改主的配置文件vi /etc/my.cnf#添加server-id1log-binmysqlbinrelay-logrelays之后保存退出重启mysql服务service …

Ubuntu Sublime Text 3 搜狗拼音

已知前置条件 本经验目前在Ubuntu14.04环境下&#xff0c;已有搜狗输入法 for Linux和Sublime Text 3的情况下安装成功。 解决方法步骤 保存下面的代码到文件sublime_imfix.c(位于~目录) #include <gtk/gtkimcontext.h> void gtk_im_context_set_client_window (GtkIMCon…

Java核心技术点之动态代理

本篇博文会从代理的概念出发&#xff0c;介绍Java中动态代理技术的使用&#xff0c;并进一步探索它的实现原理。由于个人水平有限&#xff0c;叙述中难免出现不清晰或是不准确的地方&#xff0c;希望大家可以指正&#xff0c;谢谢大家&#xff1a;&#xff09; 一、概述 1. 什么…

pythonwebview自动化测试_GitHub - githubwzg/python-appium: 基于PageObject UI自动化测试框架,支持Android/iOS...

0910 UPDATE新增控件集参数化&#xff0c;相同测试步骤的Android/iOS可共用一份测试用例不同测试步骤的用例还需要单独写0904 UPDATE优化Android log及crsahinfo相关输出路径新增iOS crashreport解析新增内容&#xff1a;适配iOS提取android crash信息优化report(增加自动填充包…

linux中使用lftp上传下载文件

lftp是linux中一款ftp服务器相比windows中的ftp显得要复杂不少了&#xff0c;下面我来总结一下lftp文件上传&#xff0c;文件下载&#xff0c;及文件查找等等相关命令吧。 lftp连接的几种方法&#xff0c;最常用的是lftp namesite&#xff0c;这样可以不用明文输入密码。 1、lf…

java 数据库 事务 只读_不使用事务和使用只读事务的区别

转转转&#xff0c;&#xff0c;还需要具体验证(决定把readonly类型的事务完全去掉&#xff0c;以提高性能&#xff0c;这里有讨论&#xff1a;http://stackoverflow.com/questions/2562865/spring-transaction-readonly)。。。如果只提交一个查询&#xff0c;有必要用事务吗&a…

python搭建webapi_怎么搭建Web Api

1.通常我们有个web 让后可以有个web api 提供接口2.通常我们分别建两个项目 web api 依赖web的来进行访问(说到底是依赖是IIS)3.我们先建个SmallCode.Test.Web 再建一个SmallCode.Test.Api4.直接在SmallCode.Test.Web 引用 SamllCode.Test.Api 运行通过地址 /api/Order 无法访问…

shell入门之expr的使用

在expr中加减乘除的使用&#xff0c;脚本例如以下&#xff1a; #!/bin/sh #a test about expr v1expr 5 6 echo "$v1" echo expr 3 5 echo expr 6 / 2 echo expr 9 \* 5 echo expr 9 - 6 执行效果 转载于:https://www.cnblogs.com/bhlsheji/p/5401458.html

java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...

之前的例子都是我们在子线程(WorkerThread)当中处理并发送消息&#xff0c;然后在主线程(UI线程)中获取消息并修改UI&#xff0c;那么可以不可以在由主线程发送消息&#xff0c;子线程接收呢&#xff1f;我们按照之前的思路写一下代码&#xff1a;packagecn.lixyz.handlertest;…

java开源笔记软件下载_开发常用软件笔记 - ZhaoQian's Blog - OSCHINA - 中文开源技术交流社区...

notepad使用快捷键CtrlH打开“替换对话框”&#xff0c;在每行的开头添加内容。 勾选左下角的“正则表达式”选项 在“查找目标”里输入上尖号“^”&#xff0c;上尖号代表每行的开头 在“替换为”里输入“private String”。然后点"全部替换"按钮&#xff0c;这样每…

python示例apk_Python获取apk文件URL地址实例

工作中经常需要提取apk文件的特定URL地址&#xff0c;如是想到用Python脚本进行自动处理。需要用到的Python基础知识如下:os.walk()函数声明&#xff1a;os.walk(top,topdownTrue,οnerrοrNone)(1)参数top表示需要遍历的顶级目录的路径。(2)参数topdown的默认值是“True”表示…

使用静态工厂方法而不是构造器

注意&#xff1a;静态工厂方法不是设计模式中的工厂方法。 一个类向客户端提供静态工厂方法有如下好处&#xff1a; 有名称&#xff0c;不用根据参数类型和顺序区分重载方法&#xff0c;让代码更易读 是否每次调用都需要新对象是可控制的&#xff0c;对于不可修改的对象可以采取…

极光推送指定用户推送_App用户都睡着了?是时候用推送和活动唤醒一波了!

想要运营好一款App&#xff0c;引流、留存、促活三大环节必不可少。引流解决了用户来的问题&#xff0c;留存解决了用户留下来的问题&#xff0c;而促活解决的是让一部分新注册用户以及许久没有动静的老用户&#xff0c;在平台中再次活跃起来。今天&#xff0c;我们就来聊聊关于…

扫描sdcard文件(递归)

private void saoMiaoSdCard() {// TODO Auto-generated method stub// 判断是否挂载if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {// 获取sdcardFile sdcard Environment.getExternalStorageDirectory();// 创建集合对象list_file new A…

oracle awr报告生成_分享AWR报告的生成和简单分析方法

生成AWR报告方法&#xff1a;第一步&#xff1a;数据库压力测试卡开始时&#xff1a;生成第一个快照&#xff1a;Sql>exec dbms_workload_repository.create_snapshot();第二步&#xff1a;数据库压力测试结束时&#xff1a;生成第二个快照Sql>exec dbms_workload_reposi…

java date.from_java datefromat

DateFormat 中的格式一致 即可) java.text.SimpleDateFormat sdf new java.text.SimpleDateFormat("M/dd/yyyy hh:mm:ss a",java); java.......SimpleDateFormat常用法_计算机软件及应用_IT/计算机_专业资料。有关javaSInpleDateFormat类的常用操作 1. SimpleDateFo…

selenium打开Firefox、IE、Chrome浏览器【python】

selenium打开不同浏览器的脚本。 1.Firefox from selenium import webdriverdriverwebdriver.Firefox() driver.get("http://www.baidu.com") 这里要注意打开的域名一定要加前http:// 否则会报错&#xff1a;selenium.common.exceptions.WebDriverException: Messag…