XV6 进程调度分析

进程调度主要代码在proc.c 另外trap.c syscall.c sysproc.c vm.c spinlock.c等文件中有相关部分。

主要特性总结如下:

    0、中断可以保证单CPU中代码段的原子性,自旋则实现多CPU之间的互斥。
    1、系统先自构造一个init进程的数据保存起来待运行,构造init进程需要调用userinit()函数,构造其他进程则需当前进程调用sys_fork()(实际为fork()函数),这两个函数都需要使用allocproc()函数来分配进程号进程内核栈等操作。不同之处在于userinit()是手工填入了进程的其他信息(段,寄存器,装入运行程序代码);fork()函数则是直接复制了父进程的大部分信息(没有实现写时复制),并设置返回值。
    2、每个CPU初始化完毕后就载入scheduler函数开始进程调度,scheduler函数是个死循环,不停的通过内循环遍历所有进程状态,由于遍历的过程中可能会改变进程状态,所以,一次遍历的内循环外需要加锁保护(多个CPU之间保护)。
    3、一旦scheduler函数发现有待运行的进程就调用swithuvm来载入这个进程段数据,并且把这个进程设置为运行中,调用swtch()来切换进程的内核态上下文,swtch()返回后就到了forkret()(新进程)或者sched()(yield,sleep,exit这种会导致进程切换的函数中调用的sched),具体哪个函数要看swtch切换的进程上下文状态而定。如果没有发现待执行进程则到第6步。
    4、进程从swtch()返回后,要把scheduler()加的锁释放掉,然后返回到系统调用或者中断返回处,进入用户态运行。
    5、如果运行中遇到时间片切换(则立刻调用yi

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值