صفحه (رایانه)

یک **صفحه**، **صفحه حافظه**، یا **صفحه مجازی** (به انگلیسی: Paging, Page, Memory Page, or Virtual Page)، یک طول ثابت و متوالی بلوکی از حافظه مجازی است، و آن کوچکترین واحد داده برای موارد ذیل است:
* حافظه اختصاص یافته توسط سیستم عامل برای یک فرایند یا پردازش.
* نقل و انتقال بین یک حافظه اصلی و هر حافظه ذخیره‌سازی کمکی، مانند دیسک سخت.

به کمک تکنیک حافظه مجازی می‌توان صفحه‌ای که هم‌اکنون در حافظه وجود ندارد را آدرس‌دهی و استفاده کرد. اگر برنامه‌ای سعی کند جایی در یک چنین صفحه‌ای را مورد دسترسی قرار دهد، یک استثنا به نام نقص صفحه رخ خواهد داد. سپس سخت‌افزار یا سیستم‌عامل با خبر شده و سعی می‌کند صفحه مورد نظر را به صورت خود کار از حافظه کمکی به حافظه اصلی بارگذاری کند. برنامه‌ای که حافظه را آدرس‌دهی می‌کند، از جریان نقص صفحه و طریقه واکشی آن با خبر نیست. در نتیجه یک برنامه می‌تواند حافظه‌ای بزرگتر از حافظه فیزیکی را آدرس‌دهی کند. حافظه مجازی، تصوری در ذهن کاربران ایجاد می‌کند که انگار آن‌ها در حال کار کردن با یک حافظه بزرگ و پیوسته هستند. (شاید بزرگتر از حافظه واقعی سیستم) در حالی که عملاً اکثر اطلاعات آن‌ها در حافظه کمکی (دیسک سخت) قرار دارد.

از تکنیک انتقال صفحات بین حافظه اصلی و حافظه کمکی (مانند دیسک سخت) با نام **صفحه‌بندی** یا **مبادله** یاد می‌شود.

اندازه صفحه معمولاً توسط معماری پردازنده تعیین می‌شود. به‌طور سنتی، تمام صفحات اندازه یکنواختی دارند، مثلاً ۴۰۹۶ بایت.

## اندازه صفحه
یکی از پارامترهای مهم در صفحه‌بندی، اندازه هر صفحه است. اندازه صفحات معمولاً وابسته به سخت‌افزار است اما سیستم‌عامل هم می‌توان این پارامتر را به صورت نرم‌افزاری مشخص کند. برای مثال اگر اندازه هر صفحه به صورت سخت‌افزاری ۵۱۲ بایت باشد، سیستم‌عامل می‌تواند با چیدن دو قاب صفحه در کنار هم صفحات ۱ کیلو بایتی داشته باشد. تعیین اندازه صفحه به پارامترهای مختلفی بستگی دارد که گاهی با هم در تضاد هستند و نمی‌توان به یک اندازه ایده‌آل دست یافت. امروزه در سیستم‌های مدرن، صفحاتی با اندازه ۵۱۲ بایت تا ۱ مگابایت بسیار رایج هستند.

### اندازه صفحه در مقابل اندازه جدول صفحه
هرچه اندازه صفحه کوچکتر در نظر گرفته شود، سیستم از صفحات بیشتری استفاده می‌کند که در این حالت به جدول صفحه‌ای با اندازه بزرگتر نیاز است. به عنوان مثال، اگر یک فضای آدرس‌دهی مجازی با ۲^۳۲ به صفحات ۴ کیلوبایتی (۲^۱۲) نگاشت  شود، تعداد صفحات مجازی ۲^۲۰ خواهد بود. (۲^۳۲/۲^۱۲) با این حال اگر اندازه هر صفحه را به ۳۲ کیلوبایت افزایش دهیم، (۲^۱۵) تنها ۲^۱۷ صفحه مورد نیاز است.

### اندازه صفحه در مقابل استفاده از TLB
از آنجا که برای هر دسترسی به حافظه باید آدرس منطقی را به آدرس فیزیکی تبدیل کنیم، خواندن جدول صفحه به ازای هر بار مراجعه به حافظه هزینه‌برخواهد بود. به همین خاطر از یک حافظه نهان بسیار سریع به نام TLB استفاده می‌شود. اندازه TLB محدود است و نمی‌توان تمام آدرس‌ها را در آن قرار داد؛ بنابراین اگر TLB نتواند درخواستی را برآورده سازد (TLB miss)، باید به‌طور دستی جدول صفحه را جستجو کرد تا عمل تبدیل آدرس صورت پذیرد. (این کار بسته به معماری سیستم، یا به صورت سخت‌افزاری یا به صورت نرم‌افزاری انجام می‌شود) اگر اندازه صفحات را بالا در نظر بگیریم، تعداد صفحات کم می‌شود و بنابراین می‌توان آن‌ها را راحت‌تر در TLB ذخیره کرد و به این ترتیب نرخ TLB miss کاهش خواهد یافت و شانس اینکه درخواست توسط TLB اجابت شود هم بالاتر می‌رود. (TLB hit)

### پارگی داخلی صفحات
فرایندها  به ندرت از تعداد دقیقی از صفحات استفاده می‌کنند. در نتیجه، آخرین صفحه به‌طور کامل پر نمی‌شود و مقداری از آن به هدر می‌رود. اگر اندازه صفحات بزرگ در نظر گرفته شود، این امکان وجود دارد که حافظه بیشتری از این راه به هدر برود. مثلاً اگر فرایندی ۱۳ کیلوبایت باشد و اندازه هر صفحه هم ۴ کیلوبایت باشد، مجبور هستیم فرایند مورد نظر را در چهار صفحه قرار دهیم که تنها ۱ کیلوبایت از آخرین صفحه استفاده شده و ۳ کیلوبایت آن به هدر رفته و قابل استفاده نیست. هر چه اندازه صفحات کمتر باشد، این اطمینان به وجود می‌آید که فضای کمتری از این راه به هدر برود. مثلاً در مثال قبل اگر اندازه صفحات را دو کیلوبایت در نظر بگیریم، به هفت صفحه نیاز خواهد بود که فقط ۱ کیلوبایت در آخرین صفحه به هدر خواهد رفت.

## تعیین اندازه صفحه
در بیشتر سیستم‌عامل‌ها می‌توان اندازه صفحه را در زمان اجرا بدست آورد. در سیستم‌های شبه یونیکس می‌توان از sysconf() برای این کار استفاده کرد:


```c
#include <stdio.h>
#include <unistd.h> /* sysconf(3) */

int main(void) {
        printf("The page size for this system is %ld bytes.\n",
               sysconf(_SC_PAGESIZE)); /* _SC_PAGE_SIZE is OK too. */

        return 0;
}
```


در سیستم‌عامل‌های مایکروسافت ویندوز هم می‌توان از GetSystemInfo() استفاده کرد:

```c
#include <stdio.h>
#include <windows.h>

int main(void) {
        SYSTEM_INFO si;
        GetSystemInfo(&si);

        printf("The page size for this system is %u bytes.\n", si.dwPageSize);

        return 0;
}
```


## جستارهای وابسته
* حافظه

حافظه فقط خواندنی

حافظه خواندنی-نوشتنی

حافظه فَرّار

حافظه دسترسی تصادفی (به انگلیسی: Random-Access Memory یا RAM)
خاک بر سرش ولش 

حافظه پنهان (به انگلیسی: Cache)

ثبات (به انگلیسی: Register)

حافظه مجازی (به انگلیسی: Virtual Memory)

حافظه فلش (به انگلیسی: Flash Memory)

تقسیم حافظه (به انگلیسی: Memory Segmentation)

حفاظت از حافظه (به انگلیسی: Memory Protection)

## منابع

رده:حافظه مجازی
رده:مدیریت حافظه
رده:واحد پردازشگر مرکزی