网站系统建设需要什么资质,厦门网络公司的网络平台,一级造价工程师报考条件及科目,wordpress对接支付接口进程切换的流程
一个进程出于某种原因想要进入休眠状态#xff0c;比如说出让CPU或者等待数据#xff0c;它会先获取自己的锁#xff1b;之后进程将自己的状态从RUNNING设置为RUNNABLE#xff1b;之后进程调用switch函数#xff0c;其实是调用sched函数在sched函数中再调…进程切换的流程
一个进程出于某种原因想要进入休眠状态比如说出让CPU或者等待数据它会先获取自己的锁之后进程将自己的状态从RUNNING设置为RUNNABLE之后进程调用switch函数其实是调用sched函数在sched函数中再调用的switch函数switch函数将当前的线程切换到调度器线程调度器线程之前也调用了switch函数现在恢复执行会从自己的switch函数返回返回之后调度器线程会释放刚刚出让了CPU的进程的锁
第1步中获取进程的锁
阻止其他CPU核的调度器线程在当前进程完成切换前发现进程是RUNNABLE的状态并尝试运行它
在进程切换的最开始进程先获取自己的锁并且直到调用switch函数时也不释放锁。而另一个线程也就是调度器线程会在进程的线程完全停止使用自己的栈之后再释放进程的锁。释放锁之后就可以由其他的CPU核再来运行进程的线程因为这些线程现在已经不在运行了。
xv6系统相关注意点
XV6中不允许进程在执行switch函数的过程中持有任何其他的锁
SleepWakeup 接口
UART的驱动
当shell需要输出时会调用write系统调用最终走到uartwrite函数中
uartwrite函数 对于buffer中的每个字符我们都会等待UART可以接收下一个字符之后写入一个字符将tx_done设置为0回到循环的最开始并再次调用sleep函数进行睡眠状态直到tx_done为1
uartintr
UART硬件会在完成传输一个字符后触发一个uartintr的中断处理程序当UART传输完了这个字符uartintr函数会将tx_done设置为1并唤醒uartwrite所在的线程。所以对于每个字符都有调用一次sleep和wakeup并占用一次循环。
exit系统调用
子进程exit的最后它都没有释放所有的资源因为它还在运行的过程中所以不能释放这些资源。相应的其他的进程也就是父进程释放了运行子进程代码所需要的资源。这样的设计可以让我们极大的精简exit的实现。