Linux 内核 2.6 引入了一个新的 per-thread 字段——preempt_count——每当获取/释放锁时,该字段就会递增/递减。该字段用于允许内核抢占:“如果设置了need_resched 并且preempt_count 为零,则更重要的任务是可运行的,并且抢占是安全的。”
根据 Robert Love 的《Linux 内核开发》一书:“那么什么时候重新调度是安全的?只要内核不持有锁,内核就能够抢占内核中运行的任务。”
我的问题是:为什么在该任务持有锁时抢占内核中运行的任务不安全?
如果另一个任务被调度并试图获取锁,它将阻塞(或旋转直到它的时间片结束),所以我们不会同时让两个线程进入同一个临界区。如果我们确实抢占了在内核模式下持有锁的任务,任何人都可以概述一个有问题的场景吗?
谢谢!