布林奇-汉森斯之箭¶
正如你可能已经注意到的,我是一个IT历史书呆子,我们在丹麦确实有一些相当重要的早期IT历史。
如果你有扎实的CS背景,你肯定听说过餐饮哲学家和布林克-汉森从事多道程序设计的工作。
多道程序设计从根本上来说是困难的,因为您不能让一个线程持有锁A试图获取锁B,而另一个线程持有锁B试图获取锁A。
布林克-汉森在多道程序设计领域做了大量的理论和实践工作,他既擅长多道程序设计,又是这方面的先驱之一,因此被授予ACM图灵奖。
你可以在这里阅读关于他的更多信息: Brinch-Hansen Archive
在此过程中,他想出了一种简单而实用的方法来保证给定的多道程序设计系统没有死锁:绘制锁定顺序,并确保所有箭头都指向右侧。
当我们开始在FreeBSD中使用多核系统时,我们肯定会在未来遇到死锁,我们采用并扩展了最初为BSDI编写的名为“WITESS”的工具,该工具实时监视Brinch-Hansens箭头。
从历史上看,我一直很擅长避免死锁,对我来说,想到锁定顺序似乎是很自然的,但并不是每个人都有这种感觉,目击者已经捕捉到了很多“哦,没想到 that “多年来的情况。
Varnish有一个非常简单的锁定结构并不是偶然的,但随着我们为Varnish添加越来越多的灵活性和可扩展性,它在这里和那里都有一些增长,前几天我设法引入了锁顺序颠倒-我想这是大约五年来的第一次。
由于我显然在这里逐渐变老,我认为是时候对瓦尼什进行布林克-汉森检查了。
我曾短暂地考虑过将WITENCE移植到Varnish,但它有3k行代码,而且我们在回归测试中有非常好的代码覆盖率,所以我决定将其作为后处理。
我已经添加了默认关闭的调试代码来发出VSL“Witness”记录,教会了varnishtest如何启用该代码,并添加了一个小的Python脚本来将这些记录处理成一个漂亮的图:
你看:所有的箭头都指向右边。
phk