Back to tutorials
Tutorial

مقدمة عامة عن الـ Operating Systems (الفصل الأول)

مقدمة عامة عن الـ Operating Systems (الفصل الأول)

مقدمة عامة (تاريخ)

في الشابتر ده، هنتعرف مع بعض على المفاهيم الأساسية اللي لازم تبقى فاهمها قبل ما تخش بجد في عالم الـ Operating Systems. انا هحاول في الـ tutorial دي اني مستخدمش لغة سهلة عشان ميكونش في misconception أو أوصلك المعلومة لـ دماغك وتفكر بيها بعد كده بشكل غلط. وبرده هحاول اني مستخدمش لغة صعبة غير مفهومة هتخلي الأمور بالنسبه ليك أعقد أكتر، وده مش هدفي طبعاً.

هنتعلم ايه في الفصل ده؟

  • هنعرف ايه هو الـ Operating system ده
  • هنتكلم عن المهام الرئيسية للـ Operating Systems
  • هنتكلم برده على ازاي الجهاز بيبدأ يشتغل أول ما بنفتحه
  • هنتعلم يعني ايه Process
  • هنفهم يعني ايه Interrupt
  • هنفهم ايه الفرق ما بين الـUser Mode والـ Kernel Mode وليه هما مهمين لأي نظام تشغيل
  • وهنتكلم عن الـ System calls

الحاجات دي لو فهمتها كويس، كل اللي جاي هيكون سهل عليك، ان شاء الله، والمقدمة دي هتكون متقسمه لأجزاء.

يعني ايه Operating System؟

خلينا قبل ما نبدأ تعريف الـ Operating systems نروح الأول هي الناس كانت بتعمل ايه قبل ما يكون في مفهوم الـ Operating System. قبل الـ Operating system كانت كل حاجه حرفياً Manual مكنش في حاجه موجودة اسمها C او C++ ومكنش في كمان حاجه اسمها assembly. كان ساعتها الكمبيوتر مش بيفهم غير الـ Machine Language اللي هي 0 و 1، وانت اللي كنت بتكتب الكود ده بنفسك.

طب إزاي كان بيتعامل مع الهاردوير وازاي كان بيتعامل مع الميموري؟

في البداية مفهوم الـ Variable مكنش موجود.. الكمبيوتر كان بيشوف فقط الـ Memory على انها Array of Addresses وكل addresses حجمه بيكون واحد byte.

فـ عشان تحط الداتا بتاعتك في الميموري فكنت بتحدد بنفسك الـ address وتحط فيه الداتا بتاعتك، وبرده كنت بتكتب كود (Machine code) عشان تنقل الداتا دي من الـ Memory للـ CPU عشان يعملها Processing.

مثال على الكلام ده مثلاً، نفترض اننا عاوزين نجمع رقمين، تمام؟ والرقم الأول محطوط في Memory address مثلاً (005)، والرقم التاني محطوط في Memory address مثلاً (006) والناتج اللي هيطلع عاوزين نحطه في الـ Memory address وليكن (007). وخلي بالك الداتا في الميموري عبارة عن Bytes.

طيب الرقم الاول ده لازم اجيبه من الميموري عشان احطه في وحدة تخزين في الـ CPU بنسميها الـ registers. الـ registers بيستخدمها الـ CPU عشان يخزن الداتا اللي بيشتغل عليها في الوقت الحالي (هنتناقش فيها بالتفاصيل مستقبلاً). طيب، انا هنا محتاج أكتب Instruction أو أمر بالـ (0 والـ 1) يقول للـ cpu ازاي يقدر يجيب الداتا اللي في الميموري دي ويخزنها في register معين عنده وليكن اسمه r1، فأنا هنا بعمل load من الميموري للـ register اللي اسمه r1. فيبدأ الـ cpu يفهم الـ instruction اللي انت مديهاله واخترعتها عشان بس تـ load الرقم من الميموري للـ register. نفس الخطوات دي هعملها برده مع الرقم التاني بس طبعا هتغير الـ memory address اللي فيه الرقم، وطبعا هتخزنه في register تاني وليكن برده اسمه r2.. تمام.

دلوقتي بقى انا عاوز ابدأ أجمع الرقمين.. أحنا عندنا حاجه اسمها ALU (Arithmetic Logic Unit) ودي جزء من اجزء الـ CPU وظيفتها انها بتعمل عمليات حسابية (Arithmetic operations) وبيعمل عمليات منطقية (Logic Operations) زي هل الرقم ده أقل من ده او بيساويه أو الـ AND والـ OR وهكذا يعني. طيب فهمنا الـ ALU بشكل بسيط، دلوقتي الـ ALU اللي هما عملينها دي انا عاوز استخدمها عشان غرض وهو اني أجمع رقمين.. طبعاً الـ ALU فيها الـمكونات اللي تقدر تعمل الـ operation دي (انها تجمع رقمين) لكن هل هي عارفه ازاي؟ بمعنى برده، الـ Instruction اللي انت هتديها للـ CPU ازاي هيعرف انها دي عملية جمع؟ ودي جزء تاني من الـ CPU اسمه الـ Control Unit.. الجزء ده من الـ CPU هو متصمم انه يوجه الـ instruction بتاعتك اللي انت عملتها بتاعت الجمع دي للـ ALU. طيب، انا عملت الـ instruction وخلاص جمعت الرقمين.. وطلعلي ناتج - مش لازم ازاي طلع، لكنه طلع وخلاص - عاوز اتصرف فيه، طبعاً يعني هخزنه في register تالت هسميه r3. الناتج ده مش هيفضل طول عمره في الـ register كده.. فيه process تانيه مستنيه انها تتجمع، فـ لازم آخد الناتج ده من الـ register واحطه في الميموري، ودي instruction رابعه برده (يوووووه) عشان نخزن الناتج ده من الـ register للـ memory لعل وعسى نحتاجها برده في process تانيه!

فـ شوفت انت محتاج كل ده (وبالـ 0 والـ 1) عشان بس تجمع رقمين! محتاج: LOAD r1, 005 LOAD r2, 006 ADD r1, r2, r3 STORE 007, r3

مجاش في بالك سؤال مثلاً، في الـ LOAD منا ممكن استخدم اتنين من الـ registers بس بدل تلاته، اجمع الرقمين واخزن في اي register من r1 او r2؟ 

كل الـ zeros والـ ones دي انت اللي كنت بتكتبها بإيدك، وبرده كان في طرق كتير عشان تـ represent الـ zero والـ one اللي بتكون بيها الـ instruction زي الـ Punched tape واللي كانوا بيخزنوا فيها الـ instructions دي، فتخيل بقى لو بتعمل حاجه زي Amazon! او حتى بتـكتب Data structure.. او انك تخلي الجهاز بتاعك يقدر يتواصل مع الشاشة اللي انت بتقرأ منها المقال حاليا كان ممكن ياخد وقت قد ايه وكمية التعقيد اللي فيه. عشان كده فكروا في الـ Assembly Language اللي خلت كتابة الكود شكل سهل وبيفهمه الإنسان بشكل أحسن. فخلوا بدل ما اكتب instruction بالزيرو والواحد عشان اجيب داتا من الميموري مثلا خلوها اسمها LOAD وهكذا.