哈工大操作系统总结v0.3(进程间切换的实现)

核心线程实现实例

此处主要分为线程切换五部曲以及threadCreate和如何执行指令

线程切换五部曲

  • 中断入口和中断出口 中断入口咋此处就是常规的中断进入,不赘述

中断入口

  • schedule和中断出口 schedule是调度,后续会讲述,而中断出口在此处也较为简单,显然就是弹栈即可

中断出口

  • switch_to(切换过程)
  1. 此处的切换过程,没有采用栈来弹出epi,从而返回切换的那种操作,而是采用的TSS,指令比较简单,但是时间较为繁琐,在后续的linux系统中,都不再使用此操作了,都改为使用栈来进行切换
  2. 需要注意的是TSS的切换是将CPU中的内容先拍给原来进程的TSS,再将新进程的TSS的内容赋值进CPU,同时让TR指向当前的TSS的描述符(即指针,具体见图)

切换过程

threadCreate

  • 在此处中,主要是为fetch如何创建进程的源码进行了分析,创建进程,主要是通过拷贝来创建的,在拷贝的过程中,为新的进程创建新的内核栈,但是其用户栈还是和父进程是相同的,这是因为此时还未给新创建的进程分配指令,待到后面利用exec时,便会有对应的子进程的用户栈创建了
  • 需要注意的在父进程创建好子进程之后,还是继续执行父进程,直到父进程阻塞,则开始调度,调度到新建的子进程时,其会返回到创建该进程的pc指针的位置,返回值为0,从而执行exec,为该进程分配任务,创建用户栈,从而开始执行任务

threadCreate

copy

copy

exec(如何执行指令)

  • 使用exec指令后,会调用int 0x80指令,中断进入后,通过sys_called找到对应的执行的内核函数sys_execve,在该函数中将对应的所需执行任务的指针赋值给epi,即可让线程执行对应的指令
  • 需要注意的是,epi是通过esp+0x1C计算得到的,而epi的含义是对应的栈中保存返回指令指针的位置,通过赋值epi,即可让中断返回后,线程可以执行用户所给定的任务

exec

exec

exec

####总结 总结

操作系统的那颗树

此篇内容主要是对之前的操作系统cpu调度中进程的多进程的实现进行了一个复习和总结,理清楚其中的大概思路

cpu调度策略

调度策略有以下三个影响因素

  • 周转时间
  • 响应时间
  • 系统内耗

调度

为了解决这三个问题,并且让矛盾最小化,提出了不同的调度策略,有短任务优先,轮播调度,优先级调度等方法,但是都各有优缺点,以下分别列出

  • 短任务优先

    该策略可以让周转时间最小化,根据图中公式推导即可得

调度

  • 轮播调度

    该策略可以让响应时间得到控制,不会一直等待响应,从而造成不好的体验

调度

  • 优先级调度

    通过设置优先级,来决定调度,需要让优先级能根据情况来进行改变,否则容易出问题

优先级调度

优先级调度

实际的schedule

linux0.11schedule的调度策略是折中的,非常值得借鉴和思考,其具体实现如下,包括其中用来调度的变量counter的作用也进行了总结

  • 源码

源码

  • counter作用

时间片

时间片

优先级

优先级

作用总结

总结

end

评论