XV6 进程调度分析

XV6操作系统中,进程调度主要在proc.c等文件中实现。调度过程包括:通过init进程和fork创建进程,scheduler函数不断循环选择可运行进程,使用swithuvm和swtch切换上下文。在时间片结束、中断或系统调用时,进程可能被yield或切换。调度器在无进程可运行时开启中断,避免CPU空转。进程间的通信借助sleep/wake,而exit/kill及wait用于进程生命周期管理。
摘要由CSDN通过智能技术生成

进程调度主要代码在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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值