核心线程实现实例
此处主要分为线程切换五部曲以及threadCreate和如何执行指令
线程切换五部曲
- 中断入口和中断出口 中断入口咋此处就是常规的中断进入,不赘述
- schedule和中断出口 schedule是调度,后续会讲述,而中断出口在此处也较为简单,显然就是弹栈即可
- switch_to(切换过程)
- 此处的切换过程,没有采用栈来弹出epi,从而返回切换的那种操作,而是采用的TSS,指令比较简单,但是时间较为繁琐,在后续的linux系统中,都不再使用此操作了,都改为使用栈来进行切换
- 需要注意的是TSS的切换是将CPU中的内容先拍给原来进程的TSS,再将新进程的TSS的内容赋值进CPU,同时让TR指向当前的TSS的描述符(即指针,具体见图)
threadCreate
- 在此处中,主要是为fetch如何创建进程的源码进行了分析,创建进程,主要是通过拷贝来创建的,在拷贝的过程中,为新的进程创建新的内核栈,但是其用户栈还是和父进程是相同的,这是因为此时还未给新创建的进程分配指令,待到后面利用exec时,便会有对应的子进程的用户栈创建了
- 需要注意的在父进程创建好子进程之后,还是继续执行父进程,直到父进程阻塞,则开始调度,调度到新建的子进程时,其会返回到创建该进程的pc指针的位置,返回值为0,从而执行exec,为该进程分配任务,创建用户栈,从而开始执行任务
exec(如何执行指令)
- 使用exec指令后,会调用int 0x80指令,中断进入后,通过sys_called找到对应的执行的内核函数sys_execve,在该函数中将对应的所需执行任务的指针赋值给epi,即可让线程执行对应的指令
- 需要注意的是,epi是通过esp+0x1C计算得到的,而epi的含义是对应的栈中保存返回指令指针的位置,通过赋值epi,即可让中断返回后,线程可以执行用户所给定的任务
####总结
操作系统的那颗树
此篇内容主要是对之前的操作系统cpu调度中进程的多进程的实现进行了一个复习和总结,理清楚其中的大概思路
cpu调度策略
调度策略有以下三个影响因素
- 周转时间
- 响应时间
- 系统内耗
为了解决这三个问题,并且让矛盾最小化,提出了不同的调度策略,有短任务优先,轮播调度,优先级调度等方法,但是都各有优缺点,以下分别列出
-
短任务优先
该策略可以让周转时间最小化,根据图中公式推导即可得
-
轮播调度
该策略可以让响应时间得到控制,不会一直等待响应,从而造成不好的体验
-
优先级调度
通过设置优先级,来决定调度,需要让优先级能根据情况来进行改变,否则容易出问题
实际的schedule
linux0.11中schedule的调度策略是折中的,非常值得借鉴和思考,其具体实现如下,包括其中用来调度的变量counter的作用也进行了总结
- 源码
- counter作用
时间片
优先级
作用总结
评论