Laman » bagaimana untuk » Berapa Banyak Alamat Memori Bolehkah RAM dalam Komputer Saya Pegang?

    Berapa Banyak Alamat Memori Bolehkah RAM dalam Komputer Saya Pegang?

    Di suatu hari, ia menyeronokkan untuk melihat tahap permukaan pengalaman pengkomputeran, dan hari-hari lain ia menyeronokkan untuk menyelidiki hak ke dalam kerja dalaman. Hari ini kita melihat struktur memori komputer dan betapa banyak perkara yang anda boleh bungkus ke dalam tongkat RAM.

    Sesi Soalan & Jawapan hari ini datang kepada kami dengan ihsan SuperUser-bahagian pembahagian Stack Exchange, kumpulan yang diketuai oleh komuniti laman web Q & A.

    Soalan

    Pembaca SuperUser Johan Smohan bergulat dengan cara bagaimana jenis pemproses dan saiz memori berfungsi bersama untuk menghasilkan sejumlah alamat. Dia menulis:

    Berapa banyak alamat memori yang boleh kita peroleh dengan pemproses 32-bit dan ram 1GB dan berapa banyak dengan pemproses 64-bit?

    Saya fikir ia seperti ini:

    1GB ram yang dibahagikan dengan 32 bit 4 bit (?) Untuk mendapatkan bilangan alamat memori?

    Saya membaca di Wikipedia bahawa 1 alamat memori adalah 32 bit lebar atau 4 oktet (1 octet = 8 bit), berbanding dengan pemproses 64 bit di mana 1 alamat memori atau 1 integer adalah 64 bit lebar atau 8 oktet. Tetapi tidak tahu sama ada saya memahami dengan betul sama ada.

    Ini adalah jenis soalan yang boleh membuat geek ingin tahu pada waktu malam. Berapa banyak alamat yang terdapat di bawah setiap sistem hipotesis Johan?

    Jawapan

    Penyumbang SuperUser Gronostaj menawarkan beberapa pandangan tentang bagaimana RAM dibahagikan dan digunakan:

    Jawapan pendek: Bilangan alamat yang ada bersamaan dengan yang lebih kecil daripada yang berikut:

    • Saiz memori dalam bait
    • Integer unsigned yang paling besar yang boleh disimpan dalam perkataan mesin CPU

    Jawapan panjang dan penjelasan di atas:

    Memori terdiri daripada bait (B). Setiap bait terdiri daripada 8 bit (b).

    1 B = 8 b 

    1 GB RAM sebenarnya 1 GiB (gibibyte, tidak gigabyte). Perbezaannya ialah:

    1 GB = 10 ^ 9 B = 1 000 000 000 B 1 GiB = 2 ^ 30 B = 1 073 741 824 B 

    Setiap bait memori mempunyai alamatnya sendiri, tidak kira berapa besar mesin mesin CPU itu. Contohnya. Intel 8086 CPU adalah 16-bit dan ia menangani memori oleh bait, jadi juga CPU 32-bit dan 64-bit moden. Itulah punca had pertama - anda tidak boleh mempunyai lebih banyak alamat daripada bait ingatan.

    Alamat ingatan hanya beberapa bait CPU harus melangkau dari permulaan ingatan untuk sampai ke halaman yang dicari.

    • Untuk mengakses bait pertama, ia harus melangkau 0 byte, jadi alamat byte pertama ialah 0.
    • Untuk mengakses bait kedua, ia harus melangkau 1 byte, jadi alamatnya adalah 1.
    • (dan sebagainya… )
    • Untuk mengakses byte terakhir, CPU melangkau 1073741823 byte, jadi alamatnya 1073741823.

    Sekarang anda perlu tahu apa artinya 32-bit. Seperti yang saya nyatakan sebelum ini, ia adalah ukuran perkataan mesin.

    Perkataan mesin adalah jumlah penggunaan CPU memori untuk memegang nombor (dalam RAM, cache atau daftar dalaman). CPU 32-bit menggunakan 32 bit (4 bait) untuk memegang nombor. Alamat memori juga nombor, jadi pada CPU 32-bit alamat memori terdiri daripada 32 bit.

    Sekarang fikirkan ini: jika anda mempunyai satu bit, anda boleh menyimpan dua nilai di atasnya: 0 atau 1. Tambah satu lagi bit dan anda mempunyai empat nilai: 0, 1, 2, 3. Pada tiga bit, anda boleh menyimpan lapan nilai : 0, 1, 2 ... 6, 7. Ini sebenarnya sistem binari dan berfungsi 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 11 1011 12 1100 13 1101 14 1110 15 1111 

    Ia berfungsi sama seperti penambahan biasa, tetapi digit maksimum ialah 1, bukan 9. Decimal 0 adalah 0000, maka anda menambah 1 dan dapatkan 0001, tambah satu lagi dan anda ada 0010. Apa yang berlaku di sini adalah seperti mempunyai perpuluhan 09 dan menambah satu: anda menukar 9 hingga 0 dan menambah angka berikutnya.

    Daripada contoh di atas, anda dapat melihat bahawa selalu ada nilai maksimum yang boleh anda simpan dalam bilangan dengan bilangan bit yang tetap - kerana apabila semua bit adalah 1 dan anda cuba meningkatkan nilai sebanyak 1, semua bit akan menjadi 0, sehingga memecahkan nombor. Ia dipanggil limpahan integer dan menyebabkan banyak masalah yang tidak menyenangkan, baik untuk pengguna dan pemaju.

     11111111 = 255 + 1 ----------- 100000000 = 0 (9 bit di sini, jadi 1 dipotong) 
    • Untuk 1 bit nilai terbesar ialah 1,
    • 2 bit - 3,
    • 3 bit - 7,
    • 4 bit - 15

    Nombor yang paling mungkin ialah 2 ^ N-1, di mana N adalah bilangan bit. Seperti yang saya katakan sebelumnya, alamat memori adalah nombor dan ia juga mempunyai nilai maksimum. Itulah sebabnya saiz kata mesin juga had untuk bilangan alamat memori yang ada - kadang-kadang CPU anda tidak boleh memproses nombor yang cukup besar untuk mengatasi lebih banyak memori.

    Jadi pada 32 bit, anda boleh menyimpan nombor dari 0 hingga 2 ^ 32-1, dan itulah 4 294 967 295. Ia lebih daripada alamat terbesar dalam 1 GB RAM, jadi dalam jumlah kes tertentu RAM anda akan menjadi faktor pembatas.

    Had RAM untuk CPU 32-bit secara teorinya ialah 4 GB (2 ^ 32) dan untuk CPU 64-bit ia adalah 16 EB (exabytes, 1 EB = 2 ^ 30 GB). Dengan kata lain, CPU 64-bit boleh menangani seluruh Internet ... 200 kali;) (dianggarkan oleh WolframAlpha).

    Walau bagaimanapun, dalam sistem operasi sebenar 32-bit CPU boleh menangani kira-kira 3 GiB RAM. Itu kerana seni bina dalaman sistem operasi - beberapa alamat dikhaskan untuk tujuan lain. Anda boleh membaca lebih lanjut mengenai halangan yang dipanggil 3 GB ini di Wikipedia. Anda boleh mengangkat had ini dengan Extension Address Physical.

    Bercakap mengenai alamat memori, ada beberapa perkara yang perlu saya sebutkan: memori mayasegmentasi dan paging.

    Memori maya

    Sebagai @Daniel R Hicks menegaskan dalam jawapan yang lain, OS menggunakan memori maya. Apa yang dimaksudkan ialah aplikasi sebenarnya tidak beroperasi pada alamat memori sebenar, tetapi yang disediakan oleh OS.

    Teknik ini membolehkan sistem pengendalian untuk memindahkan beberapa data dari RAM ke Pagefile (Windows) atau Swap (* NIX) yang dipanggil. HDD adalah sedikit magnitud yang lebih perlahan daripada RAM, tetapi ia bukan masalah yang serius untuk data yang jarang diakses dan ia membolehkan OS untuk menyediakan aplikasi lebih banyak RAM daripada yang sebenarnya telah dipasang.

    Paging

    Apa yang kita bincangkan sejauh ini dipanggil skema pengalamatan yang rata.

    Paging adalah skema penyelesaian alternatif yang membolehkan anda menangani lebih banyak memori yang biasanya anda dapat dengan satu perkataan mesin dalam model datar.

    Bayangkan sebuah buku yang diisi dengan 4 huruf. Katakan 1024 nombor pada setiap halaman. Untuk menangani nombor, anda perlu mengetahui dua perkara:

    • Bilangan halaman di mana perkataan itu dicetak.
    • Perkataan di halaman itu adalah yang anda cari.

    Kini itulah bagaimana CPU x86 moden mengendalikan memori. Ia dibahagikan kepada 4 halaman KiB (1024 perkataan mesin setiap) dan halaman tersebut mempunyai nombor. (sebenarnya halaman juga boleh 4 MiB besar atau 2 MiB dengan PAE). Apabila anda ingin alamat sel memori, anda memerlukan nombor halaman dan alamat di halaman itu. Perhatikan bahawa setiap sel memori dirujuk dengan tepat sepasang nombor, yang tidak akan berlaku untuk segmentasi.

    Segmentation

    Nah, yang ini agak serupa dengan paging. Ia digunakan dalam Intel 8086, hanya untuk menamakan satu contoh. Kumpulan alamat kini dipanggil segmen memori, bukan halaman. Perbezaannya adalah segmen yang boleh bertindih, dan mereka banyak bertindih. Contohnya pada 8086 sel-sel memori yang paling banyak terdapat dari 4096 segmen yang berbeza.

    Satu contoh:

    Katakan kita mempunyai 8 byte memori, semua memegang sifar kecuali untuk 4 byte yang bersamaan dengan 255.

    Ilustrasi untuk model memori rata:

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

    Ilustrasi untuk ingatan paged dengan halaman 4-bait:

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

    Ilustrasi untuk memori yang dibahagian dengan segmen 4-bait beralih sebanyak 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 4 boleh dialamatkan dalam empat cara: (mengalamatkan dari 0)

    • Segmen 0, diimbangi 3
    • Segmen 1, mengimbangi 2
    • Segmen 2, diimbangi 1
    • Segmen 3, mengimbangi 0

    Ia sentiasa sel memori yang sama.

    Dalam segmen pelaksanaan kehidupan sebenar ditukar dengan lebih dari 1 bait (untuk 8086 ia adalah 16 bait).

    Apa yang buruk tentang segmentasi adalah bahawa ia rumit (tetapi saya fikir anda sudah tahu itu;) Apa yang baik, adakah anda boleh menggunakan beberapa teknik pintar untuk membuat program modular.

    Sebagai contoh, anda boleh memuatkan beberapa modul ke dalam segmen, kemudian berpura-pura segmen lebih kecil daripada yang sebenarnya (hanya cukup kecil untuk memegang modul), kemudian pilih segmen pertama yang tidak bertindih dengan satu yang lebih kecil dan beban berikutnya modul, dan sebagainya. Pada dasarnya, apa yang anda dapatkan dengan cara ini adalah muka surat saiz berubah.


    Mempunyai sesuatu untuk menambah penjelasannya? Bunyi dalam komen. Ingin membaca lebih banyak jawapan dari pengguna Stack Exchange yang berteknologi tinggi? Lihat thread perbincangan penuh di sini.