linux 进程调度 切换,Linux 进程调度、切换的分析

内容说明

本次的内容,是一次 MOOC 课程的作业。具体的,是使用汇编对 Linux 系统调用部分进行模拟实现,从而更加直观的验证 Linux 系统的基本机制。

作业声明

qianyizhou17 + 原创作品转载请注明出处 + 《Linux 内核分析》MOOC 课程 http://mooc.study.163.com/course/USTC-1000029000

进程调度

1 Linux的调度策略基于分时和优先级。

1.1 进程根据优先级排队

1.2 长时间未分配到 CPU 执行的进程,优先级会上升;在 CPU 上运行较长时间的进程,优先级会下降

2 schedule 函数

2.1 Linux 中通过直接、间接调用 schedule 函数来实现进程的调度——在运行队列中找到一个进程,把 CPU 分配给他

2.2 调用方法:1. 直接调用 2. 设置 nned_resched 标志

3 中断处理过程(包括时钟中断、I/O 中断、系统调用和异常)中,直接调用 schedule(),或者返回用户态时根据 need_resched 标记调用 schedule();

4 内核线程可以直接调用 schedule() 进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度;

5 用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。

进程切换

为了控制进程的执行,内核必须有能力挂起正在 CPU 上执行的进程,并恢复以前挂起的某个进程的执行,这叫做进程切换、任务切换、上下文切换;

1 挂起正在 CPU 上执行的进程,与中断时保存现场是不同的:中断前后是在同一个进程上下文中,只是由用户态转向内核态执行;进程上下文包含了进程执行需要的所有信息

2 schedule() 函数选择一个新的进程来运行,并调用 context_switch 进行上下文的切换,在 context_switch 中调用 switch_to 宏来进行关键上下文切换

2.1 next = pick_next_task(rq, prev);//进程调度算法都封装这个函数内部

2.2 context_switch(rq, prev, next);//进程上下文切换

2.3 switch_to 利用了 prev 和 next 两个参数:prev 指向当前进程,next 指向被调度的进程

Linux 系统的一般执行过程 1 最一般的情况:正在运行的用户态进程 X 切换到运行用户态进程 Y 的过程 1.1 正在运行的用户态进程 X 1.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). 1.3 SAVE_ALL // 保存现场 1.4 中断处理过程中或中断返回前调用了 schedule(),其中的 switch_to 做了关键的进程上下文切换 1.5 标号 1 之后开始运行用户态进程 Y(这里 Y 曾经通过以上步骤被切换出去过因此可以从标号 1 继续执行) 1.6 restore_all //恢复现场 1.7 iret - pop cs:eip/ss:esp/eflags from kernel stack 1.8 继续运行用户态进程 Y 2 几种特殊情况 2.1 通过中断处理过程中的调度时机,用户态进程与内核线程之间互相切换和内核线程之间互相切换,与最一般的情况非常类似,只是内核线程运行过程中发生中断没有进程用户态和内核态的转换; 2.2 内核线程主动调用 schedule(),只有进程上下文的切换,没有发生中断上下文的切换,与最一般的情况略简略; 2.3 创建子进程的系统调用在子进程中的执行起点及返回用户态,如 fork; 2.4 加载一个新的可执行程序后返回到用户态的情况,如 execve;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值