If-Koubou

Berapa Banyak Alamat Memori Dapatkah RAM di My Computer Tahan?

Berapa Banyak Alamat Memori Dapatkah RAM di My Computer Tahan? (Bagaimana caranya)

Suatu saat, sangat menyenangkan untuk melihat tingkat permukaan pengalaman komputasi, dan hari-hari lainnya menyenangkan untuk menyelidiki langsung cara kerja bagian dalam. Hari ini kita melihat struktur memori komputer dan berapa banyak barang yang bisa Anda masukkan ke dalam tongkat RAM.

Sesi Tanya & Jawab hari ini hadir untuk memberi kami hak milik SuperUser-sub divisi Stack Exchange, pengelompokan situs web Q & A berbasis komunitas.

Pertanyaan

Pembaca SuperUser Johan Smohan bergulat dengan bagaimana jenis prosesor dan ukuran memori bekerja sama untuk menghasilkan total jumlah 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 adalah sesuatu 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 bilangan bulat adalah lebar 64 bit atau 8 oktet. Tetapi tidak tahu apakah saya memahaminya dengan benar juga.

Ini adalah jenis-jenis pertanyaan yang bisa 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 mereka:

  • Ukuran memori dalam byte
  • Bilangan bulat unsigned terbesar yang dapat disimpan dalam kata mesin CPU

Jawaban panjang dan penjelasan di atas:

Memori terdiri dari byte (B). Setiap byte terdiri dari 8 bit (b).

1 B = 8 b 

1 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 741 824 B 

Setiap byte memori memiliki alamat sendiri, tidak peduli seberapa besar kata mesin CPU. Misalnya. Intel 8086 CPU adalah 16-bit dan itu menangani memori dengan byte, begitu juga CPU 32-bit dan 64-bit modern. Itulah penyebab batas pertama - Anda tidak dapat memiliki lebih banyak alamat daripada byte memori.

Alamat memori hanyalah sejumlah byte yang harus dilewati CPU dari awal memori untuk sampai ke yang dicari.

  • Untuk mengakses byte pertama itu harus melewati 0 byte, jadi alamat byte pertama adalah 0.
  • Untuk mengakses byte kedua itu 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 arti sebenarnya dari 32-bit. Seperti yang saya sebutkan sebelumnya, itu seukuran 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 menyimpan angka. Alamat memori juga angka, 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 sistem biner dan berfungsi seperti itu:

Desimal Biner 0 0000 1 0001 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 1111 

Ia bekerja persis seperti penambahan biasa, tetapi digit maksimumnya adalah 1, bukan 9. Desimal 0 adalah0000, lalu tambahkan 1 dan dapatkan0001, tambahkan sekali lagi dan Anda punya0010. Apa yang terjadi di sini adalah dengan memiliki desimal09 dan menambahkan satu: Anda mengubah 9 hingga 0 dan menambah digit berikutnya.

Dari contoh di atas Anda dapat melihat bahwa selalu ada nilai maksimum yang dapat Anda simpan dalam angka dengan jumlah bit yang konstan - karena ketika semua bit adalah 1 dan Anda mencoba untuk meningkatkan nilai dengan 1, semua bit akan menjadi 0, sehingga memecah jumlah. Ini disebut overflow integer dan menyebabkan banyak masalah yang tidak menyenangkan, baik untuk pengguna dan 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 kemungkinan 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. Itu sebabnya ukuran kata mesin juga membatasi jumlah alamat memori yang tersedia - kadang-kadang CPU Anda tidak dapat memproses angka yang cukup besar untuk mengatasi 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 jumlah kasus spesifik Anda RAM akan menjadi faktor pembatas.

Batas RAM untuk 32-bit CPU secara teoritis 4 GB (2 ^ 32) dan untuk CPU 64-bit itu 16 EB (exabytes, 1 EB = 2 ^ 30 GB). Dengan kata lain, CPU 64-bit dapat mengatasi seluruh Internet ... 200 kali;) (diperkirakan oleh WolframAlpha).

Namun, dalam sistem operasi kehidupan nyata, CPU 32-bit dapat mengatasi 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 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 virtualsegmentasidanpaging.

Memori virtual

Seperti @Daniel R Hicks menunjukkan dalam jawaban lain, OS menggunakan virtual memory. Artinya adalah aplikasi sebenarnya tidak beroperasi pada alamat memori sebenarnya, tetapi yang 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 daripada RAM, tetapi ini bukan masalah serius bagi data yang jarang diakses dan memungkinkan OS untuk menyediakan aplikasi lebih banyak RAM daripada yang sebenarnya Anda pasang.

Pager

Apa yang kita bicarakan sejauh ini disebut skema pengalamatan datar.

Paging adalah skema pengalamatan alternatif yang memungkinkan untuk mengatasi lebih banyak memori yang biasanya Anda dapat dengan satu kata mesin dalam model datar.

Bayangkan sebuah buku yang penuh dengan kata-kata 4 huruf. Katakanlah ada 1024 angka di setiap halaman. Untuk mengatasi suatu nomor, Anda harus mengetahui dua hal:

  • Jumlah halaman tempat kata itu dicetak.
  • Kata mana di halaman itu yang Anda cari.

Sekarang itulah bagaimana CPU x86 modern menangani memori. Ini dibagi menjadi 4 halaman KiB (1024 kata-kata mesin masing-masing) dan halaman-halaman itu memiliki angka. (Sebenarnya halaman juga bisa 4 MiB besar atau 2 MiB dengan PAE). Ketika Anda ingin mengatasi sel memori, Anda memerlukan nomor halaman dan alamat di halaman itu. Perhatikan bahwa setiap sel memori dirujuk oleh tepat satu pasang angka, itu tidak akan menjadi kasus untuk segmentasi.

Segmentasi

Nah, yang ini sangat mirip dengan paging. Itu digunakan di Intel 8086, hanya untuk menyebutkan satu contoh. Kelompok alamat sekarang disebut segmen memori, bukan halaman. Perbedaannya adalah segmen dapat tumpang tindih, dan mereka sering tumpang tindih. Misalnya pada 8086 sebagian besar sel memori tersedia dari 4096 segmen yang berbeda.

Sebuah contoh:

Katakanlah kita memiliki 8 byte memori, semua menahan 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:

 PAGE0 _____ | 0 | | 0 | | 0 | HALAMAN 1 | 255 | _____ ----- | 0 | | 0 | | 0 | | 0 | ----- 

Ilustrasi untuk memori tersegmentasi dengan segmen 4-byte bergeser 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: (menangani dari 0)

  • Segmen 0, offset 3
  • Segmen 1, offset 2
  • Segmen 2, offset 1
  • Segmen 3, offset 0

Sel memori selalu sama.

Dalam segmen implementasi kehidupan nyata digeser oleh lebih dari 1 byte (untuk 8086 itu 16 byte).

Apa yang buruk tentang segmentasi adalah itu rumit (tapi saya pikir Anda sudah tahu itu;) Apa yang baik, adalah bahwa Anda dapat menggunakan beberapa teknik pintar untuk membuat program modular.

Misalnya, Anda dapat memuat beberapa modul ke dalam segmen, kemudian berpura-pura bahwa segmen tersebut lebih kecil daripada yang sebenarnya (cukup kecil untuk menahan modul), lalu pilih segmen pertama yang tidak tumpang tindih dengan pseudo-yang lebih kecil dan muat berikutnya modul, dan sebagainya. Pada dasarnya, apa yang Anda dapatkan dengan cara ini adalah halaman dengan ukuran variabel.

Memiliki sesuatu untuk ditambahkan ke penjelasan? Bicaralah di komentar. Ingin membaca lebih banyak jawaban dari pengguna Stack Exchange yang paham teknologi lainnya? Lihat diskusi lengkap di sini.