الإشارات (البرمجة)
في علوم الحاسوب ، تُعرف الإشارة (Semaphore) بأنها متغير أو نوع بيانات مجرد يُستخدم للتحكم في الوصول إلى مورد مشترك يتم الوصول إليه بواسطة عدة سلاسل عمليات ، وذلك لتجنب مشاكل القسم الحرج في الأنظمة المتزامنة ، مثل أنظمة التشغيل متعددة المهام . تُعد الإشارات نوعًا من أدوات التزامن الأساسية . الإشارة البسيطة هي متغير عادي يتم تغييره (على سبيل المثال، زيادته أو إنقاصه أو تبديل حالته) بناءً على شروط يحددها المبرمج.
تتمثل إحدى الطرق المفيدة للتفكير في الإشارة كما تستخدم في نظام العالم الحقيقي في كونها سجلاً لعدد وحدات مورد معين المتاحة، إلى جانب عمليات لتعديل هذا السجل بأمان (أي لتجنب حالات التنافس ) عند الحصول على الوحدات أو تحريرها، وإذا لزم الأمر، الانتظار حتى تصبح وحدة من المورد متاحة.
على الرغم من أن الإشارات الثنائية مفيدة لمنع حالات التزامن، إلا أنها لا تضمن عدم حدوثها. تُسمى الإشارات الثنائية التي تسمح بعدد عشوائي من الموارد بالإشارات الثنائية العدية ، بينما تُسمى الإشارات الثنائية التي تقتصر على القيمتين 0 و1 (أو مقفل/مفتوح، غير متاح/متاح) بالإشارات الثنائية وتُستخدم لتنفيذ الأقفال .
ابتكر عالم الحاسوب الهولندي إدسكار ديكسترا مفهوم الإشارات الثنائية في عام 1962 أو 1963، [ 1 ] عندما كان ديكسترا وفريقه يطورون نظام تشغيل لجهاز Electrologica X8 . أصبح هذا النظام فيما بعد يُعرف باسم نظام البرمجة المتعددة .
تشبيه المكتبة
لنفترض أن مكتبة مادية تحتوي على عشر غرف دراسية متطابقة، مخصصة لطالب واحد في كل مرة. يجب على الطلاب طلب غرفة من مكتب الاستقبال. إذا لم تكن هناك غرف شاغرة، ينتظر الطلاب عند المكتب حتى يخلي أحدهم غرفة. عندما ينتهي الطالب من استخدام الغرفة، عليه العودة إلى المكتب وإبلاغهم بأنها أصبحت شاغرة.
في أبسط تطبيق، لا يعرف موظف الاستقبال سوى عدد الغرف الشاغرة المتاحة. وهذا يتطلب من جميع الطلاب استخدام غرفهم المسجلة وإعادتها عند الانتهاء. عندما يطلب طالب غرفة، يُنقص الموظف هذا العدد. وعندما يُخلي طالب غرفة، يزيد الموظف هذا العدد. يمكن استخدام الغرفة للمدة التي يرغب بها الطالب، ولا يمكن حجز الغرف مسبقًا.
في هذا السيناريو، يُمثل موظف الاستقبال المسؤول عن العد إشارة عد، والغرف هي المورد، والطلاب هم العمليات / الخيوط . قيمة الإشارة في هذا السيناريو هي 10 مبدئيًا، وجميع الغرف فارغة. عندما يطلب طالب غرفة، يُمنح حق الوصول، وتتغير قيمة الإشارة إلى 9. بعد وصول الطالب التالي، تنخفض القيمة إلى 8، ثم 7، وهكذا. إذا طلب طالب غرفة وكانت قيمة الإشارة الحالية 0، [ 2 ] فإنه يُجبر على الانتظار حتى تُصبح إحدى الغرف متاحة (عندما يزداد العد من 0). إذا أُتيحت إحدى الغرف، ولكن هناك عدة طلاب ينتظرون، فيمكن استخدام أي طريقة لاختيار الطالب الذي سيشغل الغرفة (مثل طريقة FIFO أو الاختيار العشوائي). وبالطبع، يجب على الطالب إبلاغ الموظف المسؤول عن تحرير غرفته فقط بعد مغادرتها.
ملاحظات هامة
عند استخدام الإشارة للتحكم في الوصول إلى مجموعة من الموارد، فإنها لا تتعقب سوى عدد الموارد المتاحة، ولا تتعقب أيًّا منها متاح. قد يتطلب الأمر آلية أخرى (ربما تتضمن المزيد من الإشارات) لاختيار مورد متاح معين.
يُعدّ هذا النموذج فعّالاً للغاية، إذ يُمكن أن يُشكّل عدّاد الإشارات الضوئية محفزاً مفيداً لعدد من الإجراءات المختلفة. فعلى سبيل المثال، قد يقوم أمين المكتبة بإطفاء الأنوار في قاعة الدراسة عندما لا يتبقى فيها طلاب، أو قد يضع لافتة تُشير إلى أن القاعات مشغولة للغاية عندما تكون معظمها مشغولة.
يتطلب نجاح البروتوكول التزام التطبيقات به بشكل صحيح. ومن المرجح أن تتأثر العدالة والسلامة (مما يعني عمليًا أن البرنامج قد يتصرف ببطء، أو بشكل غير منتظم، أو يتوقف عن العمل ، أو يتعطل ) إذا تصرفت عملية واحدة بشكل خاطئ. ويشمل ذلك:
- طلب مورد ونسيان تحريره؛
- إطلاق مورد لم يتم طلبه مطلقا؛
- الاحتفاظ بمورد لفترة طويلة دون الحاجة إليه؛
- استخدام مورد دون طلبه أولاً (أو بعد تحريره).
حتى لو اتبعت جميع العمليات هذه القواعد، فقد يحدث تعطل متعدد الموارد عندما تكون هناك موارد مختلفة تتم إدارتها بواسطة إشارات مختلفة وعندما تحتاج العمليات إلى استخدام أكثر من مورد واحد في وقت واحد، كما يتضح من مشكلة الفلاسفة الذين يتناولون الطعام .
الدلالات والتنفيذ
تُجهز إشارات العد بعمليتين، يُشار إليهما تاريخياً بالرمزين P و V (انظر قسم أسماء العمليات للاطلاع على الأسماء البديلة). تزيد العملية V قيمة الإشارة S ، بينما تنقصها العملية P.
تمثل قيمة الإشارة S عدد وحدات الموارد المتاحة عندما تكون غير سالبة. في بعض التطبيقات، تشير القيم السالبة إلى عدد العمليات المنتظرة للمورد. تُهدر العملية P الوقت أو تُدخل العملية في حالة انتظار حتى يصبح المورد المحمي بالإشارة متاحًا، وعندها يتم استخدامه فورًا. أما العملية V فهي عكس ذلك: إذ تُتيح المورد مرة أخرى بعد انتهاء العملية من استخدامه. من أهم خصائص الإشارة S أنه لا يمكن تغيير قيمتها إلا باستخدام العمليتين V و P.
إحدى الطرق البسيطة لفهم عمليات الانتظار (P) والإشارة (V) هي:
- الانتظار : يُنقص قيمة متغير الإشارة بمقدار 1. إذا كانت القيمة الجديدة لمتغير الإشارة سالبة، يتم حظر العملية التي تُنفذ الانتظار (أي تُضاف إلى قائمة انتظار الإشارة). وإلا، تستمر العملية في التنفيذ، بعد أن تكون قد استخدمت وحدة من المورد.
- الإشارة : تزيد قيمة متغير الإشارة بمقدار 1. بعد الزيادة، إذا كانت قيمة ما قبل الزيادة سالبة (مما يعني وجود عمليات تنتظر موردًا)، فإنها تنقل عملية محظورة من قائمة انتظار الإشارة إلى قائمة الانتظار الجاهزة.
توفر العديد من أنظمة التشغيل آليات فعّالة لإدارة الإشارات الثنائية، تعمل على تحرير العمليات المنتظرة عند زيادة قيمة الإشارة الثنائية. وهذا يعني أن العمليات لا تُهدر وقتها في التحقق من قيمة الإشارة الثنائية دون داعٍ.
يمكن توسيع مفهوم عدّ الإشارات الثنائية بإضافة إمكانية طلب أو إرجاع أكثر من "وحدة" واحدة من الإشارة الثنائية، وهي تقنية مُطبقة في نظام يونكس . وتكون عمليات V و P المُعدّلة كما يلي، مع استخدام الأقواس المربعة للإشارة إلى العمليات الذرية ، أي العمليات التي تبدو غير قابلة للتجزئة بالنسبة للعمليات الأخرى:
الدالة V(semaphore S, integer I): [S ← S + I] دالة P(إشارة S، عدد صحيح I): كرر: [ إذا كان S ≥ I: S ← S − I استراحة ]
ومع ذلك، فإن بقية هذا القسم تشير إلى الإشارات الثنائية ذات العمليات الأحادية V و P، ما لم يُنص على خلاف ذلك.
لتجنب حالة التجويع ، يرتبط كل مؤشر تسلسلي بقائمة انتظار للعمليات (عادةً ما تكون وفقًا لقاعدة FIFO ). إذا نفّذت عملية ما عملية P على مؤشر تسلسلي قيمته صفر، تُضاف العملية إلى قائمة انتظار المؤشر التسلسلي ويتوقف تنفيذها. عندما تُزيد عملية أخرى قيمة المؤشر التسلسلي بتنفيذ عملية V، وكانت هناك عمليات أخرى في قائمة الانتظار، تُزال إحداها من قائمة الانتظار وتستأنف التنفيذ. عندما تكون للعمليات أولويات مختلفة، يمكن ترتيب قائمة الانتظار وفقًا لذلك، بحيث تُسحب العملية ذات الأولوية الأعلى أولًا.
إذا لم يضمن التنفيذ ذرية عمليات الزيادة والنقصان والمقارنة، فهناك خطر نسيان الزيادات أو النقصان، أو أن تصبح قيمة الإشارة سالبة. يمكن تحقيق الذرية باستخدام تعليمة برمجية قادرة على قراءة الإشارة وتعديلها وكتابتها في عملية واحدة. في حال عدم وجود مثل هذه التعليمة، يمكن توليد عملية ذرية باستخدام خوارزمية استبعاد متبادل برمجية . في الأنظمة أحادية المعالج ، يمكن ضمان العمليات الذرية بتعليق الاستباق مؤقتًا أو تعطيل مقاطعات الأجهزة . لا ينجح هذا الأسلوب في الأنظمة متعددة المعالجات حيث يمكن لبرنامجين يتشاركان إشارة واحدة أن يعملا على معالجين مختلفين في الوقت نفسه. لحل هذه المشكلة في نظام متعدد المعالجات، يمكن استخدام متغير قفل للتحكم في الوصول إلى الإشارة. يتم التعامل مع متغير القفل باستخدام أمر اختبار وتعيين القفل .
أمثلة
مثال بسيط
لنفترض وجود متغير A ومتغير منطقي S. لا يتم الوصول إلى A إلا عندما تكون قيمة S صحيحة. وبالتالي، فإن S بمثابة إشارة مرور لـ A.
يمكن تخيل إشارة مرور ضوئية ( S ) قبل محطة القطار ( A ). في هذه الحالة، إذا كانت الإشارة خضراء، فيمكن دخول محطة القطار. أما إذا كانت صفراء أو حمراء (أو أي لون آخر)، فلا يمكن دخول محطة القطار.
قائمة انتظار تسجيل الدخول
لنفترض نظامًا يدعم عشرة مستخدمين فقط (S=10). عند تسجيل دخول أي مستخدم، يتم استدعاء الدالة P، مما يُنقص قيمة S بمقدار 1. وعند تسجيل خروج أي مستخدم، يتم استدعاء الدالة V، مما يزيد قيمة S بمقدار 1، وهو ما يُمثل خانة تسجيل دخول متاحة. عندما تكون قيمة S تساوي صفرًا، يجب على أي مستخدم يرغب في تسجيل الدخول الانتظار حتى تزداد قيمة S. يتم وضع طلب تسجيل الدخول في قائمة انتظار FIFO حتى يتم تحرير خانة. يُستخدم مبدأ الاستبعاد المتبادل لضمان ترتيب الطلبات في قائمة الانتظار. عند زيادة قيمة S (أي توفر خانات تسجيل دخول)، يتم إخراج طلب تسجيل دخول من قائمة الانتظار، ويُسمح للمستخدم صاحب الطلب بتسجيل الدخول. إذا كانت قيمة S أكبر من صفر بالفعل، فسيتم إخراج طلبات تسجيل الدخول من قائمة الانتظار فورًا.
مشكلة المنتج والمستهلك
في مسألة المنتج والمستهلك ، يقوم أحد العمليات (المنتج) بإنشاء عناصر البيانات، بينما يستقبلها عملية أخرى (المستهلك) ويستخدمها. ويتواصلان باستخدام قائمة انتظار بحجم أقصى N ، ويخضعان للشروط التالية:
- يجب على المستهلك أن ينتظر المنتج ليقوم بإنتاج شيء ما إذا كانت قائمة الانتظار فارغة؛
- يجب على المنتج أن ينتظر حتى يستهلك المستهلك شيئًا ما إذا كانت قائمة الانتظار ممتلئة.
يتتبع حل الإشارات الثنائية لمشكلة المنتج والمستهلك حالة الطابور باستخدام إشارتين ثنائيتين: الأولى تمثل emptyCountعدد الأماكن الفارغة في الطابور، والثانية تمثل fullCountعدد العناصر فيه. وللحفاظ على سلامة البيانات، emptyCountقد تكون قيمة الأولى أقل (ولكن لا يمكن أن تكون أعلى) من العدد الفعلي للأماكن الفارغة في الطابور، وقد fullCountتكون قيمة الثانية أقل (ولكن لا يمكن أن تكون أعلى) من العدد الفعلي للعناصر فيه. تمثل الأماكن الفارغة والعناصر نوعين من الموارد، وهما الصناديق الفارغة والصناديق الممتلئة، وتتحكم الإشارتان الثنائيتان emptyCountفي fullCountهذه الموارد.
يضمن نظام الإشارة الثنائية useQueueعدم المساس بسلامة حالة قائمة الانتظار نفسها، على سبيل المثال، عندما يحاول منتجان إضافة عناصر إلى قائمة انتظار فارغة في الوقت نفسه، مما يؤدي إلى إتلاف حالتها الداخلية. ويمكن بدلاً من ذلك استخدام قفل تبادلي (mutex) بدلاً من نظام الإشارة الثنائية.
تكون قيمة المتغير emptyCountفي البداية N ، fullCountوقيمته في البداية 0، useQueueوقيمته في البداية 1.
يقوم المنتج بما يلي بشكل متكرر:
ينتج: احتمال (عدد الفارغة) P(useQueue) putItemIntoQuue(item) V(useQueue) V(fullCount)
يقوم المستهلك بما يلي بشكل متكرر
يستهلك: P(fullCount) P(useQueue) العنصر ← getItemFromQueue() V(useQueue) V(emptyCount)
فيما يلي مثال جوهري:
- يدخل مستهلك واحد إلى قسمه الحرج. وبما أن
fullCountقيمته تساوي صفرًا، فإن المستهلك يتوقف. - يدخل عدد من المنتجين إلى القسم الحرج للمنتجين. ولا يُسمح بدخول أكثر من N منتج إلى هذا القسم الحرج بسبب
emptyCountالقيود المفروضة على دخولهم. - يحصل المنتجون، واحداً تلو الآخر، على إمكانية الوصول إلى قائمة الانتظار
useQueueويقومون بإيداع العناصر فيها. - بمجرد خروج المنتج الأول من قسمه الحرج،
fullCountيتم زيادة القيمة، مما يسمح لمستهلك واحد بالدخول إلى قسمه الحرج.
لاحظ أن هذا emptyCountقد يكون أقل بكثير من العدد الفعلي للأماكن الفارغة في قائمة الانتظار، على سبيل المثال، عندما يقوم العديد من المنتجين بتخفيضه لكنهم ينتظرون دورهم useQueueقبل ملء الأماكن الفارغة. لاحظ أن هذا صحيح دائمًا، مع المساواة إذا وفقط إذا لم يكن أي من المنتجين أو المستهلكين ينفذ أقسامه الحرجة.emptyCount + fullCount ≤ N
نمط تمرير العصا
يُعدّ نمط "تمرير الراية" [ 3 ] [ 4 ] [ 5 ]، الذي اقترحه غريغوري ر. أندروز، مخططًا عامًا لحلّ العديد من مسائل البرمجة المتزامنة المعقدة، حيث تتنافس عمليات متعددة على نفس المورد بشروط وصول معقدة (مثل استيفاء معايير أولوية محددة أو تجنب الحرمان). يتطلب هذا النمط، عند وجود مورد مشترك، استخدام إشارة مرور خاصة "priv" (مُهيأة إلى الصفر) لكل عملية (أو فئة من العمليات) مشاركة، وإشارة مرور واحدة للاستبعاد المتبادل "mutex" (مُهيأة إلى واحد). الشفرة الزائفة لكل عملية هي:
void process ( int proc_id , int res_id ) { resource_acquire ( proc_id , res_id ) ; < استخدام المورد res_id > ; resource_release ( proc_id , res_id ); }الشفرة الزائفة لعمليات الحصول على الموارد وتحريرها هي:
void resource_acquire ( int proc_id , int res_id ) { P ( mutex ) ; if ( < لم يتم التحقق من شرط الوصول إلى res_id لـ proc_id > ) { < يشير إلى أن proc_id معلق لـ res_id > ; V ( mutex ); P ( priv [ proc_id ]); < يشير إلى أن proc_id لم يعد معلقًا لـ res_id > ; } < يشير إلى أن proc_id يصل إلى المورد > ; pass_the_baton (); // انظر أدناه }void resource_release ( int proc_id , int res_id ) { P ( mutex ); < يشير إلى أن proc_id لم يعد يصل إلى المورد res_id > ; pass_the_baton ( ) ; // انظر أدناه }يستخدم كلا العنصرين الأساسيين بدورهما طريقة "pass_the_baton"، والتي يكون رمزها الزائف كالتالي:
void pass_the_baton ( int res_id ) { if /* <شرط الوصول إلى res_id صحيح لعملية واحدة على الأقل معلقة> */ { int p = < اختر العملية المراد إيقاظها > ; V ( priv [ p ]); } else { V ( mutex ) ; } }ملاحظات
يُطلق على هذا النمط اسم "تمرير العصا" لأن العملية التي تُحرر المورد، بالإضافة إلى عملية مُعاد تنشيطها حديثًا، ستُنشط عملية واحدة مُعلقة على الأكثر، أي أنها "ستمرر العصا إليها". يتم تحرير القفل فقط عندما تُعلق عملية ما نفسها (resource_acquire)، أو عندما يعجز pass_the_baton عن إعادة تنشيط عملية مُعلقة أخرى.
أسماء العمليات
يُشتق الاسمان المتعارف عليهما V و P من الأحرف الأولى لكلمات هولندية . يُفسَّر V عمومًا بمعنى verhogen (زيادة). وقُدِّمت عدة تفسيرات لـ P، منها proberen (اختبار أو محاولة)، [ 6 ] و passeren (تمرير)، و pakken (إمساك). تُشير أقدم ورقة بحثية لديجكسترا حول هذا الموضوع [ 1 ] إلى أن معنى P هو passering (مرور) ، ومعنى V هو vrijgave (إطلاق). كما تُشير إلى أن المصطلحات مُستقاة من تلك المُستخدمة في إشارات السكك الحديدية. كتب ديجكسترا لاحقًا أنه قصد أن يرمز P إلى prolaag ، [ 7 ] اختصارًا لـ probeer te verlagen ، والتي تعني حرفيًا "محاولة التقليل"، أو لموازاة المصطلحات المُستخدمة في الحالة الأخرى، "محاولة التناقص". [ 8 ] [ 9 ] [ 10 ]
في لغة ALGOL 68 ، نواة لينكس ، [ 11 ] وفي بعض الكتب الإنجليزية، تُسمى عمليتا V و P على التوالي up و down . في ممارسة هندسة البرمجيات، يُطلق عليهما غالبًا signal و wait ، [ 12 ] release و acquire [ 12 ] (مكتبة جافا القياسية )، [ 13 ] أو post و pend . تُسميهما بعض النصوص vacate و procure لمطابقة الأحرف الهولندية الأصلية. [ 14 ] [ 15 ]
الإشارات الثنائية مقابل الأقفال المتبادلة
الميوتكس هو آلية قفل تستخدم أحيانًا نفس التنفيذ الأساسي للسيمفور الثنائي. ومع ذلك، يختلفان في طريقة الاستخدام. فبينما يُشار إلى السيمفور الثنائي أحيانًا باسم ميوتكس، فإن الميوتكس الحقيقي له استخدام وتعريف أكثر تحديدًا، حيث يُفترض أن المهمة التي قامت بقفل الميوتكس فقط هي التي تستطيع فك قفله. ويهدف هذا القيد إلى معالجة بعض المشاكل المحتملة لاستخدام السيمفورات.
- انعكاس الأولوية : إذا كان القفل يعرف من قام بقفله ومن المفترض أن يقوم بفك قفله، فمن الممكن ترقية أولوية تلك المهمة كلما بدأت مهمة ذات أولوية أعلى في انتظار القفل.
- إنهاء المهمة قبل الأوان: قد توفر الأقفال المتبادلة أيضًا حماية من الحذف، حيث لا يمكن حذف المهمة التي تحتفظ بالقفل المتبادل عن طريق الخطأ. (وهذا له ثمن أيضًا؛ فإذا كان القفل المتبادل يمنع استعادة المهمة، فسيتعين على جامع البيانات المهملة مراقبة القفل المتبادل).
- حالة الجمود النهائي: إذا انتهت مهمة تحتفظ بـ mutex لأي سبب من الأسباب، فيمكن لنظام التشغيل تحرير mutex وإرسال إشارة إلى المهام المنتظرة بهذه الحالة.
- حالة الجمود التكراري: يُسمح للمهمة بقفل mutex قابل لإعادة الدخول عدة مرات بقدر ما تقوم بفك قفله عددًا مساويًا من المرات.
- التحرير العرضي: يتم رفع خطأ عند تحرير mutex إذا لم تكن المهمة التي تقوم بالتحرير هي مالكها.
انظر أيضاً
مراجع
- 1 2 Dijkstra، Edsger W. Over de sequentialiteit van procesbeschrijvingen (EWD-35) (PDF) . أرشيف إي دبليو ديكسترا. مركز التاريخ الأمريكي، جامعة تكساس في أوستن .( نسخة مكتوبة ) (بدون تاريخ، 1962 أو 1963)
- ↑ كتاب الإشارات الضوئية الصغير، تأليف ألين ب. داوني
- ↑ أندروز، غريغوري ر. (1999). أسس البرمجة متعددة الخيوط والمتوازية والموزعة . أديسون-ويسلي.
- ↑ كارفر، ريتشارد هـ.؛ تاي، كو-تشونغ (2005). البرمجة متعددة الخيوط الحديثة: تنفيذ واختبار وتصحيح برامج جافا وسي++/بي ثريدز/وين32 متعددة الخيوط . وايلي.
- ↑ ماورر، كريستيان (2021). البرمجة غير المتسلسلة والموزعة باستخدام لغة جو . سبرينغر.
- ↑ سيلبرشاتز، أبراهام؛ جالفين، بيتر باير؛ غاني، جريج (2008)، مفاهيم أنظمة التشغيل ( الطبعة الثامنة)، جون وايلي وأولاده، ص 234، ISBN 978-0-470-12872-5
- ↑ ديجكسترا، إدسكار دبليو. EWD-74 (ملف PDF) . أرشيف إي دبليو ديجكسترا. مركز التاريخ الأمريكي، جامعة تكساس في أوستن .( نص مكتوب )
- ↑ ديجكسترا، إدسكار دبليو. تعدد الألعاب في X8 (EWD-51) (ملف PDF) . أرشيف إي دبليو ديجكسترا. مركز التاريخ الأمريكي، جامعة تكساس في أوستن .( نص مكتوب ) (باللغة الهولندية )
- ↑ ترجمة ديكسترا الخاصة هي "try- and -decrease"، على الرغم من أن هذه العبارة قد تكون مربكة لأولئك الذين ليسوا على دراية بالعامية "try-and...".
- ↑ (التصحيح 1/19) MUTEX: تقديم تطبيق بسيط لـ mutex، قائمة بريدية لنواة لينكس، 19 ديسمبر 2005
- ↑ دليل اختراق نواة لينكس ( مؤرشف بتاريخ 28-05-2010 على موقع Wayback Machine) LinuxGrill.com
- 1 2 موليندر، سابي؛ كوكس، روس (2008). إشارات المرور في بلان 9 (ملف PDF) . ورشة العمل الدولية الثالثة حول بلان 9 .
- ↑
java.util.concurrent.Semaphore - ↑ "exec.library/Procure" . amigadev.elowar.com . تم الاطلاع عليه بتاريخ 19-09-2016 .
- ↑ "exec.library/Vacate" . amigadev.elowar.com . تم الاطلاع عليه بتاريخ 19-09-2016 .
روابط خارجية
مقدمات
- هيلشيمر، فولكر (2004). " تنفيذ قفل القراءة/الكتابة المتبادل " (صفحة ويب). مجلة Qt الفصلية ، العدد 11 - الربع الثالث 2004
- زيلينسكي، جولي؛ بارلانتي، نيك. "أمثلة على الخيوط والإشارات" (ملف PDF) . نشرة . CS107 نماذج البرمجة. ربيع 2008 (23). ستانفورد للهندسة في كل مكان (SEE).
مراجع
- ديجكسترا، إدسكار دبليو. العمليات المتسلسلة المتعاونة (EWD-123) (ملف PDF) . أرشيف إي دبليو ديجكسترا. مركز التاريخ الأمريكي، جامعة تكساس في أوستن .( نص مكتوب ) (سبتمبر 1965)
- "semaphore.h - الإشارات (الوقت الحقيقي)". المواصفات الأساسية لمجموعة Open Group، الإصدار 6، معيار IEEE 1003.1، إصدار 2004. مجموعة Open Group. 2004.
- داوني، ألين ب. (2016) [2005]. "الكتاب الصغير عن الإشارات الضوئية" ( الطبعة الثانية). دار نشر الشاي الأخضر.
- ليباجارفي، جوني (11 مايو 2008). "دراسة عملية ذات توجه تاريخي حول عالمية بدائيات التزامن" (ملف PDF) . جامعة أولو، فنلندا.
- التزامن
- التحكم في التزامن
- التزامن (علوم الحاسوب)
- الحوسبة المتوازية
- التواصل عبر الحاسوب
- إدسكار دبليو. ديكسترا
- الاختراعات الهولندية
