为什么在中断过程中不能进行睡眠

时间:2021-12-08 17:51:43

        运行在中断中的代码不能进行睡眠,或者阻塞!因为代码是运行在中断上下文中,并非进程上下文中,如果将中断进行睡眠的话,调度器无从得知下一个应该调度的进程,系统无法继续进行!

        关于调度器在中断过程中无法调度其他进程的问题,是由于系统设计的原因!当然你也可以将你的系统设计成在中断过程中,可以进行睡眠或阻塞!但这样会增加你系统设计的复杂程度!因为在设计过程中,你需要考虑好多,复杂的情况!所以,如果你将系统设计成可在中断中睡眠的话,除了给你的设计增加难度外,应该没有其他任何的帮助!所以说从系统设计的角度来讲,声明在中断中无法进行睡眠是有必要的!

       如果你在中断中睡眠的话,你将不得不考虑到许多复杂的情况,以下场景是你经常会遇到的!

       死锁问题:

                         1) 进程1进入kernel code

                         2) 进程1获得Lock A

                         3) 中断发生

                         4)  ISR 执行,但ISR借用进程1的stack

                         5)  ISR 试图获得Lock A

                         6)  ISR 由于无法获得 Lock A, 而进入睡眠!

       此时,就会造成系统死锁,而导致进程1 和ISR无法运行!因为进程1 在等待ISR释放stack而阻塞,而ISR在等待进程1释放Lock A而阻塞,但进程1由于被阻塞,所以无法释放Lock A而导致两者死锁!