الدرس الأول : مفهوم الزمن الحقيقي و مقدمة عن Pthreads

سلسلة من الدروس في الـ POSIX

الدرس الأول : مفهوم الزمن الحقيقي و مقدمة عن Pthreads
 

Real-time System: هو نظام يحقق قيود زمن استجابة واضحة، أو الاستجابة لحالات خاصة متضمناً إمكانية حصول خطأ.

مثال: عندما تهبط الطائرة يجب أن تقف بعد 40 ثانية (مثلاً) من ملامسة العجلات الأمامية لأرض المدرج (تحقيق قيود زمن استجابة واضحة).يتم حساب تسارع الطارئة في كل لحظة و عندما يمضي 35 ثانية واعتماداً على قيمة التسارع نجد أنه لا يمكن للطائرة أن تتوقف بعد 5ثانية يقوم الطيار الآلي بالإقلاع بالطائرة مجدداً تجنباً لاصطدامها بمبنى المطار(الاستجابة لحالات خاصة).  

Response Time: هو الزمن بين وصول بيانات الدخل و استجابة النظام لتخديم هذه البيانات بهدف الحصول على الخرج.

مثال: في المعالج 8086 عند وصول مقاطعة على أحد مداخل المقاطعة – و ليكن NMI – فإن المعالج لا يعلم بوجود مقاطعة حتى انتهاء دورة التعليمة قيد التنفيذ، يمثل هذا الزمن زمن الاستجابة.

دائماً في أنظمة الزمن الحقيقي يجب تحقق:

زمن الاستجابة + زمن التنفيذ ≤ القيد الزمني المحدد (Deadline)

ترتبط مجموعة من المفاهيم بأنظمة الزمن الحقيقي :

–          External Event Response

–          Interrupt Handling

–          Scheduling

–          Inter task Communication &Synchronization

Process: هو تجريد لبرنامج قيد التنفيذ، و هو الوحدة المنطقية المجدولة من قبل نظام التشغيل. يحتوي على الأقل حالة التنفيذ، معرّف الـ Process، مميزات الـ Process، و المصادر التي يحتاجها الـ Process أثناء تنفيذه.

Thread: توصف بأنها Process خفيفة حيث ترتبط الـ Thread أو أكثر بـ Process واحدة و تتشارك جميع الـ Threads المرتبطة بـ Process المصادر و منها الذاكرة المخصصة للـ Process. يمكن تشبيهها ببرنامج بلغة الـ C  حيث يمثل الـ Thread  تابع في البرنامج الكلي. تتم جدولة الـ Threads  على المعالج بشكل منفصل.

Task: تمثل الـ Process أو الـ Thread بعد جدولتها على المعالج.

Pthreads

POSIX Threads: is the IEEE’s Portable Operating System Interface for Computer Environments

و هي المعيار القياسي في أنظمة التشغيل، صمّمت لكي تسمح بكتابة تطبيقات قابلة لتنفيذ على أنظمة تشغيل مختلفة. توجد على شكل مكتبة توابع بلغة الـ C، تستخدم بشكل واسع في كتابة تطبيقات الزمن الحقيقي.

تشتمل المكتبة على مجموعة من أنواع البيانات Data Types بالإضافة إلى مجموعة من التوابع.

–          تبدأ كل التوابع في هذه المكتبة بـ  pthread_ ثم يليها وصف دقيق للتابع.

–          تبدأ كل أنواع البيانات بـ pthread_ و تنتهي بـ _t

بيئة العمل:

سيتم التنفيذ على نظام التشغيل GNU/Linux و ذلك لسهولة التعامل و توفر المكتبات بشكل تلقائي.

خطوات العمل:

–          كتابة الكود على ملف نصي و نسميه FILE_NAME.c

–          نفتح الـ Terminal  لنقوم بترجمة الملف

gcc –pthread –o PROGRAM_NAME FILE_NAME.c

–          نقوم بتنفيذ البرنامج

PROGRAM_NAME/.

للتنفيذ على ويندوز و الربط مع VS 2010

New Project… -> Visual C++ -> Win32 -> Win32 Console Application (Enter_name).

Next -> – Consol application

                            –  Empty project  -> Finish.

Add -> New Item > C++ File (cpp).

Properties -> C/C++ -> General -> Additional Include Directories -> THE_PATH_OF_PTHRED_INCLUDE_FOLDER

Properties -> Linker -> General -> Additional Library Directories -> Properties -> THE_PATH_OF_PTHRED_LIB_FOLDER

Properties -> Linker -> Input -> Additional Dependencies -> pthreadVC1.lib 

pthreadVSE1.lib+

تعليمات إنشاء الـ Threads  و إنهاءها:

لإنشاء Thread  يجب أولاً تعريف متحول من نوع pthread_t، ثم نقوم بتوليد الـ Thread باستخدام التابع:

 , int pthread_create(pthread_t* thread , const pthread_attr_t * attr

          ,  (void * (*start_routine)(*void

                       ;(void*arg

حيث :

–         thread : الخيط الذي تم تعريفه مسبقاً من نوع pthread_t

–         attr: مميزات الـ thread و تعرف على شكل نوع بيانات pthread_attr_t سيتم شرحها في الجلسة التالية. نضع NULL في حال أردنا استخدام المميزات التلقائية.

–         (void * (*start_routine) (* void:  مؤشر إلى التابع الذي سيقوم الـ Thread  بتنفيذه(يمكن لكل Thread أن ينفّذ تابع واحد) و يكون لهذا التابع دخل وحيد.

–         void *arg : مؤشر إلى القيمة التي نريد تمريرها للتابع الذي سيقوم الـ Thread  بتنفيذه، إذا لا نريد تمرير قيمة نضع NULL.

–         int: يعيد التابع قيمة صحيحة، إذا تم إنشاء الـ Thread  بشكل صحيح تكون هذه القيمة مساوية للصفر و إلا فإن قيمتها تدل على نوع الخطأ الحاصل.

لو كنا نريد تمرير أكثر من قيمة للتابع فنقوم بجمعها في Structure حيث يشترط بالتابع أن يكون له دخل وحيد.

لإنهاء عمل الـ Thread نستخدم التابع:

;(void pthread_exit(void *retval

 retval *:  مؤشر لمتحول عام و ليس محلي ضمن التابع الذي يقوم الـ Thread بتنفيذه ليتم قراءتها من قبل Thread آخر، حيث يحتوي معلومات عن حالة الـ Thread. إن لم نريد الحصول على هذه المعلومات نضع NULL.

مثال:

         <include <pthread.h #

<include <stdio.h #

define NUM_THREADS     5 #

(void *PrintHello(void *threadid

}

  ; long tid

  ; tid = (long) threadid

  ;(printf(“Hello World! It’s me, thread #%ld!\n”, tid

   ;(pthread_exit(NULL

( [] int main (int argc, char *argv

}

;[pthread_t threads[NUM_THREADS

  ; int rc

   ;long t

   (++for(t=0; t<NUM_THREADS; t

}

     ;( printf(“In main: creating thread %ld\n”, t

     ;( rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t

       (if (rc

}

         ;( printf(“ERROR; return code from pthread_create() is %d\n”, rc

        ;( exit(-1

    {

{

   /* Last thing that main() should do */

   ;(pthread_exit(NULL

{

يكون الخرج:

In main: creating thread 0

In main: creating thread 1

In main: creating thread 2

In main: creating thread 3

!Hello World! It’s me, thread #2

In main: creating thread 4

!Hello World! It’s me, thread #3

!Hello World! It’s me, thread #1

!Hello World! It’s me, thread #4

!Hello World! It’s me, thread #0

About RaGHaD

Master CSE at Technische Universität Braunschweig,Germany (2012 till now).. Study first year of master in Syria (2010-2011).. Licenses of Computer Engineering - Aleppo University (2006 till 2010)..
هذا المنشور نشر في دروس تعليمية وكلماته الدلالية , , , , , . حفظ الرابط الثابت.

4 ردود على الدرس الأول : مفهوم الزمن الحقيقي و مقدمة عن Pthreads

  1. يقول طائرة طيران:

    I read this blog this is very informative blog about the landing of aircraft.I am very interested in the flying of aeroplane.their flying and landing position so inspire me.In this blog you give us the aeroplane lending time limit.so i wanna ask you that does this speed limit only for passenger aeroplane or for the war aeroplane?

  2. يقول Ammar:

    ممكن تشرحلي مفهوم ال real time distributed system

    • أهلا عمار!
      أنظمة الزمن الحقيقي الموزعة real time distributed system هي أنظمة تملك أكثر من معالج و وحدات إدارة الممرات ..الخ متصلة مع بعضها و تخضع لقيود زمنية أي يجب أن نحصل على الخرج عند زمن محدد.
      في هذه الأنظمة نهتم بما يسمى end-to-end latency أي من لحظة إعطاء الدخل حتى الحصول على الخرج بالإضافة إلى اهتمامنا بالاستجابة الزمنية لكل مصدر resource على حدى .
      إذا كنت تريد المزيد من التفصيل عن الموضوع أخبرني و سأعطيك شرح أكثر تفصيل الأسبوع القادم

  3. يقول أبوحميد:

    يعطيكم العافية
    ممكن شرح ممبسط للخرج بالمثال المكتوب
    بصراحة ما كتير فهمت الخرج كيف ظهر بهذه الطريقة ؟؟

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s