نکات کلیدی
1. اطلاعات اساساً شامل بیتها و زمینه است.
تنها چیزی که اشیاء دادهای مختلف را متمایز میکند، زمینهای است که ما آنها را در آن مشاهده میکنیم.
بیتها نیاز به تفسیر دارند. در هستهی خود، تمام دادهها در یک سیستم کامپیوتری—از فایلها روی دیسک تا برنامهها در حافظه—بهصورت بیتها (صفر و یک) نمایش داده میشوند. معنای این بیتها بهطور کامل از زمینهای که در آن تفسیر میشوند، ناشی میشود. یک توالی یکسان از بایتها میتواند یک عدد صحیح، یک عدد اعشاری، یک رشته کاراکتری یا حتی یک دستور ماشین را نمایندگی کند.
زمینه اهمیت دارد. این مفهوم برای برنامهنویسان بسیار مهم است. بهعنوان مثال، یک توالی از بایتها که یک عدد را نمایندگی میکند، ممکن است بهعنوان عدد صحیح یا بدون علامت تفسیر شود که منجر به تفسیرهای بسیار متفاوتی میشود. بهطور مشابه، نحوهی برخورد یک برنامه با دادهها به نوع آن بستگی دارد که کامپایلر از آن برای تولید کد ماشین مناسب استفاده میکند.
درک نمایشها. با درک نحوهی نمایش انواع مختلف دادهها در سطح بیت، برنامهنویسان میتوانند کدهای قابل اعتماد و کارآمدتری بنویسند. این دانش به جلوگیری از مشکلات رایج مانند سرریز عدد صحیح، نادرستیهای اعشاری و آسیبپذیریهای امنیتی مانند سرریز بافر کمک میکند.
2. سیستمهای کامپایل برنامههای قابل خواندن توسط انسان را به کد ماشین قابل اجرا ترجمه میکنند.
در یک سیستم یونیکس، ترجمه از فایل منبع به فایل شیء توسط یک درایور کامپایلر انجام میشود.
از منبع به اجرا. سفر یک برنامه C از کد منبع آن به اجرای آن شامل یک سری تبدیلها است که توسط سیستم کامپایل انجام میشود. این سیستم معمولاً شامل یک پیشپردازنده، کامپایلر، اسمبلر و لینککننده است که هرکدام نقش حیاتی در تبدیل کد سطح بالا به دستورالعملهای سطح پایین ماشین ایفا میکنند.
مراحل کامپایل. پیشپردازنده دستورات مانند #include
را مدیریت میکند، کامپایلر کد C را به زبان اسمبلی ترجمه میکند، اسمبلر کد اسمبلی را به کد شیء قابل جابجایی تبدیل میکند و لینککننده فایلهای شیء و کتابخانهها را ترکیب میکند تا یک فایل اجرایی تولید کند. هر مرحله پیچیدگی و جزئیات بیشتری را اضافه میکند و به درک ماشین نزدیکتر میشود.
فایلهای شیء قابل اجرا. خروجی نهایی سیستم کامپایل یک فایل شیء قابل اجرا است که شامل دستورالعملهای کد ماشین، دادهها و اطلاعات نماد مورد نیاز برای اجرای برنامه است. این فایل سپس توسط سیستمعامل در حافظه بارگذاری شده و توسط پردازنده اجرا میشود.
3. درک سیستمهای کامپایل به بهینهسازی عملکرد و جلوگیری از خطاها کمک میکند.
برای برنامههای سادهای مانند
hello.c
، میتوانیم به سیستم کامپایل اعتماد کنیم تا کد ماشین صحیح و کارآمدی تولید کند.
محدودیتهای کامپایلر. در حالی که کامپایلرهای مدرن پیچیده هستند، اما محدودیتهایی دارند. برنامهنویسان نیاز به درک پایهای از کد سطح ماشین دارند تا تصمیمات کدنویسی خوبی بگیرند، مانند انتخاب ساختارهای داده و الگوریتمهای کارآمد.
خطاهای زمان لینک. برخی از گیجکنندهترین خطاهای برنامهنویسی مربوط به لینککننده هستند، بهویژه در سیستمهای نرمافزاری بزرگ. درک نحوهی حل ارجاعات توسط لینککنندهها، مدیریت کتابخانههای ایستا و پویا و ایجاد کد مستقل از موقعیت برای جلوگیری از این خطاها بسیار مهم است.
آسیبپذیریهای امنیتی. آسیبپذیریهای ناشی از سرریز بافر، که منبع رایجی از حفرههای امنیتی هستند، از عدم درک نحوهی ذخیرهسازی دادهها و اطلاعات کنترل در پشته برنامه ناشی میشوند. برنامهنویسان باید این مفاهیم را درک کنند تا کدهای امنی بنویسند.
4. پردازندهها دستورالعملهای ذخیرهشده در حافظه را اجرا میکنند که توسط سیستمعامل مدیریت میشود.
در هستهی آن یک دستگاه ذخیرهسازی به اندازه کلمه (یا رجیستر) به نام شمارنده برنامه (PC) وجود دارد.
نقش CPU. واحد پردازش مرکزی (CPU) موتور است که دستورالعملهای ذخیرهشده در حافظه اصلی را تفسیر و اجرا میکند. این واحد با تکرار fetching دستورالعملها، تفسیر آنها و انجام عملیات ساده بر روی دادهها عمل میکند.
سازماندهی سختافزاری. CPU با حافظه اصلی، دستگاههای ورودی/خروجی و سایر اجزا از طریق یک سیستم باس تعامل دارد. فایل رجیستر، یک دستگاه ذخیرهسازی کوچک درون CPU، دادههای بهطور مکرر دسترسی یافته را نگه میدارد. واحد حسابی/منطقی (ALU) عملیات حسابی و منطقی را انجام میدهد.
اجرای دستورالعمل. CPU یک مدل ساده از اجرای دستورالعمل را دنبال میکند که توسط معماری مجموعه دستورالعملهای آن (ISA) تعریف شده است. دستورالعملها بهطور دقیق در توالی اجرا میشوند و شامل مراحلی مانند بارگذاری داده، ذخیرهسازی داده، انجام عملیات بر روی داده و پرش به دستورالعملهای مختلف است.
5. حافظههای کش برای پل زدن به شکاف سرعت پردازنده و حافظه ضروری هستند.
برای مقابله با شکاف پردازنده-حافظه، طراحان سیستمها دستگاههای ذخیرهسازی کوچکتر و سریعتری به نام حافظههای کش (یا به سادگی کشها) را شامل میشوند که بهعنوان مناطق موقت برای اطلاعاتی که پردازنده احتمالاً بهزودی به آن نیاز دارد، عمل میکنند.
شکاف پردازنده-حافظه. بهدلیل قوانین فیزیکی، دستگاههای ذخیرهسازی بزرگتر کندتر از دستگاههای ذخیرهسازی کوچکتر هستند. دستگاههای سریعتر ساختشان هزینهبرتر از همتایان کندتر خود هستند. این شکاف قابل توجهی بین سرعت پردازنده و زمان دسترسی به حافظه ایجاد میکند.
سلسلهمراتب کش. برای پل زدن به این شکاف، طراحان سیستمها از سلسلهمراتب دستگاههای ذخیرهسازی به نام حافظههای کش استفاده میکنند. کشهای کوچکتر و سریعتر (L1، L2، L3) دادههای بهطور مکرر دسترسی یافته را ذخیره میکنند و به پردازنده اجازه میدهند تا بهسرعت به آنها دسترسی پیدا کند.
محلیسازی. کش کردن بهواسطهی محلیسازی ممکن میشود، تمایل برنامهها به دسترسی به دادهها و کد در مناطق محلی. با بهرهبرداری از محلیسازی زمانی و فضایی، کشها میتوانند بهطور قابل توجهی عملکرد برنامه را بهبود بخشند.
6. دستگاههای ذخیرهسازی بر اساس سرعت، هزینه و ظرفیت در یک سلسلهمراتب سازماندهی میشوند.
با حرکت از بالای سلسلهمراتب به پایین، دستگاهها کندتر، بزرگتر و هزینه کمتری به ازای هر بایت میشوند.
سلسلهمراتب حافظه. سیستمهای کامپیوتری دستگاههای ذخیرهسازی را در یک سلسلهمراتب سازماندهی میکنند، با دستگاههای سریعتر، کوچکتر و گرانتر در بالا و دستگاههای کندتر، بزرگتر و ارزانتر در پایین. این سلسلهمراتب شامل رجیسترها، کشها، حافظه اصلی، دیسکهای حالت جامد و دیسکهای چرخشی است.
کش کردن در هر سطح. هر سطح در سلسلهمراتب بهعنوان کش برای سطح پایینتر بعدی عمل میکند. فایل رجیستر دادهها را از کش L1 کش میکند، کش L1 دادهها را از کش L2 کش میکند و به همین ترتیب.
بهرهبرداری از سلسلهمراتب. برنامهنویسان میتوانند با درک و بهرهبرداری از سلسلهمراتب حافظه، عملکرد را بهبود بخشند. این شامل نوشتن کدی است که محلیسازی خوبی را نشان میدهد و حداقل کردن تعداد دسترسیها به دستگاههای ذخیرهسازی کندتر است.
7. سیستمعامل منابع سختافزاری را از طریق انتزاعاتی مانند فرایندها، حافظه مجازی و فایلها مدیریت میکند.
میتوانیم سیستمعامل را بهعنوان لایهای از نرمافزار که بین برنامه کاربردی و سختافزار قرار دارد، تصور کنیم.
لایه انتزاع. سیستمعامل (OS) بهعنوان واسطهای بین برنامههای کاربردی و سختافزار عمل میکند. این سیستم سختافزار را از سوءاستفاده محافظت کرده و مکانیزمهای ساده و یکنواختی را برای دستکاری دستگاههای سختافزاری پیچیده به برنامهها ارائه میدهد.
انتزاعات کلیدی. سیستمعامل اهداف خود را از طریق سه انتزاع بنیادی بهدست میآورد: فرایندها، حافظه مجازی و فایلها. فرایندها توهم استفاده انحصاری از پردازنده، حافظه اصلی و دستگاههای ورودی/خروجی را فراهم میکنند. حافظه مجازی توهم استفاده انحصاری از حافظه اصلی را فراهم میکند. فایلها نمایی یکنواخت از تمام دستگاههای ورودی/خروجی ارائه میدهند.
نقش هسته. هسته سیستمعامل این انتزاعات را مدیریت میکند و به مدیریت تغییر زمینهها بین فرایندها، ترجمه آدرسهای مجازی به آدرسهای فیزیکی و ارائه یک رابط یکنواخت برای دسترسی به دستگاههای ورودی/خروجی میپردازد.
8. سیستمها با استفاده از شبکهها با دیگر سیستمها ارتباط برقرار میکنند که بهعنوان دستگاههای ورودی/خروجی مشاهده میشوند.
زمانی که سیستم یک توالی از بایتها را از حافظه اصلی به آداپتور شبکه کپی میکند، جریان دادهها از طریق شبکه به یک ماشین دیگر منتقل میشود، نه بهعنوان مثال به یک درایو دیسک محلی.
شبکهها بهعنوان دستگاههای ورودی/خروجی. از منظر یک سیستم فردی، یک شبکه میتواند بهعنوان یک دستگاه ورودی/خروجی دیگر مشاهده شود. دادهها میتوانند از حافظه اصلی به آداپتور شبکه برای انتقال به ماشینهای دیگر کپی شوند.
مدل کلاینت-سرور. برنامههای شبکه بر اساس مدل کلاینت-سرور ساخته شدهاند، جایی که کلاینتها از سرورها خدمات درخواست میکنند. این مدل به توانایی کپی اطلاعات از طریق شبکه وابسته است.
مثال Telnet. برنامه telnet
نشان میدهد که چگونه میتوان از یک شبکه برای اجرای برنامهها بهصورت از راه دور استفاده کرد. کلاینت telnet دستورات را به سرور telnet ارسال میکند، که دستورات را اجرا کرده و خروجی را به کلاینت بازمیگرداند.
9. قانون آمدال محدودیتهای بهبود عملکرد را از طریق بهینهسازی یک جزء واحد تعیین میکند.
ایده اصلی این است که وقتی یک بخش از یک سیستم را سریعتر میکنیم، تأثیر آن بر عملکرد کلی سیستم به هر دو عامل بستگی دارد: اینکه این بخش چقدر مهم بوده و چقدر سریعتر شده است.
بازده کاهشی. قانون آمدال بیان میکند که تسریع کلی یک سیستم محدود به کسری از زمان است که جزء بهبود یافته استفاده میشود. حتی اگر ما بهبود قابل توجهی در یک بخش اصلی سیستم ایجاد کنیم، تسریع خالص کمتر از تسریع برای همان بخش خواهد بود.
تمرکز بر تصویر بزرگ. برای تسریع قابل توجه کل سیستم، باید سرعت بخش بسیار بزرگی از کل سیستم را بهبود بخشیم. این نیاز به شناسایی و بهینهسازی اجزای زمانبر دارد.
اصل عمومی. قانون آمدال یک اصل عمومی برای بهبود هر فرآیند است، نه فقط سیستمهای کامپیوتری. این میتواند راهنمایی برای کاهش هزینههای تولید یا بهبود عملکرد تحصیلی باشد.
10. همزمانی و موازیسازی عملکرد سیستم را در سطوح مختلف افزایش میدهند.
ما از اصطلاح همزمانی برای اشاره به مفهوم کلی یک سیستم با فعالیتهای همزمان متعدد استفاده میکنیم و از اصطلاح موازیسازی برای اشاره به استفاده از همزمانی برای سریعتر کردن یک سیستم استفاده میکنیم.
همزمانی در مقابل موازیسازی. همزمانی به مفهوم کلی فعالیتهای همزمان متعدد در یک سیستم اشاره دارد. موازیسازی به استفاده از همزمانی برای سریعتر کردن یک سیستم اشاره دارد.
سطوح موازیسازی:
- همزمانی در سطح رشته: از طریق چندین فرایند یا رشته بهدست میآید که به چندین کاربر یا وظیفه اجازه میدهد بهطور همزمان اجرا شوند.
- موازیسازی در سطح دستورالعمل: پردازندههای مدرن چندین دستورالعمل را بهطور همزمان اجرا میکنند و عملکرد را بهبود میبخشند.
- موازیسازی SIMD: دستورالعملهای واحد بر روی چندین نقطه داده بهطور همزمان عمل میکنند و پردازش تصویر، صدا و ویدئو را تسریع میکنند.
سیستمهای چندپردازندهای. سیستمهای چندپردازندهای، از جمله پردازندههای چند هستهای و هایپر تردینگ، اجازه اجرای واقعی موازی را میدهند و عملکرد سیستم را با کاهش نیاز به شبیهسازی همزمانی بهبود میبخشند.
11. انتزاعات برای مدیریت پیچیدگی در سیستمهای کامپیوتری حیاتی هستند.
استفاده از انتزاعات یکی از مهمترین مفاهیم در علوم کامپیوتر است.
سادهسازی پیچیدگی. انتزاعات نمای سادهتری از سیستمهای پیچیده ارائه میدهند و به برنامهنویسان اجازه میدهند بدون ورود به جزئیات داخلی کد استفاده کنند. این یک جنبه کلیدی از شیوههای خوب برنامهنویسی است.
مثالهای انتزاعات:
- معماری مجموعه دستورالعمل (ISA): انتزاعی از سختافزار پردازنده را فراهم میکند.
- سیستمعامل: انتزاعات برای دستگاههای ورودی/خروجی (فایلها)، حافظه برنامه (حافظه مجازی) و برنامههای در حال اجرا (فرایندها) را فراهم میکند.
- ماشینهای مجازی: انتزاعی از کل کامپیوتر، شامل سیستمعامل، پردازنده و برنامهها را فراهم میکند.
مزایای انتزاعات. انتزاعات به برنامهنویسان این امکان را میدهند که کدی قابل حمل، قابل اعتماد و کارآمد بنویسند، بدون اینکه نیاز به درک جزئیات سختافزار و نرمافزار زیرین داشته باشند.
12. نمایندگی عددی بر قابلیت اطمینان و امنیت برنامه تأثیر میگذارد.
داشتن درک قوی از حساب کامپیوتری برای نوشتن برنامههای قابل اعتماد حیاتی است.
تقریبهای محدود. نمایندگیهای عددی در کامپیوترها تقریبهای محدودی از اعداد صحیح و اعداد حقیقی هستند. این میتواند منجر به رفتارهای غیرمنتظرهای مانند سرریز حسابی و نادرستیهای اعشاری شود.
نمایندگیهای عدد صحیح. کدگذاریهای بدون علامت اعداد غیرمنفی را نمایندگی میکنند، در حالی که کدگذاریهای مکمل دو اعداد صحیح علامتدار را نمایندگی میکنند. درک ویژگیهای این نمایندگیها برای نوشتن کدهای قابل اعتماد بسیار مهم است.
نمایندگیهای اعشاری. فرمت اعشاری IEEE نسخهای از نمایندگی علمی اعداد حقیقی بهصورت پایه ۲ است. درک نحوهی نمایندگی و دستکاری اعداد اعشاری برای جلوگیری از خطاها در محاسبات عددی ضروری است.
آخرین بهروزرسانی::
نقد و بررسی
کتاب سیستمهای کامپیوتری: دیدگاه یک برنامهنویس به خاطر توضیحات جامع و روشنگرانهاش در زمینه مفاهیم سیستمهای کامپیوتری بسیار مورد توجه قرار گرفته است. خوانندگان به رویکرد عملی آن، استفاده از مثالهای زبان C و پوشش موضوعاتی مانند سلسلهمراتب حافظه و حافظه مجازی ارج مینهند. بسیاری آن را خواندنی ضروری برای دانشجویان و حرفهایهای علوم کامپیوتر میدانند. این کتاب به خاطر تواناییاش در پیوند زدن مفاهیم نظری با کاربردهای دنیای واقعی ستایش میشود. در حالی که برخی آن را چالشبرانگیز مییابند، بیشتر منتقدان از عمق و وضوح آن قدردانی میکنند. چند انتقاد به اطلاعات قدیمی و مشکلات احتمالی با رفتارهای نامشخص در مثالهای کد اشاره دارد.
Similar Books








