一个借贷式用户态自旋锁的自白

哈哈,又是借贷式,这回是自旋锁。

先看一个 patch:[POC][RFC][PATCH v2] sched: Extended Scheduler Time Slice

详情看这篇文章:Deferred scheduling for user-space critical sections

中文版在这里:Deferred scheduling for user-space critical sections

该我掰扯了。

让持锁进程多运行一会儿以尽量尽快离开临界区,能减少抢锁者在持锁者被抢占后阻塞。这想法很棒,但 patch 拖沓了,Peter 会觉得这又是一个启发式把戏。

我之前也想到了这个并用于了网络传输,让短消息流量尽快抢先发送,因为大部分短消息会结束等待,推进系统状态改变,和上述 patch 一样,统计复用系统中,一切都无法打包票,只尽力而为。

融入借贷思想(再次感谢欧文费雪的《利息理论》),该 patch 表达的意思就可以非常简洁地实现:

  • spin_lock:借入时间,提高动态优先级。
  • spin_unlock:归还时间,降低动态优先级,若临界区内未切换,再降一点作为利息。

结合 Peter Zijlstra 的 EEVDF 调度器更好:

  • spin_lock:减慢 vtime 流速,减小时间片,作为 “重要且紧急” 参与调度。
  • spin_unlock:加快 vtime 流速,恢复时间片,恢复正常,vtime 超出多一些作为利息。

有借有还,归还本息。拉长时间看,什么都没有发生,整体上均值期望没有变化。

task A 持有 spinlock 时同时提高了重要性和紧急性,task B 抢占 task A 时,调度器基于 EEVDF 算法选择 task,由于 task A 此时既重要又紧急,调度器继续选中它的概率极大,除非 task B 更加重要和紧急。

task A 释放 spinlock 时,为了公平,它必须将额外获得的时间还回去,多执行了 1ms,下次就少执行 1ms。由于 task B 抢占失败而造成的 task B 的不耐,task A 甚至要多归还一些时间补偿 task B 的等待,本息一起,task A 借入 1ms,归还 1.5ms。

带利息归还更多时间可防止 task 不断通过 spin_lock 操作挤兑时间的行为。

以上,这样就可以将这个 patch 要表达的思想和 EEVDF 完美结合在一起了。有空了写个 poc 试试。

浙江温州皮鞋湿,下雨进水不会胖。

你可能感兴趣的:(spinlock)