في كتاب
"العصر الكهرومغناطيسي: العمل والحب والحياة ، عندما يحكم الروبوتات العالم" ، يناقش روبن هانسون باختصار تدهور البرنامج:
تم تصميم البرنامج في الأصل لمجموعة واحدة من المهام والأدوات والمواقف. لكنه يتغير ببطء لمواكبة التدفق المستمر للمهام والأدوات والمواقف الجديدة. تصبح مثل هذه البرامج أكثر تعقيدًا وهشّة ، ومن الصعب إجراء تغييرات مفيدة عليها (ليمان وبيلي ، 1985) 1 . في النهاية ، من الأفضل أن تبدأ من جديد وأن تكتب من أنظمة فرعية جديدة من نقطة الصفر ، وأحيانًا أنظمة جديدة تمامًا.
أنا متأكد من أنه صحيح. كقاعدة عامة ، يستغرق تكيف البرامج مع الظروف الجديدة وقتًا وجهدًا أكبر من وقت كتابة البرنامج الجديد من البداية. لا يحب المبرمجون الاعتراف بهذا ، لكن الأدلة واضحة. هناك العديد من الأمثلة المعروفة في مشاريع مفتوحة المصدر.
Multiprocess فايرفوكس
قامت Mozilla Firefox في البداية بتشغيل جميع المهام في عملية واحدة. مع إصدار
Google Chrome ، أصبح من الواضح أن نموذج متعدد العمليات يحسن الأمن والأداء. سرعان ما بدأ مطورو Mozilla في تخطيط كيفية تنفيذ المعالجة المتعددة في Firefox. كان ذلك في عام 2007.
بعد ما يقرب من عشر سنوات ،
أطلقت موزيلا أخيرًا
فايرفوكس متعدد المعالجات على الجمهور . هذا التأخير لم يأت على الإطلاق من قلة الرغبة. موزيلا لديها مطورين موهوبين ودوافع. ومع ذلك ، تمت كتابة Chrome من البداية في وقت أقل بكثير مما استغرقه Firefox للتغيير. هناك سببان رئيسيان لهذا:
- إعادة تشكيل بنية أحادية العملية إلى بنية متعددة العمليات تتضمن العديد من التغييرات الصغيرة. تحتاج بعض استدعاءات الوظائف إلى استبدالها باتصالات interprocess. تحتاج الحالة العامة إلى أن تكون ملفوفة في كائنات مزيفة. يجب أن تدعم التخزين المؤقت وقواعد البيانات المحلية الوصول المتزامن.
- يجب أن يحافظ Firefox على التوافق مع الامتدادات الحالية (أو يجبر المطورين على تحديثها). أنشأ Chrome واجهة برمجة تطبيقات للإضافات من البداية دون قيود.
لكن الوضع أسوأ. تتناقض القيود مع بعضها البعض: أنت بحاجة إلى إعادة بناء البنية الداخلية ، مع ترك واجهات برمجة التطبيقات العامة دون تغيير تقريبًا. لا عجب أن موزيلا استغرقت عشر سنوات للقيام بذلك.
موجه نحو الحدث اباتشي
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, , . .
↑