Subsistem memori pada prosesor modern dibatasi untuk mengakses memori pada rincian dan keselarasan ukuran kata-katanya; hal ini terjadi karena sejumlah alasan.
Mempercepat
Prosesor modern memiliki beberapa tingkat memori cache yang harus ditarik data; mendukung pembacaan byte tunggal akan membuat throughput subsistem memori terikat erat dengan throughput unit eksekusi (alias cpu-terikat); ini semua mengingatkan bagaimana mode PIO dilampaui oleh DMA karena banyak alasan yang sama pada hard drive.
CPU selalu membaca pada ukuran kata (4 byte pada prosesor 32-bit), jadi ketika Anda melakukan akses alamat yang tidak selaras - pada prosesor yang mendukungnya - prosesor akan membaca beberapa kata. CPU akan membaca setiap kata dari memori yang dialamatkan oleh alamat yang Anda minta. Ini menyebabkan amplifikasi hingga 2X jumlah transaksi memori yang diperlukan untuk mengakses data yang diminta.
Karena itu, dapat dengan mudah menjadi lebih lambat untuk membaca dua byte daripada empat. Misalnya, Anda memiliki struct dalam memori yang terlihat seperti ini:
struct mystruct {
char c; // one byte
int i; // four bytes
short s; // two bytes
}
Pada prosesor 32-bit kemungkinan besar akan diselaraskan seperti yang ditunjukkan di sini:
Prosesor dapat membaca masing-masing anggota ini dalam satu transaksi.
Katakanlah Anda memiliki versi struct yang dikemas, mungkin dari jaringan di mana ia dikemas untuk efisiensi transmisi; mungkin terlihat seperti ini:
Membaca byte pertama akan sama.
Ketika Anda meminta prosesor untuk memberi Anda 16 bit dari 0x0005 itu harus membaca kata dari dari 0x0004 dan bergeser ke kiri 1 byte untuk menempatkannya dalam register 16-bit; beberapa pekerjaan tambahan, tetapi sebagian besar dapat mengatasinya dalam satu siklus.
Ketika Anda meminta 32 bit dari 0x0001 Anda akan mendapatkan amplifikasi 2X. Prosesor akan membaca dari 0x0000 ke dalam register hasil dan bergeser ke kiri 1 byte, kemudian membaca lagi dari 0x0004 ke dalam register sementara, menggeser ke kanan 3 byte, kemudian OR
dengan register hasil.
Jarak
Untuk setiap ruang alamat yang diberikan, jika arsitektur dapat mengasumsikan bahwa 2 LSB selalu 0 (misalnya, mesin 32-bit) maka ia dapat mengakses memori 4 kali lebih banyak (2 bit yang disimpan dapat mewakili 4 keadaan berbeda), atau jumlah yang sama memori dengan 2 bit untuk sesuatu seperti bendera. Melepaskan 2 LSB dari suatu alamat akan memberi Anda keselarasan 4-byte; juga disebut sebagai langkah 4 byte. Setiap kali sebuah alamat bertambah maka secara efektif menambah bit 2, bukan bit 0, yaitu, 2 bit terakhir akan selalu terus menjadi 00
.
Ini bahkan dapat mempengaruhi desain fisik sistem. Jika bus alamat membutuhkan 2 bit lebih sedikit, mungkin ada 2 pin lebih sedikit pada CPU, dan 2 jejak lebih sedikit pada papan sirkuit.
Atomicity
CPU dapat beroperasi pada kata memori yang selaras secara atom, artinya tidak ada instruksi lain yang dapat mengganggu operasi itu. Ini sangat penting untuk operasi yang benar dari banyak struktur data bebas kunci dan paradigma konkurensi lainnya .
Kesimpulan
Sistem memori prosesor agak sedikit lebih kompleks dan terlibat daripada yang dijelaskan di sini; diskusi tentang bagaimana prosesor x86 sebenarnya menangani memori dapat membantu (banyak prosesor bekerja dengan cara yang sama).
Ada banyak manfaat lainnya untuk mematuhi penyelarasan memori yang dapat Anda baca di artikel IBM ini .
Penggunaan utama komputer adalah mengubah data. Arsitektur dan teknologi memori modern telah dioptimalkan selama beberapa dekade untuk memfasilitasi mendapatkan lebih banyak data, masuk, keluar, dan antara unit eksekusi lebih banyak dan lebih cepat - dengan cara yang sangat andal.
Bonus: Tembolok
Penyelarasan-untuk-kinerja lain yang saya singgung sebelumnya adalah penyelarasan pada garis cache yang (misalnya, pada beberapa CPU) 64B.
Untuk info lebih lanjut tentang berapa banyak kinerja yang bisa diperoleh dengan memanfaatkan cache, lihat Galeri Efek Cache Prosesor ; dari pertanyaan ini tentang ukuran cache-line
Memahami garis cache bisa penting untuk beberapa jenis optimasi program. Misalnya, penyelarasan data dapat menentukan apakah suatu operasi menyentuh satu atau dua garis cache. Seperti yang kita lihat pada contoh di atas, ini dapat dengan mudah berarti bahwa dalam kasus yang tidak selaras, operasi akan dua kali lebih lambat.