天天看点

leetcode第一刷_Best Time to Buy and Sell Stock IIsched.c sched.h 代码分析笔记

首先上header file

            每个任务都有两个堆栈,分别用于用户态和内核态程序的执行,并且分别称为用户态堆栈和内核态堆栈。处于不同的cpu特权级中,这两个堆栈之间的主要区别在于任务的内核态堆栈很小,所保存的数量最多不能超过4096-任务数据结构块个字节,大约为3k,而任务的用户态堆栈却可以在用户的64m空间内延伸。

leetcode第一刷_Best Time to Buy and Sell Stock IIsched.c sched.h 代码分析笔记

关于show_task讨论的一些帖子

http://www.oldlinux.org/oldlinux/viewthread.php?tid=12182

http://www.oldlinux.org/oldlinux/viewthread.php?tid=14683

              在内核中的调度程序用于选择系统中下一个要运行的进程。这种选择运行机制是多任务操作系统的基础。调度程序可以看作为处于运行状态都进程之间分配cpu运行时间的管理代码。linux进程是抢占式的,但被抢占的进程仍处于task_running状态,只是暂时没有被cpu运行。进程的抢占发生在进程处于用于态执行阶段,在内核态执行时是不能被强制的。(0.12的不可以,貌似现在的可以了)

             schdule()函数首先扫描任务数组,通过比较每个就绪状态任务的运行时间递减滴答计数counter的值来确定当前哪个进程运行的时间最少,哪个counter值最大,就表示运行时间还不长,于是就选中该进程,并使用任务切换宏函数到该进程运行。

leetcode第一刷_Best Time to Buy and Sell Stock IIsched.c sched.h 代码分析笔记

       每当选择出一个新的可以运行的进程时,switch_to()宏执行实际进程切换操作。该宏会把cpu的当前进程状态(context)切换成新进程的状态。

       在切换之前,switch_to首先检查要切换的进程是否就是当前进程。如果是,啥也别做,直接退出。如果不是,就把内核全局变量current置为新任务的指针。然后ljmp 长跳转到新任务的状态段tss组成的地址处,造成cpu执行任务切换操作。此时,cpu会把其所有寄存器的状态保存到当前任务寄存器tr中tss段选择所指向的当前进程任务数据结构,然后把新任务状态段选择符所指向的新任务数据结构tss结构中的寄存器恢复到cpu中,系统正式开始运行新切换的任务。

为什么会执行这句话

既然任务切换时cpu会恢复寄存器现场,那么它当然也会保存寄存器现场了。这些寄存器现场都会被写入原任务的tss结构里,值得注意的是,eip会指向引起任务切换指令ljmp的下一条指令cmpl,所以,很明显,当原任务有朝一日再次被调度运行时,它将从eip所指的地方,而这个地方恰巧是cmpl !

比较有用的一个帖子:

http://www.oldlinux.org/oldlinux/archiver/?tid-5390.html

leetcode第一刷_Best Time to Buy and Sell Stock IIsched.c sched.h 代码分析笔记
leetcode第一刷_Best Time to Buy and Sell Stock IIsched.c sched.h 代码分析笔记