20Aug

Berapa Banyak Alamat Memori Bisakah RAM di Komputer Saya Tahan?

Suatu hari sangat menyenangkan untuk melihat tingkat permukaan pengalaman komputasi, dan hari-hari lain, sangat menyenangkan untuk menyelidiki langsung ke inner pekerjaan. Hari ini kita melihat struktur memori komputer dan berapa banyak barang yang bisa Anda kumpulkan ke dalam setumpuk RAM.

Pertanyaan Hari Ini &Sesi jawaban datang kepada kami atas izin SuperUser - subdivisi dari Stack Exchange, pengelompokan berbasis komunitas dari Q & A situs web.

Pertanyaan

Pembaca superuser Johan Smohan 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 berpikir bahwa ini 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 berukuran 32 bit atau 4 oktet( 1 oktet = 8 bit), dibandingkan prosesor 64 bit dimana 1 alamat memori atau 1 bilangan bulat 64 bit atau 8 oktet. Tapi saya juga tidak tahu apakah saya memahaminya dengan benar.

Ini adalah jenis pertanyaan yang bisa membuat geek penasaran di malam hari. Berapa banyak alamat yang tersedia di bawah masing-masing sistem hipotesa Johan?

Jawaban

Kontributor SuperUser Gronostaj menawarkan beberapa wawasan tentang bagaimana RAM dibagi dan digunakan:

Jawaban singkat: Jumlah alamat yang tersedia sama dengan yang lebih kecil:

  • Ukuran memori dalam byte
  • bilangan bulat unsigned terbesar yang dapat disimpanDalam 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 RAM

1 GB sebenarnya 1 GiB( gibibyte, tidak 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 alamatnya sendiri, tidak peduli seberapa besar kata mesin CPU.Misalnya. Intel 8086 CPU adalah 16-bit dan itu menangani memori oleh byte, jadi lakukan CPU 32-bit dan 64-bit modern. Itulah penyebab dari batas pertama - Anda tidak dapat memiliki lebih banyak alamat daripada byte memori.

Alamat memori hanya sejumlah byte yang harus dilompati CPU dari awal memori untuk sampai ke yang dicari.

  • Untuk mengakses byte pertama ia harus melewati 0 byte, jadi alamat byte pertama adalah 0.
  • Untuk mengakses byte kedua ia harus melewati 1 byte, jadi alamatnya adalah 1.
  • ( dan seterusnya. ..)
  • Untuk mengaksesbyte terakhir, CPU melompat 1073741823 bytes, jadi alamatnya adalah 1073741823.

Sekarang Anda harus tahu apa sebenarnya arti 32-bit itu. Seperti yang saya sebutkan sebelumnya, itu seukuran kata mesin.

Kata mesin adalah jumlah memori yang digunakan CPU untuk menyimpan nomor( dalam RAM, cache atau register internal).CPU 32-bit menggunakan 32 bit( 4 byte) untuk menampung angka. Alamat memori juga angka, jadi pada CPU 32-bit, alamat memori terdiri dari 32 bit.

Sekarang pikirkan 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 delapannilai: 0, 1, 2. .. 6, 7. Ini sebenarnya adalah sistem biner dan bekerja seperti itu:

Binary Decimal 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 10 1010 111011 12 1100 13 1101 14 1110 15 1111

Ini bekerja persis seperti penambahan biasa, namun angka maksimumnya adalah 1, bukan 9. Desimal 0 adalah 0000, maka Anda menambahkan 1 dan mendapatkan 0001, menambahkannya sekali lagi dan Anda memiliki 0010. Apahappend di sini adalah seperti dengan memiliki desimal 09 dan menambahkan satu: Anda mengubah 9 sampai 0 dan kenaikan digit berikutnya.

Dari contoh di atas Anda dapat melihat bahwa selalu ada nilai maksimum yang dapat Anda simpan dalam jumlah dengan jumlah bit konstan - karena bila semua bit 1 dan Anda mencoba untuk meningkatkan nilai sebesar 1, semua bit akan menjadi 0, sehingga melanggarnomor. Ini disebut integer overflow 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 terbesar mungkin adalah 2 ^ N-1, di mana N adalah jumlah bit. Seperti yang saya katakan sebelumnya, alamat memori adalah nomor dan juga memiliki nilai maksimal. Itu sebabnya ukuran kata mesin juga merupakan batas 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 sampai 2 ^ 32-1, dan itu adalah 4 294 967 295. Ini lebih dari alamat terbesar dalam RAM 1 GB, jadi dalam jumlah kasus spesifik RAM Anda akan menjadi faktor pembatas.

Batas RAM untuk CPU 32-bit secara teoritis 4 GB( 2 ^ 32) dan untuk CPU 64-bit itu adalah 16 EB( exabyte, 1 EB = 2 ^ 30 GB).Dengan kata lain, CPU 64-bit bisa menangani keseluruhan Internet. .. 200 kali;)( diperkirakan olehWolframAlpha).

Namun, dalam sistem operasi real-time, CPU 32-bit dapat menangani sekitar 3 GiB RAM.Itu karena arsitektur internal sistem operasi - beberapa alamat disediakan untuk tujuan lain. Anda bisa membaca lebih lanjut tentang penghalang 3 GB di Wikipedia ini. Anda bisa mengangkat batas ini dengan Physical Address Extension.

Berbicara tentang pengalamatan memori, ada beberapa hal yang harus saya sebutkan: memori virtual , segmentasi dan paging .

Memori virtual

Seperti @Daniel R Hicks menunjukkan jawaban yang lain, OS menggunakan memori virtual. Apa artinya aplikasi itu sebenarnya tidak beroperasi pada alamat memori sebenarnya, tapi yang disediakan oleh OS.

Teknik ini memungkinkan sistem operasi memindahkan beberapa data dari RAM ke yang disebut Pagefile( Windows) atau Swap( * NIX).HDD sedikit lebih lambat dari RAM, tapi ini bukan masalah serius untuk data yang jarang diakses dan ini memungkinkan OS menyediakan RAM lebih dari yang sebenarnya Anda instal.

Pager

Apa yang sedang kita bicarakan sejauh ini disebut skema pengalamatan datar.

Pager adalah skema pengalamatan alternatif yang memungkinkan untuk menangani lebih banyak memori yang biasanya Anda bisa dengan satu kata mesin dalam model datar.

Bayangkan sebuah buku berisi kata-kata 4 huruf. Misalkan ada 1024 nomor pada setiap halaman. Untuk mengatasi nomor, Anda harus mengetahui dua hal:

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

Nah, itulah cara CPU x86 modern menangani memori. Ini dibagi menjadi 4 halaman KiB( masing-masing kata mesin 1024) dan halaman-halaman itu memiliki angka.(sebenarnya halaman juga bisa berukuran 4 MiB besar atau 2 MiB dengan PAE).Bila Anda ingin alamat sel memori, Anda memerlukan nomor halaman dan alamat di halaman itu. Perhatikan bahwa setiap sel memori direferensikan dengan tepat satu pasang angka, yang tidak akan menjadi kasus segmentasi.

Segmentation

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

Contoh:

Misalkan kita memiliki 8 byte memori, semua memegang angka nol kecuali byte ke 4 yang sama dengan 255.

Ilustrasi untuk model memori datar:

_____ |0 ||0 ||0 ||255 ||0 ||0 ||0 ||0 |-----

Ilustrasi untuk memori paging dengan halaman 4-byte:

PAGE0 _____ |0 ||0 ||0 |PAGE1 |255 |_____ ----- |0 ||0 ||0 ||0 |-----

Ilustrasi untuk memori tersegmentasi dengan segmen 4-byte digeser oleh 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

Selalu sel memori yang sama.

Dalam segmen implementasi real-life digeser lebih dari 1 byte( untuk 8086 itu adalah 16 byte).

Apa yang buruk tentang segmentasi adalah rumitnya hal itu( tapi saya pikir Anda sudah tahu itu;) Apa yang baik, apakah Anda dapat menggunakan beberapa teknik cerdas untuk membuat program modular.

Misalnya, Anda dapat memuat beberapa modul ke dalam segmen, lalu berpura-pura segmen lebih kecil dari yang sebenarnya( cukup kecil untuk menampung modul), lalu pilih segmen pertama yang tidak tumpang tindih dengan yang pseudo-lebih kecil dan bebanmodul berikutnya, dan seterusnya. Pada dasarnya, apa yang Anda dapatkan dengan cara ini adalah halaman dengan ukuran variabel.

Punya sesuatu untuk ditambahkan ke penjelasan? Terdengar dalam komentar. Ingin membaca lebih banyak jawaban dari pengguna Stack Exchange tech-savvy lainnya? Simak thread diskusi selengkapnya disini.