Suatu hari nanti sangat menyenangkan untuk melihat tingkat permukaan dari pengalaman komputasi, dan di hari lain menyenangkan untuk mempelajari langsung cara kerjanya. Hari ini kita melihat struktur memori komputer dan seberapa banyak barang yang dapat Anda masukkan ke dalam RAM.
Sesi Tanya & Jawab hari ini hadir atas kebaikan SuperUser — subdivisi Stack Exchange, pengelompokan situs web Tanya Jawab berbasis komunitas.
Pertanyaan
Pembaca SuperUser Johan Smohan sedang bergulat dengan bagaimana jenis prosesor dan ukuran memori bekerja sama untuk menghasilkan sejumlah alamat. Dia menulis:
Berapa banyak alamat memori yang bisa kita dapatkan dengan prosesor 32-bit dan ram 1GB dan berapa banyak dengan prosesor 64-bit?
Saya pikir itu seperti ini:
1GB ram dibagi dengan 32 bit 4 bit (?) Untuk mendapatkan jumlah alamat memori?
Saya membaca di Wikipedia bahwa 1 alamat memori adalah 32 bit lebar atau 4 oktet (1 oktet = 8 bit), dibandingkan dengan prosesor 64 bit di mana 1 alamat memori atau 1 integer adalah 64 bit lebar atau 8 oktet. Tapi saya juga tidak tahu apakah saya memahaminya dengan benar.
Ini adalah jenis pertanyaan yang dapat membuat orang aneh penasaran di malam hari. Berapa banyak alamat yang tersedia di bawah setiap sistem hipotetis Johan?
Jawabannya
Kontributor SuperUser, Gronostaj, menawarkan beberapa wawasan tentang bagaimana RAM dibagi dan digunakan:
Jawaban singkat: Jumlah alamat yang tersedia sama dengan yang lebih kecil dari itu:
- Ukuran memori dalam byte
- Integer unsigned terbesar yang dapat disimpan di mesin word CPU
Jawaban panjang dan penjelasan di atas:
Memori terdiri dari byte (B). Setiap byte terdiri dari 8 bit (b).
1 B = 8 b1 GB RAM sebenarnya 1 GiB (gibibyte, bukan gigabyte). Perbedaannya adalah:
1 GB = 10 ^ 9 B = 1.000.000.000 B 1 GiB = 2 ^ 30 B = 1.073.743.824 BSetiap byte memori memiliki alamatnya sendiri, tidak peduli seberapa besar kata mesin CPU. Misalnya. CPU Intel 8086 adalah 16-bit dan menangani memori per byte, begitu juga CPU 32-bit dan 64-bit modern. Itulah penyebab batas pertama - Anda tidak boleh memiliki lebih banyak alamat daripada byte memori.
Alamat memori hanyalah sejumlah byte yang harus dilewati CPU dari awal memori untuk mendapatkan yang dicari.
- Untuk mengakses byte pertama itu harus melewati 0 byte, jadi alamat byte pertama adalah 0.
- Untuk mengakses byte kedua harus melewati 1 byte, jadi alamatnya adalah 1.
- (Dan seterusnya…)
- Untuk mengakses byte terakhir, CPU melewatkan 1073741823 byte, jadi alamatnya adalah 1073741823.
Sekarang Anda harus tahu apa sebenarnya arti 32-bit. Seperti yang saya sebutkan sebelumnya, ini adalah ukuran kata mesin.
Kata mesin adalah jumlah memori yang digunakan CPU untuk menyimpan angka (dalam RAM, cache, atau register internal). CPU 32-bit menggunakan 32 bit (4 byte) untuk menampung angka. Alamat memori adalah angka juga, jadi pada CPU 32-bit alamat memori terdiri dari 32 bit.
Sekarang pikirkan tentang ini: jika Anda memiliki satu bit, Anda dapat menyimpan dua nilai di atasnya: 0 atau 1. Tambahkan satu bit lagi dan Anda memiliki empat nilai: 0, 1, 2, 3. Pada tiga bit, Anda dapat menyimpan delapan nilai : 0, 1, 2… 6, 7. Ini sebenarnya adalah sistem biner dan bekerja seperti itu:
Desimal Biner 0 0000 10001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 10 1010 11 1011 12 1100 13 1101 14 1110 15 1111Ini berfungsi persis seperti penjumlahan biasa, tetapi digit maksimumnya adalah 1, bukan 9. Desimal 0 adalah
0000, lalu tambahkan 1 dan dapatkan0001, tambahkan satu kali lagi dan Anda sudah0010. Apa yang terjadi di sini seperti memiliki desimal09dan menambahkan satu: Anda mengubah 9 menjadi 0 dan menambah digit berikutnya.Dari contoh di atas, Anda dapat melihat bahwa selalu ada nilai maksimum yang dapat Anda pertahankan dalam bilangan dengan jumlah bit konstan - karena ketika semua bit adalah 1 dan Anda mencoba meningkatkan nilainya dengan 1, semua bit akan menjadi 0, sehingga memutus jumlah. Ini disebut integer overflow dan menyebabkan banyak masalah yang tidak menyenangkan, baik bagi pengguna maupun pengembang.
11111111 = 255 + 1 ----------- 100000000 = 0 (9 bit di sini, jadi 1 dipangkas)
- Untuk 1 bit, nilai terbesar adalah 1,
- 2 bit - 3,
- 3 bit - 7,
- 4 bit - 15
Jumlah terbesar selalu 2 ^ N-1, di mana N adalah jumlah bit. Seperti yang saya katakan sebelumnya, alamat memori adalah angka dan juga memiliki nilai maksimum. Itulah sebabnya ukuran kata mesin juga menjadi batasan untuk jumlah alamat memori yang tersedia - terkadang CPU Anda tidak dapat memproses angka yang cukup besar untuk menangani lebih banyak memori.
Jadi pada 32 bit Anda dapat menyimpan angka dari 0 hingga 2 ^ 32-1, dan itu adalah 4 294 967 295. Ini lebih dari alamat terbesar dalam 1 GB RAM, jadi dalam kasus spesifik Anda jumlah RAM akan menjadi faktor pembatas.
Batas RAM untuk CPU 32-bit secara teoritis adalah 4 GB (2 ^ 32) dan untuk CPU 64-bit adalah 16 EB (exabyte, 1 EB = 2 ^ 30 GB). Dengan kata lain, CPU 64-bit dapat menangani seluruh Internet… 200 kali;) (diperkirakan oleh WolframAlpha ).
Namun, dalam sistem operasi kehidupan nyata, CPU 32-bit dapat menangani sekitar 3 GiB RAM. Itu karena arsitektur internal sistem operasi - beberapa alamat dicadangkan untuk tujuan lain. Anda dapat membaca lebih lanjut tentang apa yang disebut ini Penghalang 3 GB di Wikipedia . Anda dapat mengangkat batas ini dengan Ekstensi Alamat Fisik .
Berbicara tentang pengalamatan memori, ada beberapa hal yang harus saya sebutkan: memori virtual , segmentasi dan paging .
Memori virtual
Seperti yang ditunjukkan @Daniel R Hicks dalam jawaban lain, OS menggunakan memori virtual. Artinya adalah aplikasi sebenarnya tidak beroperasi pada alamat memori yang sebenarnya, tetapi disediakan oleh OS.
Teknik ini memungkinkan sistem operasi untuk memindahkan beberapa data dari RAM ke apa yang disebut Pagefile (Windows) atau Swap (* NIX). HDD sedikit lebih lambat dari RAM, tetapi ini bukan masalah serius untuk data yang jarang diakses dan memungkinkan OS menyediakan aplikasi lebih banyak RAM daripada yang sebenarnya Anda instal.
Paging
Apa yang kita bicarakan sejauh ini disebut skema pengalamatan datar.
Paging adalah skema pengalamatan alternatif yang memungkinkan untuk menangani lebih banyak memori yang biasanya Anda dapat dengan satu kata mesin dalam model datar.
Bayangkan sebuah buku yang diisi dengan kata-kata 4 huruf. Misalkan ada 1024 nomor di setiap halaman. Untuk menangani sebuah nomor, Anda harus mengetahui dua hal:
- Jumlah halaman di mana kata itu dicetak.
- Kata mana di halaman itu yang Anda cari.
Begitulah cara CPU x86 modern menangani memori. Ini dibagi menjadi 4 halaman KiB (masing-masing 1024 kata mesin) dan halaman tersebut memiliki angka. (sebenarnya halaman juga bisa berukuran 4 MiB besar atau 2 MiB dengan PAE ). Ketika Anda ingin menangani sel memori, Anda memerlukan nomor halaman dan alamat di halaman itu. Perhatikan bahwa setiap sel memori direferensikan oleh tepat sepasang angka, itu tidak akan menjadi kasus untuk segmentasi.
Segmentasi
Nah, yang satu ini sangat mirip dengan paging. Itu digunakan di Intel 8086, hanya untuk menyebutkan satu contoh. Grup alamat sekarang disebut segmen memori, bukan halaman. Perbedaannya adalah segmen dapat tumpang tindih, dan memang banyak tumpang tindih. Misalnya pada 8086 sebagian besar sel memori tersedia dari 4096 segmen berbeda.
Sebuah contoh:
Katakanlah kita memiliki memori 8 byte, semua memegang nol kecuali untuk byte ke-4 yang sama dengan 255.
Ilustrasi untuk model memori datar:
_____ | 0 | | 0 | | 0 | | 255 | | 0 | | 0 | | 0 | | 0 | -----Ilustrasi untuk memori paged dengan halaman 4-byte:
HALAMAN0 _____ | 0 | | 0 | | 0 | HALAMAN 1 | 255 | _____ ----- | 0 | | 0 | | 0 | | 0 | -----Ilustrasi untuk memori tersegmentasi dengan segmen 4-byte digeser 1:
SEG 0 _____ SEG 1 | 0 | _____ SEG 2 | 0 | | 0 | _____ SEG 3 | 0 | | 0 | | 0 | _____ SEG 4 | 255 | | 255 | | 255 | | 255 | _____ SEG 5 ----- | 0 | | 0 | | 0 | | 0 | _____ SEG 6 ----- | 0 | | 0 | | 0 | | 0 | _____ SEG 7 ----- | 0 | | 0 | | 0 | | 0 | _____ ----- | 0 | | 0 | | 0 | | 0 | ----- ----- ----- -----Seperti yang Anda lihat, byte ke-4 dapat diatasi dengan empat cara: (pengalamatan dari 0)
- Segmen 0, offset 3
- Segmen 1, offset 2
- Segmen 2, offset 1
- Segmen 3, offset 0
Sel memori itu selalu sama.
Dalam implementasi kehidupan nyata, segmen digeser lebih dari 1 byte (untuk 8086 itu 16 byte).
Yang buruk tentang segmentasi adalah rumit (tapi saya pikir Anda sudah tahu itu;) Yang bagus, adalah Anda dapat menggunakan beberapa teknik pintar untuk membuat program modular.
Misalnya, Anda dapat memuat beberapa modul ke dalam satu segmen, lalu menganggap segmen tersebut lebih kecil dari yang sebenarnya (cukup kecil untuk menampung modul), lalu pilih segmen pertama yang tidak tumpang tindih dengan segmen semu dan muat berikutnya modul, dan sebagainya. Pada dasarnya, yang Anda dapatkan dengan cara ini adalah halaman berukuran variabel.
Punya sesuatu untuk ditambahkan ke penjelasannya? Suarakan di komentar. Ingin membaca lebih banyak jawaban dari pengguna Stack Exchange yang paham teknologi? Lihat utas diskusi lengkap di sini .