الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

هل Linux Kernel 2.6.x يدعم ال Multithreaded Application

بدأه eramax في 25 يوليو 2008 · 1 رد · 1,187 مشاهدة · في نظام تشغيل Unix & Linux
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

هل لينكس كيرنال وبالتحديد 2.6.x يدعم ال Multithreaded Application

اقرا معى هذا الاقتباس الذى هو من كتاب Advanced Linux Programming فى الفصل الرابع :-

4.5 GNU/Linux Thread Implementation

The implementation of POSIX threads on GNU/Linux differs from the thread imple-

mentation on many other UNIX-like systems in an important way: on GNU/Linux,

threads are implemented as processes.Whenever you call pthread_create to create a

new thread, Linux creates a new process that runs that thread. However, this process is

not the same as a process you would create with fork; in particular, it shares the same

address space and resources as the original process rather than receiving copies.

فمعنى ذلك ان الكيرنال لا يدعم ال Mutlithreading او يمكن القول بانه يتحايل على ذلك ليدعمها فاذا ما هو الفرق بين دعمها حقيقايا وان ال process تقسم الى threads ويقسم وقتها على هذه ال threads وبين تلك الحالة التى اختلط فيها مفهوم ال process بمفهوم ال thread واصبح كل منهما يساوى الاخر فى المعنى لدى النظام

وايضا اود ان اعرف ما هى فائدة kthread process والتى تاخذ pid 2

ملحوظة جربت مثال كان مكتوب فى الكتاب لكى اتاكد من ان النظام يعطر pid لل main تختلف عن ال pid الخاصة بال process التى تعيش داخلها ال thread وهذا هو الكود

  1.  
  2. #include <pthread.h>
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. void* thread_function (void* arg)
  6. {
  7. fprintf (stderr, "child thread pid is %dn", (int) getpid ());
  8. /* Spin forever. */
  9. while (1);
  10. return NULL;
  11. }
  12. int main ()
  13. {
  14. pthread_t thread;
  15. fprintf (stderr, "main thread pid is %dn", (int) getpid ());
  16. pthread_create (&thread, NULL, &thread_function, NULL);
  17. /* Spin forever. */
  18. while (1);
  19. return 0;
  20. }
  21.  
  22.  

لتجريب عمل compile لهذا الكود من خلال الامر :-

  1.  
  2. gcc -o th main.c -lpthread
  3. ./th
  4.  

وللاسف كان الخرج

  1.  
  2. main thread pid is 6258
  3. child thread pid is 6258
  4.  
  5.  

فما معنى ذلك ???

اطيب المنى :)

تم تعديل هذه المشاركة بواسطة eramax في 25 يوليو 2008 في 15:28

amdvsintel22.jpg

--i use AMD--

لا اله الا الله محمد رسول الله

أستعن بالله و لا تعجز

تابعنى على تويتر

***

#2

السلام عليكم

أخي eramax ، قبل ما تدخل في برمجة النظم اعرف البيئة التي ستعمل عليها ، حتى لا تقع في مشاكل .

المهم ، لو اطلعت على هذا الكتاب الذي تقرأه في المقدمة ، ستجد أنه صدر في 2001 ، وكان الكرنل وقتها 2.4 .

الذي ظهر معك طبيعي ، حيث أن لينوكس بعد ظهو 2.6 ، أصبح يدعم threading بشكل أساسي ، أما ما قبل ذلك ، فكان نوع من المحاكاة، بمعنى ، أنه كان يستخدم clone() sytem call ، ومن خلاله يتم إنشاء process جديد ، هذا ال process يتشارك مع parent process في أجزاء من execution context أو address space، وهذا مقصود المؤلف في الكتاب الذي ذكرته ، لذلك عندما نفذ هو البرنامج أظهر أن thread التي تكونت لها pid مختلف عن parent process ، لأن الذي تكون فعليا هو process وليس thread في الحقيقة ، ولكن أراد مطوري لينوكس أن يحاكوا هذه التقنية وقتيا ، وفي حقيقة الأمر أن thread ليس لديها pid لأنها ليست process في الحقيقة ، و سبب ظهور تقنية threading أصلا هو الهروب من العلمليات الكثيرة التي تنتج من إنشاء process جديد ، وذلك من خلال fork() sytem call ، أما clone() sytem call ، قام بحل المشكلة جزئيا فهو لا يستهلك موارد الجهاز كما يفعل fork ، وفي منتصف عام 2003 ، فإن linux قام بدعم threading بصورة كاملة ، وذلك من خلال Native POSIX Thread Library .

1

System Engineer

Red Hat Certified Engineer

Red Hat Certificate Number

805010381752078

مواضيع مشابهة