zoukankan      html  css  js  c++  java
  • 20135316Linux内核学习笔记第八周

    20135316王剑桥《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC 1000029000
    一、进程调度与进程调度的时机分析
    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
    几种特殊情况:
    通过中断处理过程中的调度时机,用户态进程与内核线程之间互相切换和内核线程之间互相切换,与最一般的情况非常类似,只是内核线程运行过程中发生中断没有进程用户态和内核态的转换;
    内核线程主动调用schedule(),只有进程上下文的切换,没有发生中断上下文的切换,与最一般的情况略简略;
    创建子进程的系统调用在子进程中的执行起点及返回用户态,如fork(next-ip=ret-from-fork);
    加载一个新的可执行程序后返回到用户态的情况,如execve;
    四、Linux操作系统架构概览

  • 相关阅读:
    抽象代数学习笔记
    WC2021 游记
    简单的数学题
    前缀和公式
    杜教筛
    [模板]BZOJ4756线段树合并
    SPOJ 694
    bzoj1367 可并堆
    莫比乌斯反演(理论)
    es6 Set数据结构
  • 原文地址:https://www.cnblogs.com/20135316wjq/p/5384702.html
Copyright © 2011-2022 走看看