Linux内核及分析 第八周 进程的切换和系统的一般执行过程
学习笔记:
一、进程调度与进程调度的时机分析
1.不同类型的进程有不同需求的调度需求:
第一种分类:
—I/O-bound:频繁的进行I/O,通常会花费很多时间等待I/O操作的完成
—CPU-bound:计算密集型,需要大量的CPU时间进行运算
第二种分类:
—批处理进程:不必与用户交互,通常在后台运行;不必响应很快;
—实时进程:有实时需求,不被低优先级的进程阻塞;响应时间短,稳定;
—交互式进程:需要经常与用户交互;响应时间要快
2.调度策略:一组规则,决定什么时候以怎样的方式选择一个新的进程运行。
3.Linux进程根据优先级排序,用特定的算法计算出进程优先级,用一个值表示把进程如何适当地分配给CPU。优先级是动态的,根据进程的行为周期性调整,较长时间未分配到CPU的通常提高优先级;已经在CPU上运行较长时间的降低优先级。
4.Schedule函数用来实现调度,在队列中找到一个进程,把CPU分配给他。
—直接调用schedule
—松散调用,根据need-resched标记进程调度的时机
5.进程调度时机
中断处理过程(包括时钟中断、I/O中断、系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule();
内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度;
用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。
用户态进程只能被动调度;内核进程是只有内核态没有用户态的特殊进程,可以主动调度也可以被动调度。
二、进程上下文切换相关代码分析
1.为了控制进程的执行,内核必须有能力挂起正在CPU上执行的进程,并恢复以前挂起的某个进程的执行,这叫做进程切换、任务切换、上下文切换;
2.挂起正在CPU上执行的进程,与中断时保存现场是不同的,中断前后是在同一个进程上下文中,只是由用户态转向内核态执行;
3.进程上下文包含了进程执行需要的所有信息
4.用户地址空间:包括程序代码,数据,用户堆栈等
5.控制信息:进程描述符,内核堆栈等
6.硬件上下文(注意中断也要保存硬件上下文只是保存的方法不同)
7.schedule()函数选择一个新的进程来运行,并调用context_switch进行上下文的切换,这个宏调用switch_to来进行关键上下文切换
next = pick_next_task(rq, prev);//进程调度算法都封装这个函数内部
context_switch(rq, prev, next);//进程上下文切换
switch_to利用了prev和next两个参数:prev指向当前进程,next指向被调度的进程
8.next-ip一般是$1f,对于新创建的子进程是ret-from-fork
三、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做了关键的进程上下文切换
5.标号1之后开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行)
6.restore_all //恢复现场
7.iret - pop cs:eip/ss:esp/eflags from kernel stack
8.继续运行用户态进程Y
实验过程:
1.进入虚拟机环境,启动内核,并进入调试状态
2.在schedule处设置断点,运行,用list展开函数
3.单步运行,直至_schedule()
4.在pick_next_task处设立断点,执行
5.在context_switch处设立断点,执行
总结:
进程的调度时机等还是有一般情况和具体情况的,我们要根据情况的不同具体的分析问题。
调度算法中最基本的一类就是基于优先级的调度——根据进程的价值和其对处理器时间的需求来对进程分级。
调度程序总是选择时间片未用尽而且优先级最高的进程运行。
作者: 王雪铖
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
Linux内核及分析 第八周 进程的切换和系统的一般执行过程的更多相关文章
- Linux内核分析第八周——进程的切换和系统的一般执行过程
Linux内核分析第八周--进程的切换和系统的一般执行过程 李雪琦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/cou ...
- 20135327郭皓--Linux内核分析第八周 进程的切换和系统的一般执行过程
第八周 进程的切换和系统的一般执行过程 一.进程切换的关键代码switch_to分析 1.进程调度与进程调度的时机分析 不同类型的进程有不同的调度需求 第一种分类: I/O-bound:频繁进行I/O ...
- Linux内核设计第八周 ——进程的切换和系统的一般执行过程
Linux内核设计第八周 ——进程的切换和系统的一般执行过程 第一部分 知识点总结 第二部分 实验部分 1.配置实验环境,确保menu内核可以正常启动 2.进入gdb调试,在shedule和conte ...
- 《Linux内核分析》第八周 进程的切换和系统的一般执行过程
[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK EIGHT ...
- 《Linux内核》第七周 进程的切换和系统的一般执行过程 20135311傅冬菁
进程的切换和系统的一般执行过程 一.内容总结与分析 进程调度与进程调度时机 进程调度需求的分类: 第一种分类方式: I/O -bound(频繁进行I/O,通常会花很多时间等待I/O操作) CPU-bo ...
- 20135337朱荟潼 Linux第八周学习总结——进程的切换和系统的一般执行过程
第八周 进程的切换和系统的一般执行过程 一.进程切换关键代码switch_to 1.不同类型进程有不同调度需求--两种分类 2.调度策略--规则 Linux中进程优先级是动态的,周期性调整. 3.时机 ...
- Linux 第八周实验 进程的切换和系统的一般执行过程
姬梦馨 原创作品 <Linux内核分析>MOOC课程:http://mooc.study.163.com/course/USTC-1000029000 第八讲 进程的切换和系统的一般执行过 ...
- LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程
LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/c ...
- LINUX内核分析第八周学习总结:进程的切换和系统的一般执行过程
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程切换的关 ...
随机推荐
- Hacker News API
Hacker News API中的URI和版本 API都由https://hacker-news.firebaseio.com提供. 单个条目信息 故事,评论,招聘,问答,以及投票都叫做条目.它们有各 ...
- 【PAT】B1071 小赌怡情(15 分)
水题一道,直接贴代码 #include<cstdio> #include<string.h> int main(){ //玩家的筹码数.以及 int T,K;scanf(&qu ...
- [bug]android monkey命令在Android N和Android O上的一点差异发现
最近再调试这个统计FPS的代码,发现代码在android N上可以正常运行,但在android O上却运行不了,拼了命的报错,给出的提示就是 ZeroDivisionError: division b ...
- ConcurrentLinkedQueue源码解读
1.简介 ConcurrentLinkedQueue是JUC中的基于链表的无锁队列实现.本文将解读其源码实现. 2. 论文 ConcurrentLinkedQueue的实现是以Maged M. Mic ...
- centos7下安装docker(2镜像)
docker最小的镜像——hello-world 下载镜像 docker pull docker pull hello-world 查看镜像 docker images docker images ...
- js中采用词法作用域
所谓的 词法( 代码 )作用域, 就是代码在编写过程中体现出来的作用范围. 代码一旦写好, 不用执行, 作用范围就已经确定好了. 这个就是所谓词法作用域. 在 js 中词法作用域规则: 1.函数允许访 ...
- canvas的drawImage函数
HTML5中引入新的元素canvas,其drawImage 方法允许在 canvas 中插入其他图像( img 和 canvas 元素) .drawImage函数有三种函数原型: drawImage( ...
- expdp 高版本导入到低版本
低版本 往 高版本 导入,导出的时候不用加version : 高版本往低版本的时候 需要加 version expdp version (往低版本的时候 需要加 version 版本号是 impdp ...
- python Polygon模块安装
pip install Polygon这样会安装不了 只能使用pip install Polygon2 或者 pip install Polygon3,也就是必须带版本号
- <<linux device driver,third edition>> Chapter 2: Building and Running Modules
Kernel Modules Versus Applications Kernel modules programming is similar to event driven programming ...