cond_resched的使用

kernel 4.18(centos8)中的cond_resched

在可抢占内核中,在内核态有很多抢占点,在有高优先级的进程需要运行时,就会在抢占点到来时执行抢占;而在内核不可抢占系统中(如centos系统),在内核态运行的程序可调用cond_resched主动让出cpu,防止其在内核态执行时间过长导致可能发生的soft lockup或者造成较大的调度延迟。

如下should_resched函数,当__preempt_count=0(不处于中断上下文:没有硬中断,没有软中断,没有NMI中断;抢占也是开启的)时,可以继续执行调度。

preempt_schedule_common:

__schedule(bool preempt): 

在schedule函数调用中,preempt参数等于true,所以并不会将调用cond_resched的线程从runqueue中移除(不像因等待资源,如mutex的线程,需要将其从runqueue中移除,因为它已经放在资源的等待队列上了),这样可以加快该线程再次被调度的过程。

实例1

上述代码加入了cond_resched,因调用bch_cache_cmp的sort函数比较耗时,又是因为运行在内核态,所以在内核不可抢占的系统中(如centos)为防止可能发生的soft lockup或者造成较大的调度延迟,所以加入了cond_resched函数,主动让出cpu(尽管可能使sort的执行变长)。

__shedule:

如上,如centos系统内核抢占是关闭的,在内核态主动让出cpu可以调用cond_resched。

实例2

http://bugzilla.redhat.com/show_bug.cgi?id=1471875  soft lockups umount when dentry cache is very large

在umount时,回收1024个dentry后,就主动让出cpu,防止占用CPU太久。

发布了158 篇原创文章 · 获赞 115 · 访问量 37万+

猜你喜欢

转载自blog.csdn.net/yiyeguzhou100/article/details/103544680