جواب سوال قبل در مورد هارد دیسک و حجم فایل ها

سه شنبه, ۲۴ خرداد ۱۴۰۱، ۱۰:۱۳ ب.ظ

اگه حوصله خوندن کامل پست رو ندارید و فقط میخواید یه جواب کلی بدونید :‌

در واقع داخل ویندوز وقتی کامپیوتر میخواد یه حجمی رو برای یک فایل مشخص روی هارد جدا کنه ، واحد اختصاص حجمش بایت نیست . بیش از یک بایته (مثلا ۴۰۹۶ بایت)‌. یعنی چی ؟‌یعنی ۴۰۹۶ تا ۴۰۹۶ تا میتونه جدا کنه از روی هارد دیسک این قابلیتو نداره که بایت بایت جدا کنه . برا همین مثلا اگه یه فایلی ۴۰۰۰ بایته نمیاد دقیقا براش ۴۰۰۰ بایت جدا کنه . مجبوره ۴۰۹۶ تا جدا کنه چون کمترین واحد اختصاص حافظه (allocation unit) همینقدره بنابراین حجم فایل (size) ۴۰۰۰ بایته ولی حجمی که رو دیسک گرفته (size on disk) میشه ۴۰۹۶

 

اگه میخواید جزئی تر دلیل این ماجرا رو بدونید :

باید یه سری به ساختار هارد دیسک هامون بزنیم . شکل هارد یه همچین چیزیه :

هارد های کامپیوتر هامون به این صورته که یک یا چند صفحه چرخان داخلش وجود داره (شبیه شکل CD حدودا) که یه سوزنی مانند (بهش میگن head) رو هرکدومشون میچرخه . درواقع اون صفحه ها به وسیله ی موتوری که به مرکزشون وصله میچرخن و اون سوزنه از نظر چرخش دایره ای ثابته . ولی خود سوزنه میتونه در شعاع این صفحات جلو و عقب بره . اینجوری میتونه به کل سطح این صفحه ها دسترسی داشته باشه . روی سطح این صفحه هارو یه ماده مغناطیسی پوشونده که این سوزنیه (head) میتونه از طریق مغناطیس روی سطح این صفحات اطلاعات بنویسه یا ازشون بخونه . اینجا معلوم میشه چرا سازنده های کامپیوتر اونا رو بر پایه مبنای ۲ طراحی کردن . مبنای ۲ یعنی فقط دوتا سطح داره . صفر یا یک . یعنی هر داده ای فقط شامل دو عدده صفر یا یک . حالا مثلا بیاید قرار بزاریم صفر یعنی سطح پایین و ۱ یعنی سطح بالا . حالا اون سوزنیه وقتی میخواد صفر یا یک بنویسه روی اون صفحه چرخانه اینطوری عمل میکنه :‌ اگه بخواد صفر بنویسه مثلا یه زور مغناطیسی میزنه سطح صفحه چرخان یکم اون قسمتش میره پایین (سطح پایین یعنی صفر) . اگه بخواد یک بنویسه زور نمیزنه در نتیجه اون قسمت نسبت به قسمت قبلی که اوردش پایین بالا میمونه (سطح بالا یعنی ۱) . یه مثال تخیلی بود واقعا مطمین نیستم مکانیزمش اینجوری باشه . فقط میخواستم بگم اینکه صفر و یک فقط داشته باشیم چقدر کار کامپیوتر راحت تر میشه . اگه کسی میدونه دقیقترشو بگه لطفا .

حالا بگذریم بریم سر کار خودمون .

 

دقیق تر شکلشو ببینیم :

[منبع تصویر لینکی که یکم پایین تره]

همینطور که میبینید روی هر کدوم از این صفحات چرخان یک سری حلقه ها یا دایره هایی هم مرکز وجود دارن که بهشون میگن track . خود همین track ها هم به یه سری قسمت تقسیم شدن که به هرکدومشون میگن sector . هر sector  معمولا ۵۱۲ بایت حجم داره . یه چیز دیگم هست سیلندر بهش میگن که الان به کار ما نمیاد دونستنش خیلی میخواین ساختار هارد رو بهتر بدونید برید اینجا :‌

https://tldp.org/LDP/sag/html/hard-disk.html

 

خب حالا میفهمیم هارد چجوری اطلاعات نوشته میشه روش یا خونده میشه ازش . این سوزنیا درواقع روی sector ها اطلاعات مینویسن یا ازش میخونن . نکته ای که هست اینه که موتور داخل هارد با یه سرعتی حدود ۵۴۰۰ تا ۷۲۰۰ دور در دقیقه این صفحات رو میچرخونه و در نتیجه این سوزنیا چون خیلی سریع سطح چرخان زیرشون رد میشه و احتمالا یه سری دلایل دیگه ، کوچیک ترین واحدی که میتونن اطلاعات ازش بخونن یا بنویسن یه sector هستش یعنی حدودا ۵۱۲ بایت  . نمیتونن از یه واحد یک بایتی خوندن نوشتن رو انجام بدن . یعنی کوچک ترین واحدی که میتونن بخونن یا بنویسن یک سکتوره .

 

این تا اینجا خودش ثابت میکنه که مثلا اگه یه فایلی ۴۰۰ بایته و سکتور های ما ۵۱۲ بایتی هستن قطعا ۵۱۲ بایت فضا باید براش گرفته بشه روی هارد چون طبق گفته بالا نمیشه دقیقا ۴۰۰ بایت جدا کرد رو هارد . ولی حتی جالبه بدونید خود ویندوز هم نمیاد سکتور به سکتور اطلاعات بنویسه . خود ویندوز هم واحد جداسازی بزرگتری نسبت به سکتور داره . ویندوز میاد کلاستر (cluster) به کلاستر روی هارد فضا جدا میکنه . هر کلاستر معمولا تو ویندوز ۴۰۹۶ بایته یعنی ۴ کیلوبایت (بستگی به فایل سیستم داره حجم هر کلاستر چقدر باشه) .

حالا فرض کنید میخواید یه فایل ۱۷ کیلو بایتی رو داخل هارد ذخیره کنیم . خب ما کوچیک ترین واحد اختصاص حافظمون کلاستره دیگه یعنی ۴۰۹۶ بایت یا به عبارتی ۴ کیلوبایت . پس مجبوریم ۵ تا کلاستر جدا کنیم تا این فایل ۱۷ کیلوبایتی جاش بشه . ۵ تا کلاستر میشه ۵ ضربدر ۴۰۹۶ که میشه ۲۰۴۸۰ بایت یعنی ۲۰ و خورده ای کیلو بایت .

میبینید ؟ حجم فایل ۱۷ کیلوبایت بود ولی حدود ۲۰ کیلوبایت حجم گرفت رو هارد.

میگوی نه ؟ نیگا کن .

میتونیم دقیقا همین مثال رو با یه اسکریپت پایتونی تست کنیم . ما میدونیم که هر کاراکتر نقطه (.) که داخل یه فایل بنویسیم در واقع یک بایت به حجم فایل اضافه میشه . بنابراین اگه ما یه فایل ۱۷ کیلوبایتی میخوایم باید ۱۷ ضربدر ۱۰۲۴ تا نقطه داخلش بنویسیم (هر ۱۰۲۴ بایت یک کیلوبایته).

اسکریپت :

size = 17 * 1024 # KB

file = open("file.txt","w")
for _ in range(size):
    file.write(".")

file.close()

بعد از اجرای اسکریپت یه فایل به نام file.txt ساخته میشه . حجم فایل رو ببینیم :

بله و بله وبله .کاملا حدسمون درست بود . سایز فایل ۱۷۴۰۸ بایت (۱۷ کیلوبایت) و حجمی که روی هارد گرفته ۲۰۴۸۰ بایت (حدودا ۲۰ کیلو بایت)

 

امیدوارم مفید بوده باشه ...

موافقین ۳ مخالفین ۰
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">