学习笔记
不同类型的进程有不同的调度需求,其中分为两类
第一类:I/O-bound(频繁进行I/O,花费长时间等待I/O操作的完成)CPU-bound(计算密集型,需要大量的CPU时间进行运算)
第二类:批处理进程、实时进程、交互式进程(例如:shell)。
进程调度时机
1 中断处理过程(包括时钟中断、I/O中断、系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule();
2 内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度;
3 用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。
进程上下文切换
为控制进程的执行,内核必须有能力挂起正在CPU上执行的进程,并恢复以前挂起的某个进程的执行。
挂起正在CPU上执行的进程,与中断时保存现场不同。中断前后是在同一个进程上下文中,只是由用户态转向内核态执行。
进程上下文包含了进程执行需要的所有信息
1)用户地址空间:包括程序代码,数据,用户堆栈等
2)控制信息:进程描述符,内核堆栈等
3)硬件上下文(与中断保存硬件上下文的方式不同)
schedule() 函数选择一个新的进程来运行,并调用context_switch进行上下文的切换,context_switch中的一个关键宏switch_to来进行关键上下文切换。
next=pick_next_task(rq.prev); 进程调度算法都封装在这个函数内部
context_switch(rq.prev.next); j进程上下文切换
switch_to利用prev和next两个参数:prev指向当前进程next指向被调度进程。
linux系统的一般执行过程
正在进行运行的用户态进程x切换到运行用户态y的过程
1 正在运行的用户态进程x
2 发生中断——save cs:eip/esp/eflags(current) to kernel stack,then load cs:eip(entry of a specific ISR ) and ss:esp(point to kernel stack). 保存和加载
3 save_all 恢复现场
4 中断处理过程中或中断返回前调用了schedule(),其中的switch_to做了关键的进程上下文切换 //将x进程的内核堆栈切换到next进程的内核堆栈,再切换eip
5 标号1之后开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行)
6 restore_all 恢复现场
7 iret - pop cs:eip/ss:esp/eflags from kernel stack //把y进程在发生中断时保存在内核堆栈里面的cs:eip/ss:esp/eflags pop出来
8 继续运行用户态进程y。

实验过程
和前一个实验一样先使用以下命令
cd LinuxKernel
rm menu -rf
git clone https://github.com/mengning/menu.git
cd menu
mv test_exec.c test
make rootfs

返回上一级
cd..
可以通过增加-s -S启动参数打开调试模式
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd ../rootfs.img -s -S

打开gdb进行远程调试
gdb
file linux-3.18.6/vmlinux
target remote:1234
设置断点
b schedule
b_context switch
b_switch
b_switch_to
b pick_next_task

转载于:https://www.cnblogs.com/2017yaya/p/7900802.html

Linux第九周作业相关推荐

  1. 2019年春季学期第九周作业

    A Q 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 2019春第九周作业 我在这个课程的目标是 了解并且应用结构体和数组的知识 这个作业在那个具体方面帮助我实现目标 掌握了数组的简单 ...

  2. 20189200余超 2018-2019-2 移动平台应用开发实践第九周作业

    20189200余超 2018-2019-2 移动平台应用开发实践第九周作业 图形和制定视图 Android视图系统.层次关系 Android应用设计和Web应用设计类似,也分前端和后端设计.Andr ...

  3. 2019春第九周作业

    这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 2019年春季学期第九周作业 我在这个课程的目标是 我希望能够通过学习C语言的知识,编写程序 这个作业在哪个具体方面帮助我实现目标 这个作 ...

  4. 厚基础Linux——第二周作业

    文章目录 厚基础Linux--第二周作业 按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别. SlackWare SUSE DeBian Ubuntu RedHat RedHat Lin ...

  5. 学习linux第二周作业

    第二周作业: 本周作业内容: 1.Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示. touch,rm,mv,cp,file,ls,chmod,chown,ln,rename, ...

  6. 王译潇20162314 第九周作业总结

    学号 20162314 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 数据库是为其他程序提供数据的应用软件 关系数据库通过唯一的标识符在不同表的记录间建立了 ...

  7. 20179301《网络攻防实践》第九周作业

    a.教材第九周和第十周学习 1.第九章学习 1.1恶意代码基本知识 恶意代码定义: 恶意代码(Unwanted Code)是指没有作用却会带来危险的代码,一个最安全的定义是把所有不必要的代码都看作是恶 ...

  8. 2018-2019-1 20189201 《LInux内核原理与分析》第九周作业

    那一天我二十一岁,在我一生的黄金时代.我有好多奢望.我想爱,想吃,还想在一瞬间变成天上半明半暗的云.那一年我二十一岁,在我一生的黄金时代.我有好多想法.我思索,想象,我不知该如何行动,我想知道一个城市 ...

  9. 2018-2019-1 20189218《Linux内核原理与分析》第九周作业

    进程调度的时机 进程调度时机就是内核调用schedule函数的时机.当内核即将返回用户空间时,内核会检查need_resched标志是否设置.如果设置,则调用schedule函数,此时是从中断(或者异 ...

  10. 2018-2019-1 20189208《Linux内核原理与分析》第九周作业

    活动 main函数编译有问题,div 函数和系统中某个函数重名,浮点输出有问题,scanf也有问题 修改如下 scanf_s("%d %d", &a, &b); p ...

最新文章

  1. Win7各版本功能对比
  2. 【学习笔记】19、模快(Module)
  3. 将 ext_net 连接到 router - 每天5分钟玩转 OpenStack(145)
  4. 约瑟夫环问题(顺序表和单向链表)
  5. Logistic逻辑回归用初等数学解读逻辑回归
  6. 在微型计算机中1G标准等于,微型计算机的基础知识概要.ppt
  7. php开发oa系统的插件下载不了,OA系统安装不了office控件的解决方法
  8. docker安装gamit_gamit的安装步骤
  9. 讴 mysql 首字母_MYSQL索引
  10. BP神经网络原理简单介绍以及公式推导(矩阵形式和分量形式)
  11. 深度学习(二)---算法岗面试题
  12. Vue3项目基本知识点
  13. Centos7下joshua6.0.5完整的安装过程
  14. 图像二值化 cv2.threshold
  15. 云计算时代,建站选择虚拟主机还是云服务器
  16. 安全技术(Security)
  17. 音影系统linux,搭建基于linux桌面环境的影音平台_linux教程
  18. Jetson nano GPIO的使用
  19. Docker 安装启动后无法连接服务器
  20. vivoz3升级Android10,vivoz3 刷机教程 vivoz3 卡刷升级教程

热门文章

  1. 2017 【第八届蓝桥杯省赛】 C/C++ B组
  2. Ubuntu18 yolov5使用ncnn部署
  3. 深度学习软件资源列表
  4. MySQL破log_MySQL中的binlog相关命令和恢复技巧
  5. 2 magicwatch_荣耀Magic Watch 2手表实际体验如何?
  6. 35c语言编程,35编号c语言编程题08850.pdf
  7. 软件工程 CI持续集成实例 Zanata+github+Jenkins
  8. kubernetes视频教程笔记 (21)-存储-configmap
  9. 微信小程序云开发教程-云函数入门(2)-接收参数、前端调用
  10. 选项不属于HTML语言特点,Web前端开发初级模拟测试卷一(2)