HUST OS 6.3 Linux进程调度【自学笔记】

6.3Linux进程调度

普通进程
1.采用动态优先级来调度
2.调度程序周期性地修改优先级(避免饥饿)

实时进程:
1.采用静态优先级来调度;
2.由用户预先指定,以后不会改变.

  • 静态优先级:
    进程创建时指定或用户修改

  • 动态优先级:
    进程运行期间可以按照调度策略改变
    非实时进程采用动态优先级,由调度程序计算
    只要进程占用CPU,优先级就随着时间流逝而不断减小
    task_struct counter表示优先级

实时进程:
task_struct定义的三个宏
SCHED_FIFO(先进先出)
SCHED_RR(时间片轮转)

非实时进程(普通进程)
SCHED_OTHER(动态优先级)
counter成员表示动态优先级

调度策略的改变
sched_setscheduler()改变调度策略.
实时进程的子进程也是实时进程;

  • 动态优先级与counter
    含义:进程能连续运行的时间,单位是时钟滴答tick
    较高优先级的进程一般counter较大.
    一般吧counter看作动态优先级

  • counter的初值与priority有关
    普通进程,counter初值=priority
    counter的改变
    时钟中断tick时,当前进程的counter-1,直到为0被阻塞.

  • 新建的子进程的counter为父进程时间片counter中继承一半.

防止用户无限制创建子进程而恶意占用CPU

中断处理过程中直接调用 schedule()
1.时钟中断,I/O中断,系统调度和异常
中断处理过程返回用户态时直接调用 schedule()
必须根据 need_resched标记

  • 进程切换:
    概念:
    内核挂起当前CPU上的进程并恢复之前挂起的某个进程
    任务切换,上下文切换

与中断的上下文切换有差别:
中断前后在统一进程上下文中,只能用户态转向内核态进行.

  • 进程调度和切换的流程
    schedule()函数
    1.选择新进程next=pick_next_task(rq,prev) : //进程调度算法
    2.调用宏context_switch(rq.prev,next)切花进程上下文
    1.prev:当前进程,next:被调度的新进程
    2.调用switch_to(prev,next) 切换上下文.

你可能感兴趣的:(Linux,OS)