张潇月+ 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
一、进程调度与进程调度的时机分析
1.不同类型的进程有不同的调度需要
第一种分类:I/O-bound、CPU-bound;第二种分类:批处理过程、实时进程、交互式进程;
2.什么是调度策略?
是一组规则,他们决定什么时候以怎样的方式选择一个新的进程运行。
3.liunx进程的优先级
用特定的算法计算出进程的优先级,用一个值表示,这个值表示把进程如何适当的分配给CPU
Linux进程中的优先级是动态的,调度程序会根据进程的行为周期性的调整进程的优先级
较长时间未非配到CPU,优先级上升;在CPU上运行了很长时间,优先级下降。
4.schedule函数(负责实现调度)
进程调度的时机:
中断处理过程、直接调用schedule函数或返回用户态的根据need_resched标记调用schedule
内核线程可以直接调用schedule函数进行进程切换,可主动可被动
用户态进程无法实现主动调度,仅能通过某个时机进行调度,即中断处理过程中进行调度。
用户态进程只能被动调用。
二、进程上下文切换的代码分析
为了控制进程的执行,内核必须有能力挂起正在CPU上执行的进程,并恢复以前挂起的某个进程的执行,这叫做进程切换、任务切换、上下文切换;
挂起正在CPU上执行的进程,与中断时保存现场是不同的,中断前后是在同一个进程上下文中,只是由用户态转向内核态执行;
进程上下文包含了进程执行需要的所有信息
用户地址空间:包括程序代码,数据,用户堆栈等
控制信息:进程描述符,内核堆栈等
硬件上下文(注意中断也要保存硬件上下文只是保存的方法不同)
schedule()函数选择一个新的进程来运行,并调用context_switch进行上下文的切换,这个宏调用switch_to来进行关键上下文切换
先是选择进程
进程上下文切换
关键
next_ip一般是$1f,对于新创建的子进程是ret_from_fork
jmp是寄存器传递参数的
三、Linux系统的一般执行过程分析
1.最一般的情况:
关键点:中断和中断返回有一个CPU上下文的切换,进程调度过程中有进程上下文的切换。
2.特殊情况:
next_ip=ret_from_fork
3.内核与舞女
dancing girl vs. taxi girl
哪一个进程招手就可以陷入到内核态,内核态里面走一程之后返回到用户态,再需要到中断就进入到内核态,没人了就空转。内核就相当于舞女,进程就相当于客人。内核是各种中断处理过程中和内核线程的集合。
四、Linux操作系统架构和系统执行过程概览
操作系统的基本概念
操作系统内核架构
最简单也是最复杂的操作——执行ls命令
从CPU和内存的角度看Linux系统的执行