Programming Freaks  | دورات ومقالات برمجيه

Please login or register.

Login with username, password and session length
Advanced search  

News:

Programming-Fr34ks.net
Up and running

Author Topic: كيف تعمل استدعاءات ال read , write  (Read 1603 times)

St0rM

  • [C programmer]
  • Administrator
  • Active Member
  • *****
  • Posts: 209
  • Why So serious ?
    • View Profile
    • WWW
    • Email
كيف تعمل استدعاءات ال read , write
« on: August 27, 2009, 06:53:32 PM »
كيف تعمل استدعاءات ال  read  , write

مساء الخير , الموضوع هيتكلم عن ال internals الخاصه بال system calls read , write
هيتكلم اذاي الدوال ديت بتشتغل , واذاي ال data بتوصلك او بتوصل لل physical media او اي كان المكان الي بتكتب

مبدئيا هنتكلم عن ال IO بشكل عام :
اي عملية IO بتتم علي ال علي ال disk بتتم علي شكل blocks of data
الي blocks ديت بتختلف في الحجم ممكن تكون 512 , 1024 , 2048 وهكذا
في فرق كبير جدا ان تقرا 1024 byte ك byte by bye وده هيكون 1024 system call لل read
بس المشكله مش في ال 1024 system call ديت ولونها هتعمل مشكله في ال performence المشكله هتكون في ال accessing the disk
ال access علي ال disk بيكون اسرع لما بيكون block aligned يعني بتقرا blocks محاذيين لبعض علي شكل خطي linear blocks
بذلك ال kernel بيقدر يقرا اسرع واسرع وده بيساعده علي تقليل ال overhead في ال access لل blocks
الكتابة على الديسك بتم على هيئة شنكس ولنقل مثلا 4 ميجا وهو ضعف حجم ال block size زي مقلنا  .... اذا سواء كتبت 2 ميجا او حتى كيلو او 4 ميجا هتاخد نفس الزمن فى الكتابة ..... وهو الزمن اللى بتاخده الشنك ..... فلو انك كتبت بايت بايت هتاخد زمن 4 ميجا فى كل مرة ويبقى الكتابة مش فعالة ....... علشان كدة بتعمل بفر وبتكتب منه بعنى لو كان حجم البفر انت مظبطه على حجم الشنك
الكتابة هتكون سريعة جدا ..
كأن تقرا مثلا 1024 بايت في ال call الواحده او 2048 او 4096 بايت مثلا

Thanks hackobacko

بس للاسف الكلام دوت مش بيكون موجود ديما مع ال files , لان وفي الغالب في ال file ممكن تقرا char by char او line by line ده مش بيكون block aligned علي اي شكل من الاشكال , لانك بتقرا بايت واحد في الاستدعاء او سطر واحد الله اعلم حجمه قد ايه بس مفيش سطر حجمه 512 بايت مثلا ؟
الكيرنيل اذاي بيحل الموضوع دوت , نقدر دلوقتي نتكلم عن ال internals الي ال kernel بيتعامل بيها مع ال I/O

اولا عشان نبدأ نقسم الموضوع في انظمة فرعيه في ال Kernel تكون ال I/O system في ال kernel تسمي بال I/O subsystems
التركيز هيكون علي اتنين منها حاليا وواحد كمان هيتم ذكره في الاخر للعلم بالشيئ ليس اكثر

اولهم ال : Page caching
ال page cache هو مكان في ال memory ال kernel بيتحتفظ بيه بال recently requested data , ال page cache بما انه مكان في ال memory فطبيعي انه ممكن يكبر علي حسب الاحتياج
فايدته انه بيقلل من ال disk access باستخدام "temporal locality" مش هترجمها بالعربي انما هشرح معناها , معناها ان ال disk access الي حصل في مكان ما ممكن يكون ليه احتماليه انه يحصل تاني , والاحتماليات ليها اولويات والاولويات بيتم الاستدلال عليها من اول request بتحصل disk access عشان يقدر يقلل من ال disk requests الي بتحصل لل disk

بس ليه البارانويا ديت حول ال disk access ? هو ال disk بطئ للدرجة ديت ؟
الحقيقه انه مش بطئ , انما مش سريع قد ال memory accessing
وديت لاسباب المفروض انك تكون فاهمها

بس ال page cache لزمته ايه بعد كل الكلام دوت ؟
لزمته انه بيسجل اخر data تم الحصول عليها
في حين انك لو طلبتها مرة تانيه بدل مالkernel يقوم بعمل disk access هيقوم بعمل memory access وارجاع ال data المطلوبه ليك من ال memory
وده معناه ان كل read request بتحصل بيتم الحصول علي الداتا بالتحديد من ال memory cache
في اول مرة بتحصل لما ال data مبتكنش موجوده في ال memory cache ال kernel بيقوم بقرائتها من ال disk وعمل نسخه منها في ال page cache وبعدين بيقوم بارجاع ال data من ال page cache , تاني مرة يتم طلب ال data ديت فيها بيتم ارجاعها فورا من ال page cache بدلا من عمل disk access تاني وطلب قرائه منه والانتظار.

حاجه كمان بيستخدمها ال page cache تسمي بال read ahead يعني اقرا شوية كمان قدام فوق البيانات المطلوبه , وديت بتكون نافذه حجمها ممكن يكون 16 كيلو كاقل حجم او 128 كأكبر حجم 
وده نوع تاني من ال locality بيفترض ان البيانات بيتم الحصول عليها sequentially يعني تسلسليا ولذلك بيستفيد من ال read ahead , بيتم تسجيل ال read ahead في ال page cache وحجمه بيكبر او يقل علي حسب ال sequential access او علي حسب حجم ال chunks المطلوبه , يعني مثلا لو انا طلبت 4 kbyte chuck ممكن يقرا 16 kbyte كمان فوقيهم ويسجلهم في ال page cache

طبعا ديت ideal status بس مش ديما الحال بيكون كده , انك تقرا ملف بشكل تسلسي احسن بكتير من انك تقراه بشكل عشوائي , الكيرنيل لو لاحظ ذلك هيعمل disable تمام لل read ahead

بس في حاجه كمان لسه بتلعب في دماغك الا وهي ال memory ! ال memory مش كبيره للدرجة وممكن تخلص بسرعه مثلا , ولذلك لما بتحصل حاجه زي كده ال kernel بيعمل prune لل page cache
يعني بينضفه بمعني اصح , بيعمل clean لل less frequently accessed data بس برده دوت مش حل 100% , افرض ان في منهم انت محتاجهم واولوياتهم كبيره بس صغيره بالنسبه للاولويات الي في ال page cache
يعني مثلا هنا 10 وهنا 9 , 9 مش قليل بس هيتم التخلص منه , ولذلك بيستخدم swapping system , ودوت بيسمح لل kernel انه يخزن ال البيانات علي ال disk , وبذلك بيسمحه بمساحة ذاكرة اكبر من تلك الموجوده في ال ram , ال swapping موضوع تاني مش هنتكلم عنه انما حبيت اوضح الاستفاده منه
قبل منتكلم عن ال system التاني هنتكلم عن ال

read call :
ال read call بتتبع كل الكلام الي اتكلمنا عنه فوق , لو قريت data من ال disk بشكل متتابع بيتم استخدام ال page caching وال read ahead بشكل ممتاز بيسرع عملية القرائه اكتر واكتر

انما لو استخدمتها بشكل عشوائي ودوت بيحصل في بعض الاحيان بل وبيكون مطلوب ال page caching وال read ahead مش هيكونا كويسين بشكل كبير بال بالعكس ممكن يكونوا مش شغالين اساسا خاصة ال read ahead زي متكلمنا فوق

دلوقتي ال read call بتطلب data من ال مكان كذا في ال disk
الكيرنيل بيقوم بعمل read لل disk اذا كانت ال data غير موجوده في ال page cache ويقرا شوية بيانات كمان ويستخدم ال read ahead ويعمل نسخه منها في الميموري
طلبت بيانات تانيه علي نفس ال sequence بتاع البيانات الي قبل كده هيتم الحصول عليها فورا من ال page cache الي طبيعي متخزن فيه ال read ahead الي ممكن بكده حجمه يكبر ويوصل مثلا ل 128 كيلو بايت زي مقلنا قبل كده , انما سيناريو تاني ممكن يحصل انك متقراش البيانات بشكل سليم وبذلك ال performence مش هيكون علي قد كده .

نتكلم عن ال system التاني ال Page writeback:
ولكن قبل منتكلم عنها هنتكلم عن اسلوب ال write في الكتابة لل disk
رجع ضهرك لورا وهاتلك حاجه تشربها وريح شوية قبل متكمل الكلام دوت لانك محتاج تكون استوعبت الي قبل كده عشان تستوعب ده

هقلك حاجه سر , ال writes الي انت بتكتبها لل disk ممكن متكنش بتروح لل disk علي طول , صراحه مفيش حد كان عاوز يقلك كده انما ال data بتروح لل memory قبل كده وتسجل نفسها في buffer قبل متتكتب لل  disk  :D

الي بيحصل هو الاتي : بتطلب من الكيرنيل انك تكتب في disk , الكيرنيل بياخد الداتا بتاعتك ويعمل منها كوبي ويحطها في ال buffer الي هو قام بانشائه ويقلك اشطه هبقي اكتبها بعدين ياسكر ! ده بالظبت الي بيحصل
الكتابة بعدين ديت مبتحصلش الا لما بيحصل سبب من السببين :
1- ال buffers حجمها كبر فوق حجم بيتم عمله configure من ال kernel وسبب تقلص في حجم الذاكره المتاحه
2- ال buffers وقتها كتر في الذاكره ولازم تتكتب لل disk وده برده configurable في ال kernel

لما بيحصل حاجه من الاتنين دول بيتم ايقاظ kernel threads تسمي بال pdflush threads لما بيتم ايقاظه عن حدوث اي حدث من الاحداث الي اتكلمنها عنها من شوية , ومن ثم بتقوم بكتابة ال data لل disk وعمل لحد مالحدثين دول يتم ارضائهم ان ميكنش في اي buffer في ال kernel متوافق مع اي سبب من السببين دول

لكن دلوقتي انا لما بكتب مثلا data لل disk وفي نفس الوقت بطلب نفس ال data ديت ححصل عليها اذاي ؟ ده لان ال buffers ديت بيتم تسجيلها في ال page cache :) ايوه بالظبت الاتنين ليهم علاقه كبيره ببعض في الحقيقه النظامين مشتركين مع بعض
ال buffers بيتم تسجيلها في ال page cache وبيتم تسجيلها علي هيئة منشئات بتحتوي علي بيانات تانيه ومن ضمنها مكان ال data في ال page cache وبكده نكون خلصنا من ال page writeback system

في حاجه مهمه لازم ننوه بيها : طالما محصلش اي error او كراش في النظام , النظامين الي اتكلمنا عنهم هيتشغلوا تمام , انما لو حصل كراش في النظام او قطع مثلا للتيار الكهربي ال buffers الخاصه بال write هيتم فقدها , والبيانات مش هتوصل ابدا لل disk الا لو عملتلها write من اول وجديد , ولذلك بيستخدم شيئ يسمي بال synchronized io
بيطلب "لاحظ بيطلب " من الكيرنل انه يكتب ال buffers بتاعته لل disk

man 2 sync
man 2 fsync

ودلوقتي نلخص معلوماتنا :
ال page cache بيتم تسجيل فيه ال recent used data سواء كانت read/write data
بيتم استخدامه للحصول علي performence احسن في الكتابه او القرائه

الكيرنيل بيقوم باخذ نسخه من البيانات التي تم قرائتها ويسجلها في ال page cache مع read ahead buffer

الكيرنيل بيقوم باخذ نسخه من ال بيانات المكتوبه ويسجلها في buffers لحين كتابتها

ال buffers بيتم كتابتها عن طريق ال kernel threads المسماه pdflush threads

يمكنك عمل flush لل data ديت اذا كان وصولها لل disk امر ولابد منه عن طريق استخدام ال synchronized i/o

وبكده نكون انتهينا من موضوعنا

بالنسبة للنظام التالت فهو ال VFS : Virtual file system
بيقدم نوع معين من التجريد متفرقش معاه نوع النظام , هو بيقدم نفس ال system calls لنفس ال file systems وال system calls مسؤولة عن استدعاء الدوال الصحيحه للقرائه او الكتابه
ده تلخيص ليه

النهايه
هقوم بعمل امثلة لاحقا

reference: google.com
Linux system programming O`REILLY
« Last Edit: September 14, 2009, 06:59:37 AM by St0rM »
Logged

mohamedyosry

  • NeWBie
  • Just Joined
  • *
  • Posts: 22
    • View Profile
    • Email
Re: كيف تعمل استدعاءات ال read , write
« Reply #1 on: August 28, 2009, 03:50:38 AM »
كلام جميل
بس على كدة ممكن انصح الكومبيلر بحاجة
يعنى فى الميمورى (الرام) باقدر احجز منة
aligned و unaligned
وعارف ان المترتبة احتمال بتاخد مساحة اكبر بس اسرع(يعنى فى مكتبة بتسمحلى بكدة)
هو فى مكتبة او
system calls
فى السى ممكن استخدمها فى السى عشان احسن الكود بتاعى وبتسمحلى اخش فى
internals
.الكتابة والقراية فى الميديا زى ما مسموح فى الرام
واخيرا بياثر على
portability
ولا لا
والسوال الاهم
هو انت ازاى بتظبط الحروف العربي والانجليزى فى نفس السطر   >:( عشان تعبت من كتابة كل حرف فى سطر
« Last Edit: August 28, 2009, 05:12:34 AM by mohamedyosry »
Logged

St0rM

  • [C programmer]
  • Administrator
  • Active Member
  • *****
  • Posts: 209
  • Why So serious ?
    • View Profile
    • WWW
    • Email
Re: كيف تعمل استدعاءات ال read , write
« Reply #2 on: August 28, 2009, 12:36:54 PM »
هههههههههه استخدم ال rtl /rtl tags حطاها بين [ rtl ]  [ /rtl ]
واكتب كلامك في النص شيل المسافات بس

واكتب كلامك من اول وجديد مترتب عشان انا مفهمتش نصه
بالنسبه لانك ممكن تنصح الكومبايلر "فعلا تنصح" انه يعمل allocate ل aligned memory فده صحيح
ومش شرط انها تحجز مساحه اكبر او حاجه , هتكون portable مع الانظمة الي بتتقيد بال POSIX فقط يعني مش هتشتغل علي ويندوز مثلا !

الداله تبع ال C library وبيتم تطبيقها في اللينكس عن طريق glibc
good question

Code: [Select]
int posix_memalign(void **ptr , size_t alignment , size_t size);
/*DESCRIPTION
       The  function  posix_memalign() allocates size bytes and places the address of the
       allocated memory in *memptr.  The address of the allocated memory will be a multi-
       ple of alignment, which must be a power of two and a multiple of sizeof(void *).
*/
Logged

mohamedyosry

  • NeWBie
  • Just Joined
  • *
  • Posts: 22
    • View Profile
    • Email
Re: كيف تعمل استدعاءات ال read , write
« Reply #3 on: August 28, 2009, 01:41:53 PM »
شكرا يا ستورم . حاوضح السوال
بس الاول فى حجز شنكس الميمورى بتاع الرام الجى لب سى بتقدم فانكشن بورتابل وبيقولو انها محسنة (عاملين عليها اوبتمايزيشن وبيقولو انهم قللوا  تضييع الميمورى وحسنوا الاداء والفعالية
http://library.gnome.org/devel/glib/unstable/glib-Memory-Slices.html
اما بخصوص السوال الى اقصدة فهو بخصوص الموضوع المشروح عن الكتابة والقراية من الميديا .
كنت باسائل هى اية المكتبة الى بتقدملى امكانيات تحديد حجم البافر بلوك مثلا و بيخلينى اتدخل فى الانترنلز ؟
وهل لو فى مكاتب بتسمح بكدة ؟ الموضوع دة بيستخدم فى انظمة ادارة قواعد البيانات ولا مش بتفرق اوى فى الاداء ؟
Logged

St0rM

  • [C programmer]
  • Administrator
  • Active Member
  • *****
  • Posts: 209
  • Why So serious ?
    • View Profile
    • WWW
    • Email
Re: كيف تعمل استدعاءات ال read , write
« Reply #4 on: August 28, 2009, 04:26:51 PM »
1- glib is not glibc
ال memory slices ديت فكرة اتقدمت من حد من بتوع شركة صن مش فاكر بالتحديد اسمه وتم تطبيقها في ال glib الي هي جزء من ال gnome project وال GTK+ بتعتمد عليها و portable طالما بتستخدم ال glib
 
انما ال glibc بتقدم malloc/calloc/realloc/free + ال posix function الي قلتلك عليها
2- اه ينفع , مش مكتبة ولا حاجه هتستخدم حاجه اسمها DIRECT IO وديت عن طريق flag بتقدمها ل open وقت مبتفتح الملف في open واسمها O_DIRECT  ديت بتقلل من تدخل الكيرنيل في عملية  ال IO طبعا بتقلل ال performance بس بتكون مطلوبه اكيد في بعض الحالات زي
والي القسم التاني من سؤالك بيقولها هي قواعد البيانات , في بعض الاحيان بيكون مطلوب user buffered io مثلا وان ال user هو الي يكون متحكم في عملية ال buffering / caching whatever وديت بالفعل بيتم استخدامها في قواعد البيانات

الجدير بالذكر ان ال data في حالة ال DIRECT Io بيتم كتابتها فورا لل disk او ال media الي انت بتكتب عليها
بس تخيل لو كان مطلوب انك تنتظر للكتابه مثلا وهكذا

راجع ال man 2 open
واقرا ال section ده

Code: [Select]
/*
Try to minimize cache effects of the I/O to and from this file. In general this will degrade performance, but it is useful in special situations,
 such as when applications do their own caching. File I/O is done directly to/from user space buffers.
 The I/O is synchronous, i.e., at the completion of a read(2) or write(2), data is guaranteed to have been transferred.
 Under Linux 2.4 transfer sizes, and the alignment of user buffer and file offset must all be multiples of the logical block size of the file system.
 Under Linux 2.6 alignment to 512-byte boundaries suffices.
*/

ده معناه انك ممكن "تلغي" انا بستخدم الكلمه بشكل عام ال kernel internals الي اتكلمت عليها وتستخدم your own buffering system طبعا ده انت الي هتعمله implement
« Last Edit: August 28, 2009, 04:29:51 PM by St0rM »
Logged

mohamedyosry

  • NeWBie
  • Just Joined
  • *
  • Posts: 22
    • View Profile
    • Email
Re: كيف تعمل استدعاءات ال read , write
« Reply #5 on: August 28, 2009, 08:42:14 PM »
thnx StOrM
Logged

St0rM

  • [C programmer]
  • Administrator
  • Active Member
  • *****
  • Posts: 209
  • Why So serious ?
    • View Profile
    • WWW
    • Email
Re: كيف تعمل استدعاءات ال read , write
« Reply #6 on: August 29, 2009, 06:24:07 AM »
anytime
Logged

St0rM

  • [C programmer]
  • Administrator
  • Active Member
  • *****
  • Posts: 209
  • Why So serious ?
    • View Profile
    • WWW
    • Email
Re: كيف تعمل استدعاءات ال read , write
« Reply #7 on: August 29, 2009, 05:13:28 PM »
انا نسيت اقول حاجه مهمه جدا ان ال libc بتقدم ال standard i/o الي بدورها بتقدم user level buffering فوق ,"لاحظ كلمة فوق" ال  kernel buffering

اذاي تتخلص بقي من اا kernel buffering وتستخدم ال user level buffering بتاع ال standard c library ?
وكمان سؤال بقي :D لو ال user buffering مبني فوق ال kernel IO system يبقي ليه من اساساه نستخدمه ؟

حسيبك تفكر شوية  ;)
« Last Edit: August 29, 2009, 05:18:34 PM by St0rM »
Logged

mohamedyosry

  • NeWBie
  • Just Joined
  • *
  • Posts: 22
    • View Profile
    • Email
Re: كيف تعمل استدعاءات ال read , write
« Reply #8 on: August 29, 2009, 05:56:48 PM »
شكلك قارىLinux system programming :P  و رغم انى حاطة على اللستة بس لسة اوانة ماجاش .
عموما نفتى وخلاص
Quote
اذاي تتخلص بقي من اا kernel buffering وتستخدم ال user level buffering بتاع ال standard c library ?
اكيد لو انا مستخدم الفانكشن من ليبرارى السى حيفتح استريم تانى بفلاج جديد(حسب ما حددتة فى كود السى) دة على حسب فهمى .الا لو كانت الفلاج الى مررتة للكرنل مازال هو المستخدم فى اى ستريم يتفتح.ولو الاحتمال دة صح يبقى اكيد فى فلاج بامررة بيرجعة للوضع الافتراضى.

Quote
لو ال user buffering مبني فوق ال kernel IO system يبقي ليه من اساساه نستخدمه ؟
اكيد عشان الكود محمول واعلى فى المستوى من مستوى الكرنل .  والمفروض السوال "لية استعمل الكرنل مود مادام قدامى مكتبة السى" وساعتها حاجاوب ان الكرنل مود متكاملة اكتر مع الكرنل (يعنى فية فانكشن بتظبط التصاريح و الموضوع متخصص اكتر)

Logged

St0rM

  • [C programmer]
  • Administrator
  • Active Member
  • *****
  • Posts: 209
  • Why So serious ?
    • View Profile
    • WWW
    • Email
Re: كيف تعمل استدعاءات ال read , write
« Reply #9 on: August 29, 2009, 06:11:02 PM »
حقيقي انا بقراه , بس مش هو دوت ال reference الوحيد الي عندي  :)
ثانيا : الاجابه لا
كل الي عليك حتفتح new file descriptor بفلاج ال O_DIRECT
وتستخدم fdopen عشان تستخدم ال user buffering بتاع المكتبه

ثالثا : لا برده , الحقيقه نص الاجابه صح ان الكود بيشتغل في ال user mode مش ال kernel mode جميل ؟ ده معناه ايه ؟ مفيش system calls كل شوية وقت الاحتياج بس وده بيقلل ال overhead , متقتدش تستعمل اليوزر مود من غير الكيرنيل , اليوزر مود مجرد intermediate library بينك وبين ال kernel . الموضوع مش متخصص اكتر ولا حاجه لما بتفتح fopen الي بيحصل في ال internal بتاعتها هو open :D وال user buffering فوق ال file descriptor
enjoy وقلي انت بتقرا ايه دلوقتي ؟ what are you studying now ?
Logged

mohamedyosry

  • NeWBie
  • Just Joined
  • *
  • Posts: 22
    • View Profile
    • Email
Re: كيف تعمل استدعاءات ال read , write
« Reply #10 on: August 29, 2009, 06:31:41 PM »
انا اليومين دول عاوز اتعلمhow to make good modular programعشان كدة فى كام كتاب حاططهم فى دماغى عشان بيناقشوا النقطة دية زىpractical c and programming in c
وناوى بعديها اشد علىgcc+gdb+make+tools that help me
وعاوز اجمع شوية معلومات منglibc تخص الفايل براوزينج عشان مشروع كدة ممكن ابعتلك عنة على الخاص
Logged

St0rM

  • [C programmer]
  • Administrator
  • Active Member
  • *****
  • Posts: 209
  • Why So serious ?
    • View Profile
    • WWW
    • Email
Re: كيف تعمل استدعاءات ال read , write
« Reply #11 on: August 29, 2009, 06:53:37 PM »
ارشحلك في الكتب ديت The linux programming environment / Linux Application Development (2nd Edition)  / Linux professional programming [SUCKS but fits]
اشطه مستنيك
« Last Edit: August 29, 2009, 06:58:40 PM by St0rM »
Logged

black ray

  • Global Moderator
  • Just Joined
  • *****
  • Posts: 10
  • Be Stupid As Much As You Can
    • View Profile
Re: كيف تعمل استدعاءات ال read , write
« Reply #12 on: August 30, 2009, 11:29:35 PM »
كله بسبب العنكبوت ! هههههههه اسئل هاكو فين ايام زمان  ;) ههههههههه
Logged
Why Does Unripe Fruit Looks So Delicious ?

St0rM

  • [C programmer]
  • Administrator
  • Active Member
  • *****
  • Posts: 209
  • Why So serious ?
    • View Profile
    • WWW
    • Email
Re: كيف تعمل استدعاءات ال read , write
« Reply #13 on: August 31, 2009, 05:01:58 AM »
huh  ???
Logged