在
《电磁时代:机器人统治世界时的工作,爱情和生活》一书中
,罗宾·汉森(Robin Hanson)简要讨论了程序降级:
该软件最初是为一组任务,工具和情况而设计的。 但是它正在慢慢变化以应对源源不断的新任务,新工具和新情况。 这样的软件变得更加复杂,脆弱,很难对其进行有用的更改(Lehman和Biledy,1985年) 1 。 最后,最好从头开始并从头开始编写新的子系统,有时甚至是全新的系统。
我相信这是真的。 通常,与从头开始编写新软件相比,要使软件适应新条件需要更多的时间和精力。 程序员不喜欢承认这一点,但是证据是显而易见的。 开源项目中有几个著名的示例。
多进程Firefox
Mozilla Firefox最初在一个过程中运行所有任务。 随着
Google Chrome浏览器的发布
,很明显,多进程模型提高了安全性和性能。 Mozilla开发人员很快开始计划如何在Firefox中实现多处理。 那是在2007年。
近十年后,Mozilla终于
向大众发布了多进程Firefox 。 这种拖延根本不是出于缺乏欲望。 Mozilla具有才华横溢且积极进取的开发人员。 但是,Chrome从头开始编写的时间比Firefox更改所需的时间少得多。 这样做的主要原因有两个:
- 将单进程体系结构重构为多进程体系结构涉及许多小的更改。 一些函数调用需要用进程间通信代替。 一般状态需要包装在互斥体中。 缓存和本地数据库必须支持并发访问。
- Firefox应该保持与现有扩展的兼容性(或迫使开发人员对其进行更新)。 Chrome浏览器从头开始为扩展创建了API,没有这些限制。
但是情况更糟。 这些限制相互矛盾:您需要重建内部体系结构,但保留公共API几乎不变。 难怪Mozilla花了十年的时间来做到这一点。
面向事件的Apache
Apache httpd « ». 80,
accept()
fork()
.
read()
write()
. ,
close()
exit()
.
, … . , . : 1995 . Apache , . ,
10 000 . « » 1000 1000 . , . .
,
Nginx .
Slowloris.
Nginx 2007 , . Nginx Apache httpd .
event Apache 2.2 2005 . . , , mod_php. 2012 , Apache 2.4 (MPM) . ,
prefork MPM-, Nginx. Apache / . MPM httpd
2.
CPython GIL
Python — . , ( , ) . Python : .
GIL.
:
CPython — , . , CPython . ( GIL , ).
GIL . Python . GIL , . . GIL — . CPython, , , Google, Microsoft Intel,
GIL .
, . , , , , .
, . , . , .
1. « : ». , -. . , .
↑2. , httpd, , . .
↑