Jun
Jun
## 调度器类 Linux 中以模块的方式提供调度器类(scheduler class),这样不同类型的进程可以有针对的选择调度算法/策略。 对于各个调度器类,都必须是实现 sched_class 的一个实例。 ```c // tags/v4.18 - kernel/sched/sched.h struct sched_class { const struct sched_class *next; void (*enqueue_task) (struct rq *rq, struct task_struct *p, int flags);...
## 调度实体 调度器作用于可调度实体,不限于调度进程。普通进程的一个实体由 sched_entity 结构来表示。 ```c // tags/v4.18 - include/linux/sched.h struct sched_entity { /* For load-balancing: */ struct load_weight load; unsigned long runnable_weight; struct rb_node run_node; struct list_head group_node; unsigned...
## 运行队列 sched_class 调度器类提供大多数操作是基于 rq(运行队列 runqueue)实现的,每个 CPU 都有自己的一个主运行队列,数据结构定义在 kernel/sched/sched.h: ```c // tags/v4.18 - kernel/sched/sched.h /* * This is the main, per-CPU runqueue data structure. * * Locking rule: those places...
到目前为止,有了调度器类,调度器类操作的运行队列以及可调度实体,那开始调度吧。 Linux 提供两种激活调度的调度器,主调度器和周期性调度器。 ## 周期性调度器 周期性调度器在 scheduler_tick 中实现,内核会按照频率 HZ 自动调用该函数。 ```c // tags/v4.18 - kernel/sched/core.c /* * This function gets called by the timer code, with HZ frequency. * We...
@yetingsky - -!
@Panlq 并不是“实现了__del__方法的对象,会被放入finalizers中”,上面提到的是 > 拥有finalizer的实例对象指的就是实现了 tp_del 函数的对象。 在Python3.4 之前 `__del__` 方法确实对应 tp_del 函数,3.4之后引入 tp_finalize 来表示 `__del__`。  而 pep0442 解决的是在3.4 之前,实现`__del__` 的对象不会被回收的问题 ```py [I] ➜ ipython Python 3.3.7 (default, Jun 12...
@Panlq > 与old合并的话,如果old达到阈值触发gc,仍然是finalizers,这样不是死循环了吗,到底被触发GC回收呢? 这个我没太明白你的描述,你是指触发gc之后,old代的count会一直超过threshold么? 如果是这个意思的话,那么需要知道的是count不是只表示数量(只有0代是),1代或2代的count表示的是回收次数,而且每次代垃圾回收的时候,count会置为0。
@Panlq 我不明白你的困惑在哪里 - - 另外,上面摘取代码注释应该好几段混在一起了吧,可读性太差了。。。 > 当实现__del__方法的对象之间存在循环引用的时候,当调用gc ,subtract 循环引用后,也就会调用对象各自的__del__方法了,所以打印了 subtract_refs 处理循环引用之后,会将不可达对象收集到unreachable, 然后通过move_legacy_finalizers收集finalizers(实现tp_del的对象),move_legacy_finalizer_reachable 将finalizers 的引用对象也放到finalizers里面。finalizers最终会合并到old里面。 finalize_garbage则是执行不可达对象的 `__del__`( tp_finalize 函数),且保证只执行一次。 > 实现了__del__方法的对象也是会被放入到finalizers的吧 这个应该是错的。 ```c /* Handle uncollectable garbage (cycles with tp_del slots,...
> > 我们注意到这样一个事实,如果两个对象的引用计数都为1,但是仅仅存在它们之间的循环引用,那么这两个对象都是需要被回收的 > > 这一段不太明白。这只是逻辑层说明这种也是需要被清除么,还是垃圾回收有这个代码操作。我理解只要是跟对象不可达的对象就可以被清除吧。不需要做这个判断。 这是逻辑上的说法,对象之间形成了循环引用,引用计数没办法清楚这些对象,所以需要引入标记清除
@kzinglzy 不是的,quicklist是一种实现 https://github.com/antirez/redis/blob/unstable/src/quicklist.c#L94