معمارية العمليات والذاكرة
2.1. معمارية العمليات (Process Architecture)
PostgreSQL هو نظام إدارة قواعد بيانات علائقية بنموذج عميل/خادم (client/server) يتميّز بمعمارية متعددة العمليات تعمل على مضيف واحد.
تُعرف مجموعة العمليات المتعددة التي تدير عنقود قواعد البيانات تعاونيًا باسم «خادم PostgreSQL»، وهي تشمل الأنواع التالية من العمليات:
- عملية خادم Postgres (Postgres server process): الأصل لجميع العمليات المتعلقة بإدارة عنقود قواعد البيانات.
- العمليات الخلفية (Backend processes): تتولى كل عملية خلفية معالجة جميع الاستعلامات والعبارات التي يصدرها عميل متصل.
- العمليات في الخلفية (Background processes): عمليات متنوعة تنفّذ مهام إدارة قاعدة البيانات، مثل عمليات VACUUM وCHECKPOINT.
- عمليات النسخ المتماثل (Replication-associated processes): عمليات تنفّذ النسخ المتماثل المتدفق (streaming replication). وتُقدَّم تفاصيل إضافية في الفصل 11 والفصل 12.
- عمليات العمال في الخلفية (Background worker processes): مدعومة منذ الإصدار 9.3، ويمكن لهذه العمليات تنفيذ أي منطق يُنفّذه المستخدم. لمزيد من المعلومات، راجع التوثيق الرسمي.
وتصف الأقسام الفرعية التالية تفاصيل الأنواع الثلاثة الأولى من العمليات.

الشكل 2.1. مثال على معمارية العمليات في PostgreSQL.
يوضّح هذا الشكل معمارية العمليات في خادم PostgreSQL، بما في ذلك عملية خادم postgres، وعمليتا خلفية (backend)، وسبع عمليات في الخلفية (background)، وعمليتا عميل. ويظهر أيضًا عنقود قواعد البيانات والذاكرة المشتركة.
** لماذا يستخدم PostgreSQL نموذج العمليات.
في أوائل التسعينيات من القرن العشرين، عندما بدأ تطوير PostgreSQL، كان استخدام نموذج قائم على العمليات هو الخيار العملي الوحيد. في ذلك الوقت، لم تكن خيوط POSIX (POSIX Threads) قد وُحِّدت بعد، وكانت تطبيقات الخيوط غير مستقرة للغاية. وبالحفاظ على هذه المعمارية حتى اليوم، يواصل PostgreSQL جني الفوائد التالية:
- عزل متين (Robust Isolation): بما أن كل عملية خلفية تعمل باستقلالية، فإن انهيار جلسة معينة يُمنع من الانتقال إلى بقية النظام.
- إدارة الذاكرة على مستوى نظام التشغيل (OS-Level Memory Management): تُقسَّم مساحات الذاكرة تقسيمًا صارمًا بين العمليات، ما يضمن سلامة البيانات. علاوة على ذلك، يتولى نظام التشغيل بشكل موثوق تحرير الموارد عند إنهاء العملية.
وفي السنوات الأخيرة، تكرّرت النقاشات حول الانتقال إلى الخيوط (threads) لإزالة الكلفة الناتجة عن إنشاء العمليات. غير أن كلفة إعادة هيكلة قاعدة شيفرة ضخمة وموروثة لتكون آمنة تجاه الخيوط ومخاطرها هائلة. وإضافة إلى ذلك، قلّلت التطورات في أنظمة التشغيل الحديثة هذه الكلفة تقليلًا كبيرًا. ونتيجة لذلك، يستمر PostgreSQL في اعتماد نموذج عملياته عالي الموثوقية.
محتويات القسم
- 2.1.1. عملية خادم Postgres
- 2.1.2. العمليات الخلفية
- 2.1.3. العمليات في الخلفية
2.1.1. عملية خادم Postgres
عملية خادم Postgres هي الأصل لجميع العمليات داخل خادم PostgreSQL. وفي الإصدارات الأقدم، كانت هذه العملية تُسمى postmaster.
تبدأ عملية خادم Postgres عند تنفيذ أداة pg_ctl مع الخيار «start».
وعند بدئها، تخصّص منطقة ذاكرة مشتركة، وتُطلق عمليات في الخلفية متنوعة، وتبدأ عمليات النسخ المتماثل أو عمليات العمال في الخلفية حسب الحاجة. ثم تنتظر طلبات الاتصال من العملاء. وعند استقبال أي طلب اتصال، تُنشئ عملية خادم Postgres عملية خلفية مخصصة للتعامل مع جلسة العميل.
تستمع عملية خادم Postgres إلى منفذ شبكة محدد، والمنفذ الافتراضي هو 5432. وبينما يمكن تشغيل عدة خوادم PostgreSQL على المضيف نفسه، يجب ضبط كل نسخة للاستماع إلى رقم منفذ فريد (مثل 5432 و5433 وغيرها).
2.1.2. العمليات الخلفية
العملية الخلفية (backend process)، وتُسمى أيضًا عملية postgres، تُنشئها عملية خادم Postgres وتتولى معالجة جميع الاستعلامات التي يصدرها عميل واحد متصل. وتتواصل مع العميل عبر اتصال TCP واحد، وتنتهي عند فصل العميل.
ولا يمكن لكل عملية خلفية أن تعمل إلا على قاعدة بيانات واحدة في كل مرة؛ لذلك يجب اختيار قاعدة بيانات محددة أثناء عملية الاتصال.
يدعم PostgreSQL الاتصالات المتزامنة من عدة عملاء، ويحكم الحد الأقصى لعددها معامل التهيئة max_connections (القيمة الافتراضية: 100).
ولأن PostgreSQL لا يمتلك ميزة تجميع الاتصالات الأصلية، فإن دورات الاتصال والانقطاع المتكررة — الشائعة في تطبيقات مثل خدمات الويب — قد تزيد كلفة إنشاء الاتصالات وإنشاء العمليات الخلفية.
وقد تؤثر هذه الكلفة سلبًا على الأداء العام لخادم قاعدة البيانات. وللتخفيف من ذلك، يُستخدم عادةً برمجيات وسيطة لتجميع الاتصالات مثل pgbouncer أو pgpool-II.
2.1.3. العمليات في الخلفية
يسرد الجدول 2.1 العمليات الأساسية في الخلفية.
وعلى عكس عملية خادم Postgres والعمليات الخلفية، لا يمكن تلخيص وظائف العمليات في الخلفية بسهولة لأنها تعتمد على ميزات محددة وتفاصيل داخلية عميقة في PostgreSQL.
لذلك، يقدّم هذا القسم تعريفًا موجزًا فقط بكل عملية. وتُقدَّم شروح مفصلة في الفصول اللاحقة.
| العملية | الوصف | المرجع |
|---|---|---|
| background writer | يكتب الصفحات المتسخة (dirty pages) دوريًا وتدريجيًا من مجمع المخازن المؤقتة المشتركة (shared buffer pool) إلى التخزين الدائم (مثل HDD وSSD). (في الإصدارات 9.1 والأقدم، كان مسؤولًا أيضًا عن تنفيذ نقاط التفتيش.) | القسم 8.6 |
| checkpointer | ينفّذ عمليات نقطة التفتيش في الإصدارات 9.2 أو أحدث. | القسم 8.6، القسم 9.7 |
| autovacuum launcher | يستدعي دوريًا عمليات عمال التفريغ التلقائي لتنفيذ عمليات VACUUM وANALYZE. (تقنيًا، يطلب من عملية خادم Postgres إنشاء عمال التفريغ التلقائي.) | القسم 6.5 |
| WAL writer | يكتب ويدفّق دوريًا بيانات WAL من مخزن WAL المؤقت إلى التخزين الدائم. | القسم 9.6.1 |
| WAL Summarizer | يتتبّع التغييرات على جميع كتل قاعدة البيانات ويكتب هذه التعديلات في ملفات ملخص WAL. وأُدخلت هذه العملية في الإصدار 17 (عام 2024). | القسم 9.6.2 |
| statistics collector | يجمع الإحصاءات لعروض النظام مثل pg_stat_activity وpg_stat_database. | |
| logging collector (logger) | يلتقط رسائل الأخطاء ويكتبها في ملفات السجل. | |
| io worker | يتعامل مع عمليات القراءة بشكل غير متزامن لتخفيف مهام الإدخال/الإخراج عن العمليات الخلفية. (أُدخل الإدخال/الإخراج غير المتزامن في الإصدار 18 (عام 2025) لتحسين أداء الإدخال/الإخراج.) | القسم 8.5.2.2 |
| archiver | ينفّذ عملية أرشفة السجل. | القسم 9.10 |
** معلومة
تظهر العمليات الفعلية لخادم PostgreSQL أدناه.
في هذا المثال، توجد عملية خادم postgres واحدة (PID 6541)، وعمليتان خلفيتان (PID 8412 و8482)، وعدة عمليات في الخلفية كما هو مسرود في الجدول 2.1. انظر أيضًا الشكل 2.1.
$ pstree -p 6541
-+= 00001 root /sbin/launchd
\-+= 06541 postgres /usr/local/pgsql/bin/postgres -D data
|--= 06542 postgres postgres: io worker 0
|--= 06543 postgres postgres: io worker 1
|--= 06544 postgres postgres: io worker 2
|--= 06545 postgres postgres: checkpointer
|--= 06546 postgres postgres: background writer
|--= 06548 postgres postgres: walwriter
|--= 06549 postgres postgres: autovacuum launcher
|--= 06550 postgres postgres: walsummarizer
|--= 06551 postgres postgres: logical replication launcher
|--= 08412 postgres postgres: postgres testdb [local] idle
\--= 08482 postgres postgres: postgres testdb [local] idle in transaction
2.2. معمارية الذاكرة (Memory Architecture)
يمكن تصنيف معمارية الذاكرة في PostgreSQL إلى فئتين عريضتين:
- منطقة الذاكرة المحلية (Local memory area): تخصّصها كل عملية خلفية لاستخدامها الخاص.
- منطقة الذاكرة المشتركة (Shared memory area): تستخدمها جميع عمليات خادم PostgreSQL.
وتقدّم الأقسام الفرعية التالية وصفًا موجزًا لكل فئة.

الشكل 2.2. معمارية الذاكرة في PostgreSQL.
محتويات القسم
- 2.2.1. منطقة الذاكرة المحلية
- 2.2.2. منطقة الذاكرة المشتركة
2.2.1. منطقة الذاكرة المحلية
تخصّص كل عملية خلفية منطقة ذاكرة محلية لمعالجة الاستعلامات. وتُقسَّم هذه المنطقة إلى عدة مناطق فرعية تكون أحجامها ثابتة أو متغيّرة.
ويسرد الجدول 2.2 المناطق الفرعية الأساسية. وتُقدَّم تفاصيل إضافية بشأن هذه المناطق في الفصول اللاحقة.
| المنطقة الفرعية | الوصف | المرجع |
|---|---|---|
| work_mem | يستخدمه المنفِّذ لفرز الصفوف (tuples) في عمليات ORDER BY وDISTINCT، ولربط الجداول عبر عمليات الربط بالدمج والربط بالتجزئة (merge-join وhash-join). | الفصل 3 |
| maintenance_work_mem | يُستخدم في عمليات الصيانة المتنوعة، مثل VACUUM وREINDEX وإنشاء الفهارس. | القسم 6.1 |
| temp_buffers | يستخدمه المنفِّذ لتخزين الجداول المؤقتة طوال مدة الجلسة. |
بالإضافة إلى ذلك، أُدخلت الذاكرة المشتركة الديناميكية (DSM) في الإصدار 9.4 لدعم الاستعلام المتوازي.
والذاكرة المشتركة الديناميكية هي مساحة ذاكرة عند الطلب (تُخصَّص حسب الحاجة وتُحرَّر عند عدم الحاجة إليها) تُستخدم للتواصل بين عمليات PostgreSQL.
2.2.2. منطقة الذاكرة المشتركة
تُخصَّص منطقة الذاكرة المشتركة بواسطة خادم PostgreSQL أثناء بدء التشغيل. وتُقسَّم هذه المنطقة إلى عدة مناطق فرعية ثابتة الحجم. ويسرد الجدول 2.3 المناطق الفرعية الأساسية، مع تقديم تفاصيل إضافية في الفصول اللاحقة.
| المنطقة الفرعية | الوصف | المرجع |
|---|---|---|
| shared buffer pool | يحمّل PostgreSQL الصفحات من الجداول والفهارس من التخزين الدائم إلى هذه المنطقة ليعمل عليها مباشرة. | الفصل 8 |
| WAL buffer | لضمان سلامة البيانات في مواجهة أعطال الخادم، يستخدم PostgreSQL آلية سجل ما قبل الكتابة (WAL). وتشكّل بيانات WAL (وتُسمى أيضًا سجلات XLOG) سجل المعاملات. ويعمل المخزن المؤقت لـ WAL كمنطقة تخزين مؤقت لبيانات WAL قبل دفقها إلى التخزين الدائم. | الفصل 9 |
| commit log | يحتفظ سجل الالتزام (CLOG) بحالة جميع المعاملات (مثل قيد التنفيذ، وملتزمة، ومُجهضة) لآلية التحكّم بالتزامن (CC). | القسم 5.4 |
وبالإضافة إلى هذه المناطق الأساسية، يخصّص PostgreSQL عدة مناطق فرعية أخرى لأغراض محددة:
- آليات التحكّم في الوصول (Access control mechanisms): لإدارة الإشارات (semaphores) والأقفال المتنوعة (مثل الأقفال الخفيفة والأقفال المشتركة والأقفال الحصرية).
- العمليات في الخلفية (Background processes): لتنسيق المهام التي تنفّذها عمليات مثل مسؤول نقاط التفتيش (checkpointer) والتفريغ التلقائي (autovacuum).
- معالجة المعاملات (Transaction processing): لإدارة الحالات الداخلية مثل نقاط الحفظ (savepoints) والالتزام على مرحلتين (two-phase commits).