تصميم الدورة التدريبية لنظام التشغيل على أساس C# Winform: التخزين المؤقت محاكاة تكنولوجيا الإدخال والمخرجات.
مطلوب لتصميم عملية إخراج التخزين المؤقت وعمليتين للمستخدم تطلب الإخراج ، بالإضافة إلى برنامج خدمة إخراج التخزين المؤقت. عندما ترغب عملية المستخدم التي تطلب الإخراج في إخراج سلسلة من المعلومات ، يتم استدعاء برنامج خدمة الإخراج ، ويرسل برنامج خدمة الإخراج المعلومات إلى الإخراج جيدًا. عند مواجهة علامة نهاية الإخراج ، فإنه يشير إلى أن إخراج ملف الإخراج للعملية قد اكتمل. بعد ذلك ، يتم تطبيق كتلة طلب الإخراج (تستخدم لتسجيل اسم عملية المستخدم التي تطلب الإخراج ، وموضع المعلومات في الإخراج جيدًا ، وطول الإخراج ، وما إلى ذلك) ، وانتظر عملية التخزين المؤقت للإخراج.
عندما تعمل عملية إخراج التخزين المؤقت ، ستتم الإخراج فعليًا إلى الطابعة أو المراقبة بناءً على المعلومات المراد إخراجها حسب كل عملية مسجلة في كتلة الطلب. هنا ، يمكن تشغيل عملية الإخراج SP00ling وعملية المستخدم التي تطلب الإخراج بشكل متزامن.
تستخدم جدولة العملية خوارزمية عشوائية ، والتي تتوافق مع العشوائية لمعلومات إخراج العملية. يبلغ احتمال الجدولة لعمليتين للمستخدمين الذين يطلبون الإخراج 45 ٪ لكل منهما ، وعملية إخراج التخزين المؤقت هي 10 ٪ ، وهو ما يتم تحديده من خلال محاكاة الرقم العشوائي الذي تم إنشاؤه بواسطة مولد الأرقام العشوائية.
هناك ثلاث حالات أساسية للعملية ، وهي قابلة للتنفيذ ، في انتظار ونهاية. الحالة القابلة للتنفيذ هي الحالة التي تعمل فيها العملية أو تنتظر الجدولة ؛ تنقسم حالة الانتظار إلى حالة انتظار 1 ، وانتظار الحالة 2 وانتظار الحالة 3.
شروط تغيير الدولة هي:
① عند تنفيذ العملية ، يتم ضبطها على حالة "النهاية".
② عندما يرسل برنامج الخدمة معلومات الإخراج إلى الإخراج جيدًا ، إذا وجد أن الإخراج جيدًا ممتلئ ، فسيتم ضبط عملية الاتصال على "حالة انتظار 1".
③ عندما يتم إخراج عملية التخزين المؤقت ، إذا كان الإخراج فارغًا ، فسيتم إدخال "حالة الانتظار 2".
④ بعد أن تقوم عملية التخزين المؤقتة بإخراج كتلة المعلومات ، يجب أن تصدر على الفور مساحة البئر الإخراج التي تشغلها كتلة المعلومات وتعيين العملية في انتظار الإخراج إلى "الحالة القابلة للتنفيذ".
⑤ بعد أن يقوم برنامج الخدمة بإخراج المعلومات إلى الإخراج جيدًا ويشكل كتلة معلومات طلب الإخراج ، إذا كانت عملية التخزين المؤقت في حالة انتظار ، فسيتم تعيينها على "الحالة القابلة للتنفيذ".
⑥ عندما تطلب عملية المستخدم كتلة الإخراج ، إذا لم تتوفر كتلة طلب ، فإن عملية الاتصال تدخل "حالة الانتظار 3".
هناك عمليتان مستخدمان يطلبان الإخراج في النظام ، وتتم تسمية العمليتين لعملية المستخدم A وعملية المستخدم B على التوالي. قد يحتاج المستخدم إلى إخراج أكثر من ملف ، ويتم فصل الملفات بعلم نهاية الإخراج. علامة نهاية إخراج الملف المستخدمة في هذه التجربة هي #.
يحتاج المستخدم إلى إدخال جميع محتويات الملف المراد إخراجها أثناء مرحلة التهيئة ثم حفظها في صفيف. عندما يتم جدولة عملية المستخدم ، إذا تم استيفاء الشروط الثلاثة التالية: لا يزال هناك ملف لم يتم إخراجه ، يمكن أن تضع المساحة المتبقية في الإخراج بئرًا الملف ، ويتم إرسال كتلة طلب الإخراج المتاحة ، ويتم إرسال الملف إلى الإخراج جيدًا ، ثم يتم تطبيق كتلة طلب الإخراج ، ويتم إضافة كتلة طلب طلب طلب انتظار كتلة الطلب إلى عملية الإخراج الممتدة إلى المخرجات وإخراجها.
عندما يكون دور عملية إخراج التخزين المؤقت ليشغل وحدة المعالجة المركزية ، تتحقق عملية إخراج التخزين المؤقت أولاً ما إذا كانت هناك كتل إخراج في قائمة انتظار انتظار كتلة الطلب إلى الإخراج ، وإذا لم يكن هناك ، فإنها تدخل حالة الانتظار. خلاف ذلك ، يتم تنفيذ الإخراج ، ثم يتم إصدار مساحة بئر الإخراج وكتلة الإخراج المطلوبة المقابلة ، وعملية المستخدم التي تنام لأنه لا توجد كتل إخراج متوفرة.
يمكن تنفيذ عملية إخراج التخزين المؤقت وعملية المستخدم بشكل متزامن. تقوم هذه المقالة بإجراء عملية عملية تنفيذ واحدة (لا تنتهي العملية بالضرورة بعد التنفيذ) في وظيفة ، في كل مرة تقوم فيها بإنشاء رقم عشوائي وتنفذ عملية معينة وفقًا للرقم العشوائي. إذا تم حظر العملية بسبب بعض المواقف ، فسيتم إنشاء الرقم العشوائي التالي وسيتم جدولة عملية أخرى. يتم جدولة عملية المستخدم وعملية إخراج التخزين المؤقت لأسباب مختلفة ، أي التنفيذ المتزامن.
تنقسم وظائف النظام بأكمله إلى الأجزاء التالية: وظيفة التهيئة ، وظيفة الجدول ، وظيفة عملية المستخدم ، ووظيفة إخراج التخزين المؤقت. يتم استخدام وظيفة التهيئة لتنفيذ الإدخال الأولي وتخزين ملفات المستخدم ؛ تنفذ وظيفة الإرسال التبديل بين عمليات المستخدم وعمليات إخراج التخزين المؤقت ؛ تنفذ وظيفة عملية المستخدم سلسلة من الإجراءات التي تم الانتهاء منها بعد جدولة العملية ؛ تمثل وظيفة إخراج التخزين المؤقت عملية الإخراج.
يوضح الشكل 1 المخطط الانسيابي العام لتشغيل النظام:
يستخدم النظام أولاً وظيفة التهيئة لتهيئة إدخال المحتوى من قبل المستخدم ، ثم ينشئ رقمًا عشوائيًا R بين 0 و 1 ، والقضاة ما إذا كان ينبغي تنفيذ عملية المستخدم أو يجب تنفيذ عملية الإخراج وفقًا لحجم R.
يحتاج المستخدم إلى إدخال المحتوى الذي يريد "الطباعة". تقبل وظيفة التهيئة إدخال المحتوى من قبل المستخدم وقطعها وفقًا لحرف إنهاء الملف ، وتضع الملف القطع في صفيف ، ويرسله إلى الإخراج جيدًا عند تحديد موعد عملية المستخدم.
يستخدم جدولة العملية خوارزمية عشوائية ، ويكون احتمال الجدولة لعمليتين للمستخدمين الذين يطلبون الإخراج 45 ٪ ، وعملية الإخراج التخزين المؤقت 10 ٪. تستخدم هذه الورقة أرقامًا عشوائية لتحقيق هذا المطلب. عند إجراء جدولة العملية ، يتم إنشاء عشرية بين 0 و 1 بشكل عشوائي. إذا كان الرقم أقل من أو يساوي 0.45 ، فسيتم تشغيل عملية المستخدم A ؛ إذا كان الرقم ما بين 0.45 و 0.9 ، فسيتم تشغيل عملية المستخدم B ؛ إذا كان الرقم أكبر من 0.9 ، فسيتم تشغيل عملية إخراج التخزين المؤقت.
تحتاج وظيفة عملية المستخدم أولاً إلى التحقق مما إذا كانت العملية الحالية تلبي ثلاث شروط: لا يتم إخراج الملف ، ويمكن للمساحة المتبقية في الإخراج بئر أن تضع الملف ، وهناك كتلة طلب الإخراج المتاحة. إذا تم استيفاء الشروط الثلاثة ، فسيتم إرسال الملف إلى الإخراج جيدًا ويتم تطبيق كتلة الطلب المقابلة.
يوضح الشكل 2 المخطط الانسيابي لعملية المستخدم في عملية المستخدم:
عند تنفيذ عملية المستخدم ، إذا وجد أنه تم إخراج الملف ، فإن العملية تعمل. خلاف ذلك ، يتم تحديد ما إذا كان هناك أي مساحة متبقية في الإخراج جيدًا ولا يتم إدخال حالة انتظار. إذا كان هناك مساحة في الإخراج جيدًا ، فاستمر في الحكم على ما إذا كانت هناك كتلة إخراج. إذا كان هناك واحد ، فأرسل الملف إلى الإخراج جيدًا واطلب كتلة إخراج ، واستيقظ على عملية الإخراج التي يحتمل أن تكون نائمة ، وإلا أدخل حالة الانتظار 3.
تتحقق وظيفة إخراج التخزين المؤقت ما إذا كانت هناك كتل طلب الإخراج ، وإذا كان هناك ، فإن الإخراج وإطلاق الموارد ذات الصلة. خلاف ذلك ، ستنتظر عملية إخراج التخزين المؤقت.
يظهر المخطط الانسيابي لوظيفة إخراج التخزين المؤقت في الشكل 3:
تعريف ثنائي الفينيل متعدد الكلور هو كما يلي:
class PCB {
/*
* 进程描述
*/
public int id ; //序号
public int status ; //状态,0表示可执行,123表示三个等待状态,4表示结束
public string [ ] contents = new string [ MaxFileCount ] ; //要输出的内容
public int [ ] flags = new int [ MaxFileCount ] ; //为1表示该文件已经被输出,初始全部为0
public int fileCount ; //用户真实输入的文件个数
}تتضمن عملية المستخدم معرف الرقم التسلسلي ، وحالة الحالة ، والمحتوى المراد إخراجه ، وإعلام إخراج الملف ، وعدد الملفات الحقيقي.
من بينها ، تشمل حالات العملية المحتملة التي يمكن أن توجد فيها عملية المستخدم: 0 تعني الحالة القابلة للتنفيذ ، 1 تعني حالة الانتظار 1 ، 3 تعني حالة الانتظار 3 ، 4 تعني إنهاء العملية.
يتم تعريف outputreqblock على النحو التالي:
class OutputReqBlock {
/*
* 输出请求块
*/
public int id ; //要求进行输出的进程的id
public int start ; //文件在输出井中的起始位置
public int length ; //文件长度
public int fileIndex ; //要输出文件的序号
public OutputReqBlock ( int id , int start , int length , int fileIndex ) {
this . id = id ;
this . start = start ;
this . length = length ;
this . fileIndex = fileIndex ;
}
}يتضمن كتلة إخراج الطلب: معرف عملية كتلة الطلب ، وموضع البداية للملف في الإخراج جيدًا ، وطول طول الملف ، ورقم تسلسل الملف المراد إخراجها في جميع ملفات المستخدم.
تعريف OutputWell على النحو التالي:
class OutputWell {
/*
* 输出井
*/
public char [ ] buffer = new char [ MaxWellLen ] ; //输出缓冲区
public int begin = 0 ; //当前可用位置
public int restSize = MaxWellLen ; //剩余容量
}معلمات الإخراج بئر هي: العازلة العازلة ، تستخدم لتخزين البيانات التي وضعها المستخدم ؛ يبدأ الموقع الحالي المتاح ، ويتم تخزين الملفات بالترتيب في الإخراج جيدًا ، وتشير البداية دائمًا إلى موضع البداية للمخزن المؤقت المتاح حاليًا ؛ تستعد السعة المتبقية ، وهي السعة المتبقية في المخزن المؤقت ، في البداية Maxwelllen طول المخزن المؤقت.
يدخل المستخدم المعلومات إلى "طباعة" في مربع النص ، ثم يحدد المعالجة التي ينتمي إليها محتوى الإخراج (A أو B). أخيرًا ، انقر فوق زر التهيئة لبدء وظيفة التهيئة. تستخدم وظيفة التهيئة أولاً كائن سلسلة لتخزين إدخال المحتوى من قبل المستخدم. بعد ذلك ، تحقق مما إذا كان المحتوى الذي أدخله المستخدم ينتهي برقم # ، واطلب من المستخدم إعادة الدخول إذا لم يكن قانونيًا. بعد أن يكون الإدخال قانونيًا ، يتم قطع المحتوى الذي أدخله المستخدم وفقًا لرقم # ، ويتم قطع السلسلة إلى سلاسل متعددة. أخيرًا ، تتم تهيئة كائن ثنائي الفينيل متعدد الكلور باستخدام المعلومات التي تم إنشاؤها ووضعها في قائمة انتظار الانتظار.
نظرًا لأنه قد ينقر المستخدم على زر التهيئة عدة مرات ، فمن الضروري تحديد ما إذا كانت العملية الحالية قد تمت تهيئة قبل كل نقرة. إذا كان المستخدم قد أكمل بالفعل التهيئة ولكنه نقر على زر التهيئة مرة أخرى ، فسيتم كتابة المحتوى الأصلي.
يتم تهيئة بئر الإخراج تلقائيًا عند تحميل واجهة النظام.
يتم تخطي رمز وظيفة التهيئة!
من أجل تحقيق العشوائية ، في كل مرة تريد فيها جدولة ، يتم إنشاء رقم عشوائي بين 0 و 1 باستخدام وظيفة C#. إذا كان الرقم العشوائي أقل من أو يساوي 0.45 يعني أنه سيتم جدولة عملية المستخدم A بعد ذلك ؛ إذا كان الرقم العشوائي بين 0.45 و 0.9 يعني أنه سيتم جدولة عملية المستخدم B بعد ذلك ؛ إذا كان الرقم العشوائي أكبر من 0.9 يعني أنه سيتم جدولة عملية إخراج التخزين المؤقت بعد ذلك.
تنفيذ وظيفة المجدول كما يلي:
private int dispatch ( ) {
/*
* 进程调度
*/
double res = rd . NextDouble ( ) ; //产生一个01之间的小数
if ( res <= 0.45 ) {
return 0 ;
} else if ( res <= 0.9 ) {
return 1 ;
} else {
return 2 ; //012分别表示两个进程和SPOOLing输出进程
}
} تستخدم لتنفيذ سلسلة من العمليات التي يتم تنفيذها عند تشغيل عملية المستخدم.
عندما يتم جدولة عملية المستخدم ، تحقق أولاً ما إذا كانت هناك ملفات لم يتم إرسالها إلى الإخراج جيدًا. إذا لم يكن هناك ، يتم تعيين عملية المستخدم الحالية على الحالة النهائية وإرجاع الوظيفة.
لم تنته عملية المستخدم بعد ، مما يعني أنه لا تزال هناك ملفات لم يتم إرسالها إلى الإخراج جيدًا. حلقة للعثور على كتلة ملف لم يتم إخراجها (العلامة المقابلة هي 1) ، ثم الاستعلام عن ما إذا كانت المساحة المتبقية في البئر الإخراج لا يزال بإمكانها وضع كتلة الملف هذه. إذا لم يكن الأمر كذلك ، فقم بتعيين حالة العملية لانتظار الحالة 1 وإرجاع الوظيفة. إذا كان لا يزال هناك غرفة متبقية ، فتحقق مما إذا كان لا يزال هناك كتلة إخراج الطلب المتاحة. إذا لم يتم تعيين العملية لانتظار الحالة 3 ، فإن الوظيفة تعود. خلاف ذلك ، يتم إرسال كتلة الملف إلى الإخراج جيدًا ويتم تعديل المعلمات ذات الصلة للإخراج بئر. بعد ذلك ، يتم تطبيق كتلة إخراج الطلب على printqueue في قائمة انتظار الإخراج ، ويتم طباعة إخراج الطباعة عند جدولة عملية إخراج التخزين المؤقت. أخيرًا ، إذا كانت عملية إخراج التخزين المؤقت في حالة انتظار ، فإن عملية المستخدم تحتاج إلى إيقاظها.
يتم حفظ المواقف المختلفة أثناء تشغيل وظيفة المستخدم من خلال قائمة لشاشة النتيجة النهائية. تتضمن القائمة: رقم تسلسل الجدولة الحالي ، ورقم العملية ، وحالة العملية ، وحالة البئر الإخراج ، وعدد كتل الطلب المتوفرة ، ورقم تسلسل الملف ، وطول الملف.
يتم تخطي رمز وظيفة عملية المستخدم!
تتمثل وظيفة وظيفة الإخراج في تحديد كتلة إخراج الطلب ، ثم إخراج المحتويات فيه ، وأخيراً تحرير المورد المقابل.
تحقق أولا ما إذا كان الإخراج بئر فارغ. إذا تم تعيين عملية الإخراج الفارغة لانتظار الحالة 2 ، فإن الوظيفة تعود. خلاف ذلك ، تحقق مما إذا كانت هناك كتل إخراج الطلب في قائمة انتظار إخراج الطلب التي يجب إخراجها ، ولا توجد وظيفة. بخلاف ذلك ، يتم جلب كتلة إخراج الطلب على رأس قائمة الانتظار من قائمة انتظار الإخراج ، ثم يتم إخراج كتلة الطلب ، ويتم تحرير مساحة البئر ومساحة الإخراج المقابلة.
عند إخراج وظيفة الإخراج ، يجب عرض محتوى الإخراج إلى منطقة إخراج الملف.
يتم تخطي رمز وظيفة الإخراج!
ينقر المستخدم على زر "تشغيل البرنامج" ويبدأ تشغيل الوظيفة الرئيسية. يتم ضبط عملية التشغيل ديناميكيًا وفقًا للوضع الحالي.
تحدد الوظيفة الرئيسية أولاً ما إذا كانت كلتا عمليات المستخدم قد تمت تهيئتها ولا يمكن تشغيلها إلا بعد التهيئة ، وإلا سيتم الإبلاغ عن خطأ.
بعد التهيئة ، انقر فوق الزر "تشغيل البرنامج" مرة أخرى. طالما أن هناك عملية ليست في الحالة النهائية ، أو لم يتم إخراج كتلة الطلب ، تابع الجدولة. عند الجدولة ، يجب عليك تحديد ما إذا كانت العملية الحالية قد انتهت ، وإخراج الحالة ذات الصلة عند الانتهاء.
يتم تخطي رمز الوظيفة الرئيسية!
يظهر وصف المعلمات المختلفة المستخدمة في التجربة في الجدول 1:
| اسم المعلمة | ماكسويللين | maxfileCount | blockcount |
|---|---|---|---|
| وصف المعلمة | مخرج البئر طول | الحد الأقصى لعدد الملفات التي يمكن للمستخدم إخراجها | عدد الكتل المطلوبة |
| قيمة المعلمة | 15 | 10 | 3 |
يظهر واجهة النظام في الشكل 4:
تنقسم واجهة النظام إلى ثلاثة أقسام: التهيئة وعملية الجدولة ومنطقة إخراج الملف. يحتوي قسم التهيئة على مربع نص ، مربع تحديد ، وزر. يدخل المستخدم الملف المطلوب طباعته في مربع النص ثم تهيئته. يعد قسم عملية الجدولة جدولًا يعرض العملية التفصيلية لجدولة العملية. يتم استخدام قسم إخراج الملفات لعرض عملية الطباعة لجميع الملفات.
يقوم المستخدم أولاً بتحديد عملية ، والافتراضي الأولي هو A ، ثم يضع الملف المراد إخراجه في مربع النص في قسم التهيئة ، ثم ينقر على زر التهيئة. التهيئة ناجحة ، كما هو مبين في الشكل 5:
للعملية ب ، قم بإجراء العمليات أعلاه كما هو موضح في الشكل 6:
بعد اكتمال تهيئة عمليتي المستخدمين ، انقر فوق زر تشغيل البرنامج ، وترد النتائج في الشكل 7 والشكل 8:
فيما يلي تحليل موجز لمحتويات الشكل 7. كما هو موضح في الشكل 9:
تم جدولة عملية الإخراج لأول مرة ، لأن الإخراج فارغ في هذا الوقت ، وبالتالي فإن حالة عملية الإخراج تنتظر الحالة 2 ، وعدد كتل الطلب المتاحة هو 3. المرة الثانية التي يتم فيها تحديد العملية A. حالة العملية A قابلة للتنفيذ. عدد كتل الطلب المتاحة هو 3. إرسال ملف 0 إلى الإخراج بئر. طول الملف 0 ("ABCD") هو 4. تم جدولة عملية الإخراج للمرة الثالثة. المساحة المتاحة للإخراج بئر هي 15-4 = 11 ، ويصبح عدد كتل الطلب المتاحة 2 ، ويتم إصدار ملف 0 من العملية A ، كما هو موضح في منطقة إخراج الملف ، ويتم إصدار المساحة ذات الصلة.