الفصل ٣: العمليات

CS330 - أنظمة التشغيل

مفهوم العملية، الجدولة، الاتصال بين العمليات، والإدارة

٣.١ مفهوم العملية

العملية هي برنامج قيد التنفيذ. هي وحدة العمل في معظم الأنظمة. العملية أكثر من مجرد كود البرنامج (قسم النص)؛ فهي تشمل النشاط الحالي الممثل بواسطة عداد البرنامج ومسجلات المعالج.

البرنامج مقابل العملية

البرنامج العملية
كيان خامل مخزّن على القرص كيان نشط مع عداد برنامج
ملف تنفيذي (كود) برنامج تم تحميله في الذاكرة
ثابت ديناميكي، له حالة
برنامج واحد يمكن أن يكون له عمليات متعددة

العملية في الذاكرة

العملية تتضمن:

  • قسم النص: كود البرنامج
  • قسم البيانات: المتغيرات العامة
  • الكومة (Heap): ذاكرة تُخصص ديناميكيًا أثناء التشغيل
  • المكدس (Stack): بيانات مؤقتة (معاملات الدوال، عناوين العودة، متغيرات محلية)

⚠️ مهم:

قسم النص والبيانات لهما حجم ثابت، بينما الكومة والمكدس يمكن أن ينموا ديناميكيًا. المكدس والكومة ينموان تجاه بعضهما ولكن يجب ألا يتداخلا!

٣.٢ حالات العملية

أثناء تنفيذ العملية، تتغير حالتها. يمكن أن تكون العملية في إحدى الحالات التالية:

نموذج العملية الخماسي الحالات

جديدة جاهزة قيد التشغيل منتظرة منتهية قبول توزيع مقاطعة إدخال/إخراج أو انتظار اكتمال الإدخال/الإخراج خروج
الحالة الوصف
جديدة العملية قيد الإنشاء
جاهزة العملية تنتظر أن تُسند إلى معالج
قيد التشغيل يتم تنفيذ التعليمات
منتظرة العملية تنتظر حدوث حدث ما (اكتمال إدخال/إخراج أو إشارة)
منتهية العملية أنهت تنفيذها

📝 سؤال اختبار (من اختبار CS330 النهائي):

س: عملية في الحالة 'قيد التشغيل' يمكن أن تنتقل إلى أي من الحالات التالية؟

الإجابة: العملية قيد التشغيل يمكن أن تنتقل إلى:

  • (١) حالة منتهية (اكتمال العملية)
  • (٢) حالة منتظرة (طلب إدخال/إخراج)
  • (٣) حالة جاهزة (مقاطعة/انتهاء شريحة الوقت)

٣.٣ كتلة التحكم في العملية (PCB)

كل عملية يتم تمثيلها في نظام التشغيل بواسطة كتلة التحكم في العملية (PCB)، وتسمى أيضًا كتلة التحكم في المهمة (TCB). تحتوي PCB على كل المعلومات المرتبطة بعملية محددة.

حالة العملية
رقم العملية (PID)
عداد البرنامج
مسجلات المعالج
معلومات جدولة المعالج
معلومات إدارة الذاكرة
معلومات المحاسبة
معلومات حالة الإدخال/الإخراج

تفاصيل معلومات PCB:

الحقل يحتوي على
حالة العملية جديدة، جاهزة، قيد التشغيل، منتظرة، منتهية
عداد البرنامج عنوان التعليمات التالية للتنفيذ
مسجلات المعالج محتويات كل المسجلات الخاصة بالعملية
معلومات جدولة المعالج الأولوية، مؤشرات قوائم الجدولة
إدارة الذاكرة جداول الصفحات، حدود الذاكرة، جداول القطاعات
معلومات المحاسبة وقت المعالج المستخدم، الوقت المنقضي، حدود الوقت
حالة الإدخال/الإخراج قائمة أجهزة الإدخال/الإخراج المخصصة، الملفات المفتوحة

⚠️ نقاط رئيسية:

  • PCB يُبنى عند إنشاء العملية
  • PCB يتضمن مؤشرًا لإدارة قوائم الانتظار
  • PCB يحفظ معلومات العملية أثناء تبديل السياق

٣.٤ جدولة العمليات

جدول العمليات يختار من بين العمليات المتاحة للتنفيذ التالي على نواة المعالج. الهدف هو زيادة استغلال المعالج لأقصى حد وتبديل العمليات على المعالج بسرعة.

قوائم الانتظار للجدولة

قائمة الانتظار الجاهزة
PCB₇
PCB₂
PCB₅
قائمة الانتظار المنتظرة
PCB₃
PCB₁₄
PCB₆

أنواع قوائم انتظار الجدولة:

  • قائمة الانتظار الجاهزة: مجموعة كل العمليات في الذاكرة الرئيسية، الجاهزة والمنتظرة للتنفيذ
  • قوائم الانتظار المنتظرة: مجموعة العمليات المنتظرة لحدث (مثل إدخال/إخراج)
  • قوائم انتظار الأجهزة: مجموعة العمليات المنتظرة لجهاز إدخال/إخراج معين

العمليات تنتقل بين القوائم المختلفة خلال عمرها.

أنواع الجدولة

نوع الجدولة الوظيفة التكرار
طويلة المدى تختار العمليات من مجموعة الوظائف لتحميلها في الذاكرة غير متكرر (ثواني، دقائق)
قصيرة المدى تختار من قائمة الانتظار الجاهزة للتنفيذ على المعالج متكرر جدًا (أجزاء من الثانية)
متوسطة المدى المبادلة - تزيل العملية من الذاكرة مؤقتًا عند الحاجة

📊 تمثيل جدولة العمليات

مخطط-يظهر-التدفق-بين-قائمة-الانتظار-الجاهزة،-المعالج،-وقوائم-انتظار-الإدخال/الإخراج

يظهر التدفق بين قائمة الانتظار الجاهزة، المعالج، وقوائم انتظار الإدخال/الإخراج

٣.٥ تبديل السياق

عندما يبدل المعالج إلى عملية أخرى، يجب على النظام حفظ حالة العملية القديمة وتحميل الحالة المحفوظة للعملية الجديدة عبر تبديل السياق.

عملية P₀
قيد التنفيذ
نظام التشغيل
١. حفظ الحالة في PCB₀
٢. إعادة تحميل الحالة من PCB₁
عملية P₁
قيد التنفيذ

⚠️ عبء تبديل السياق:

  • وقت تبديل السياق هو عبء خالص - لا عمل مفيد أثناء التبديل
  • الوقت يعتمد على دعم العتاد
  • الأوقات النموذجية: أقل من ١٠ ميكروثانية
  • نظام تشغيل أكثر تعقيدًا و PCB أكبر → وقت تبديل أطول
  • بعض العتاد يوفر مجموعات مسجلات متعددة لتسريع التبديل

📝 سؤال تطبيقي:

س: صف الإجراءات التي تقوم بها النواة لتبديل السياق بين العمليات.

الإجابة:

  1. حفظ سياق العملية الحالية (عداد البرنامج، مؤشر المكدس، المسجلات) في PCB الخاص بها
  2. تحديث حالة PCB (قيد التشغيل → جاهزة/منتظرة)
  3. نقل PCB إلى قائمة الانتظار المناسبة
  4. اختيار عملية أخرى من قائمة الانتظار الجاهزة
  5. تحديث حالة PCB للعملية الجديدة (جاهزة → قيد التشغيل)
  6. استعادة السياق من PCB الجديد إلى المعالج

٣.٦ العمليات على العمليات

إنشاء العمليات

يمكن لعملية أن تنشئ عدة عمليات جديدة. العملية المنشئة هي الأم، والعمليات الجديدة هي الابنة، مكونة شجرة من العمليات.

خيارات مشاركة الموارد:

خيارات التنفيذ:

خيارات مساحة العنوان:

إنشاء العمليات في يونكس

// مثال إنشاء عملية في لغة C #include <stdio.h> #include <unistd.h> #include <sys/wait.h> int main() { pid_t pid; // fork() تنشئ عملية جديدة pid = fork(); if (pid < 0) { // حدث خطأ fprintf(stderr, "فشل Fork\n"); return 1; } else if (pid == 0) { // العملية الابنة printf("العملية الابنة: PID = %d\n", getpid()); // exec() تستبدل مساحة ذاكرة العملية execlp("/bin/ls", "ls", NULL); } else { // العملية الأم printf("العملية الأم: PID = %d\n", getpid()); printf("PID الابنة = %d\n", pid); // wait() انتظار اكتمال الابنة wait(NULL); printf("الابنة اكتملت\n"); } return 0; }

📝 سؤال اختبار (واجب CS330):

س: ما هو الناتج عند الأسطر A, B, C, و D؟ (افترض PID الأم = ٢٦٠٠، PID الابنة = ٢٦٠٣)

pid = fork(); if (pid == 0) { /* العملية الابنة */ pid1 = getpid(); printf("الابنة: pid = %d", pid); /* A */ printf("الابنة: pid1 = %d", pid1); /* B */ } else { /* العملية الأم */ pid1 = getpid(); printf("الأم: pid = %d", pid); /* C */ printf("الأم: pid1 = %d", pid1);/* D */ }

الإجابة:

  • السطر A: الابنة: pid = ٠
  • السطر B: الابنة: pid1 = ٢٦٠٣
  • السطر C: الأم: pid = ٢٦٠٣
  • السطر D: الأم: pid1 = ٢٦٠٠

إنهاء العمليات

تنتهي العملية عندما تنتهي من تنفيذ آخر عبارة لها وتستدعي استدعاء النظام exit().

العملية قد تنتهي بسبب:

الأم قد تنهي الابنة بسبب:

٣.٧ الاتصال بين العمليات (IPC)

العمليات قد تكون مستقلة أو متعاونة. العمليات المتعاونة تحتاج آليات IPC لتبادل البيانات والمعلومات.

أسباب تعاون العمليات:

📊 مشاركة المعلومات

عدة مستخدمين قد يحتاجون نفس المعلومات

⚡ تسريع الحسابات

تقسيم المهمة إلى مهام فرعية تعمل بالتوازي

🧩 نمطية

تقسيم وظائف النظام إلى عمليات منفصلة

🎯 سهولة

المستخدم قد يعمل على مهام متعددة في وقت واحد

نماذج IPC

🔗 الذاكرة المشتركة

  • العمليات تشارك منطقة من الذاكرة
  • سريع - لا تدخل من النواة بعد الإعداد
  • يحتاج مزامنة
  • جيد لكميات كبيرة من البيانات
// مثال منتج while (true) { /* إنتاج عنصر */ while (((in + 1) % BUFFER_SIZE) == out) ; /* المخزن مؤقت ممتلئ - انتظار */ buffer[in] = next_produced; in = (in + 1) % BUFFER_SIZE; }

✉️ تمرير الرسائل

  • تبادل الرسائل بين العمليات
  • أبطأ - يحتاج استدعاءات نظام
  • لا حاجة لذاكرة مشتركة
  • جيد للأنظمة الموزعة
// عمليات تمرير الرسائل send(message); // إرسال رسالة receive(message); // استقبال رسالة // حجم الرسالة: // - حجم ثابت // - حجم متغير

تنفيذ تمرير الرسائل

الجانب الخيارات
التسمية • مباشرة: send(P, message), receive(Q, message)
• غير مباشرة: عبر صناديق بريد/منافذ
المزامنة • متزامنة (حجب)
• غير متزامنة (عدم حجب)
التخزين المؤقت • سعة صفرية (لا تخزين مؤقت)
• سعة محدودة (مخزن مؤقت محدود)
• سعة غير محدودة (مخزن مؤقت غير محدود)

IPC في يونكس: الأنابيب

// مثال أنبوب في C #include <stdio.h> #include <unistd.h> int main() { int fd[2]; // معرفات ملفات للأنبوب pid_t pid; char write_msg[] = "مرحبا من الأم"; char read_msg[100]; // إنشاء أنبوب if (pipe(fd) < 0) { fprintf(stderr, "فشل الأنبوب" ); return 1; } pid=fork(); if (pid> 0) { // العملية الأم close(fd[0]); // إغلاق نهاية القراءة write(fd[1], write_msg, strlen(write_msg) + 1); close(fd[1]); } else { // العملية الابنة close(fd[1]); // إغلاق نهاية الكتابة read(fd[0], read_msg, 100); printf("الابنة قرأت: %s\n", read_msg); close(fd[0]); } return 0; }

⚠️ حدود الأنابيب:

  • أحادي الاتجاه - البيانات تتدفق في اتجاه واحد
  • يمكن استخدامها فقط بين العمليات ذات الصلة
  • توجد فقط أثناء تواصل العمليات
  • للتواصل ثنائي الاتجاه، استخدم أنبوبين

٣.٨ التواصل في أنظمة العميل-خادم

طرق التواصل:

🔌 المقابس (Sockets)

نقطة نهاية للتواصل. تُعرف بعنوان IP + رقم المنفذ.

📡 استدعاء الإجراءات عن بُعد (RPC)

يسمح باستدعاء إجراءات على أنظمة بعيدة كما لو كانت محلية.

🚪 استدعاء الطرق عن بُعد (RMI)

آلية جافا مشابهة لـ RPC لاستدعاء طرق على كائنات بعيدة.

التواصل بالمقابس

// مثال مقبس (مبسط) // جانب الخادم int server_socket = socket(AF_INET, SOCK_STREAM, 0); bind(server_socket, address, sizeof(address)); listen(server_socket, 3); int new_socket = accept(server_socket, address, addrlen); read(new_socket, buffer, 1024); // جانب العميل int client_socket = socket(AF_INET, SOCK_STREAM, 0); connect(client_socket, address, sizeof(address)); send(client_socket, message, strlen(message), 0);

٣.٩ أسئلة تطبيقية على طريقة الاختبارات

أسئلة اختيار من متعدد

س١. أي من التالي لا يُخزّن في PCB؟

  • أ) عداد البرنامج
  • ب) مسجلات المعالج
  • ج) الكود المصدري للبرنامج
  • د) حالة العملية

س٢. الهدف الرئيسي من تعدد البرمجة هو تحسين:

  • أ) استغلال المعالج
  • ب) استخدام الذاكرة
  • ج) زمن استجابة المستخدم
  • د) أمان النظام

س٣. عندما تنشئ عملية عملية جديدة باستخدام fork()، أي مما يلي يتم مشاركته؟

  • أ) المكدس
  • ب) الكومة
  • ج) أقسام الذاكرة المشتركة
  • د) عداد البرنامج

س٤. وقت تبديل السياق هو:

  • أ) عبء خالص
  • ب) وقت حساب مفيد
  • ج) وقت إدخال/إخراج
  • د) وقت مستخدم

أسئلة إجابة قصيرة

س٥. اشرح الفرق بين الجدولة طويلة المدى، متوسطة المدى، وقصيرة المدى. (٦ درجات)

الإجابة:

  • طويلة المدى (جدول الوظائف): تختار العمليات من مجموعة الوظائف لتحميلها في الذاكرة. تتحكم في درجة تعدد البرمجة. تُنفذ بشكل غير متكرر.
  • متوسطة المدى (مبادل): تزيل العمليات من الذاكرة مؤقتًا (مبادلة) لتقليل درجة تعدد البرمجة. يمكن إعادة إدخال العملية لاحقًا.
  • قصيرة المدى (جدول المعالج): تختار من قائمة الانتظار الجاهزة أي عملية تنفذ تاليًا على المعالج. تُنفذ بشكل متكرر جدًا (أجزاء من الثانية).

س٦. كم عدد العمليات التي ينشئها هذا البرنامج؟ (٤ درجات)

for (int i = 0; i < 4; i++) fork();

الإجابة:

٢⁴ = ١٦ عملية إجمالًا (بما في ذلك العملية الأم الأولية)

كل fork() تضاعف عدد العمليات.

س٧. ماذا يحدث عندما يحدث تبديل سياق إذا كان السياق الجديد محملًا بالفعل في مجموعة مسجلات؟ (٣ درجات)

الإجابة:

إذا وفر العتاد مجموعات مسجلات متعددة وكان السياق الجديد محملًا بالفعل، فإن تبديل السياق يكون أسرع بكثير - فقط تبديل المؤشر إلى مجموعة المسجلات النشطة. لا حاجة لحفظ/استعادة قيم المسجلات من/إلى الذاكرة.

٣.١٠ المصطلحات الرئيسية والتعريفات

المصطلح التعريف
عملية برنامج قيد التنفيذ؛ كيان نشط مع عداد برنامج
PCB كتلة التحكم في العملية - هيكل بيانات يحتوي معلومات العملية
تبديل السياق حفظ حالة عملية وتحميل حالة عملية أخرى
fork() استدعاء نظام ينشئ عملية جديدة (ابنة) في يونكس
exec() استدعاء نظام يستبدل ذاكرة العملية ببرنامج جديد
wait() استدعاء نظام حيث تنتظر الأم اكتمال الابنة
IPC الاتصال بين العمليات - آليات لتعاون العمليات
أنبوب قناة اتصال أحادية الاتجاه بين العمليات
قائمة الانتظار الجاهزة قائمة العمليات الجاهزة والمنتظرة للتنفيذ
درجة تعدد البرمجة عدد العمليات في الذاكرة

٣.١١ مخططات من الشرائح

📊 مخطط حالة العملية

مخطط حالة العملية

📊 خط زمني لتبديل السياق

مخطط خط زمني يظهر تبديل السياق بين عملية P0 و P1

📊 هيكل قوائم الانتظار الجاهزة والمنتظرة

مخطط هيكل قائمة مرتبطة لقائمة الانتظار الجاهزة وقائمة الانتظار المنتظرة