进程调度分析

来源:互联网 发布:屏幕录像 知乎 编辑:程序博客网 时间:2024/06/18 10:55
原创作品转载请注明出处

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000


Linux进程调度是基于分时优先级

内核线程是只有内核态没有用户态的特殊进程
内核可以看作各种中断处理过程和内核线程的集合

Linux系统的一般执行过程 可以抽象成正在运行的用户态进程X切换到运行用户态进程Y的过程
内核线程可以主动调度,主动调度时不需要中断上下文的切换


进程的调度时机与进程的切换


操作系统原理中介绍了大量进程调度算法,这些算法从实现的角度看仅仅是从运行队列中选择一个新进程,选择的过程中运用了不同的策略而已。

对于理解操作系统的工作机制,反而是进程的调度时机与进程的切换机制更为关键。


进程调度的时机

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

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

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


进程的切换

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

  • 挂起正在CPU上执行的进程,与中断时保存现场是不同的,中断前后是在同一个进程上下文中,只是由用户态转向内核态执行;

  • 进程上下文包含了进程执行需要的所有信息

    • 用户地址空间: 包括程序代码,数据,用户堆栈等

    • 控制信息 :进程描述符,内核堆栈等

    • 硬件上下文(注意中断也要保存硬件上下文只是保存的方法不同)


上下文切换的过程

pushfl    /* save    flags */pushl %%ebp       /* save    EBP   */movl %%esp,%[prev_sp]/* save    ESP   */movl %[next_sp],%%esp/* restore ESP   */movl $1f,%[prev_ip]/* save    EIP   */pushl %[next_ip]/* restore EIP   */__switch_canaryjmp __switch_to/* regparm call  */1:popl %%ebp\n\t/* restore EBP   */popfl\n/* restore flags *//* output parameters */: [prev_sp] "=m" (prev->thread.sp),[prev_ip] "=m" (prev->thread.ip),"=a" (last),/* clobbered output registers: */"=b" (ebx), "=c" (ecx), "=d" (edx),"=S" (esi), "=D" (edi)__switch_canary_oparam/* input parameters: */: [next_sp]  "m" (next->thread.sp),[next_ip]  "m" (next->thread.ip),/* regparm parameters for __switch_to(): */[prev]     "a" (prev),[next]     "d" (next)__switch_canary_iparam: /* reloaded segment registers */"memory");  

进程调用分为实时进程调度和非实时进程调度两种。前者调度时,可以采用基于动态优先级的轮转法(RR),也可以采用先进现出算法(FIFO)。后者调度时,一律采用基于动态优先级的轮转法。某个进程采用何种调度算法由改进程的进程控制块中的某些属性决定,没有专门的系统用来处理关于进程调度的相关事宜。 Linux的进程调度由schedule()函数负责,任何进程,当它从系统调用返回时,都会转入schedule(),而中断处理函数完成它们的响应任务以后,也会进入schedule()。

0 0
原创粉丝点击