Warning: Undefined global variable $debug in /var/www/ourcoders/tiny4cocoa/application/controllers/baseController.php on line 124
notOnlyCRUD 2020-01-03 22:07:23 发布的技术动态 - OurCoders (我们程序员)
notOnlyCRUD
2020-01-03 22:07:23 发布
OS中所谓阻塞或者挂起,内核中实际发生以下几件事:

1. 把自己挂在等待队列上。注意这里的等待队列实际上分散在内核当中的,可以是任何资源,并不存在一个集中挂睡眠进程的地方(想一下,Go里头任何一个channel都有2个字段挂goroutine)。也就是说进程随遇而安,哪里卡住了就sleep在哪里, wait_queue is created on the fly;
2. 从调度red-black tree移除,不再参与调度;
3. 调用schedule()选择下一个具有最高优先级的进程运行。
注意,进程的内核栈切换是在schedule()中完成的,等schedule()返回的时候就是新进程的上下文了,上一个进程的cpu上下文, address_space(页表)等都已经完成切换;