Anasayfa » nasıl » Bilgisayarımdaki RAM Kaç Bellek Adresini Tutabilir?

    Bilgisayarımdaki RAM Kaç Bellek Adresini Tutabilir?

    Bazı günlerde bilgisayar deneyiminin yüzey seviyesine bakmak eğlencelidir, diğer günlerde ise doğrudan iç çalışmalara dalmak eğlencelidir. Bugün, bilgisayar belleğinin yapısına ve RAM belleğe ne kadar paketleyebileceğinize bir göz atıyoruz..

    Bugünün Soru ve Cevap oturumu bize topluluk tarafından yönlendirilen bir soru-cevap web sitesi grubu olan Stack Exchange'in bir alt birimi olan SuperUser'ın izniyle geliyor..

    Soru

    SuperUser okuyucu Johan Smohan, toplam adres sayısını vermek için işlemci tipi ve bellek boyutunun birlikte nasıl çalıştığını anlatıyor. O yazıyor:

    32 bit işlemci ve 1GB ram ile kaç bellek adresini ve 64 bit işlemci ile kaç tane bellek adresini bulabiliriz?

    Bunun gibi bir şey olduğunu düşünüyorum:

    1GB RAM, bellek adreslerinin sayısını bulmak için 32 bit 4 bit (?) İle bölünür.?

    Wikipedia'da 1 bellek adresinin 32 bit genişliğinde veya 4 oktet (1 oktet = 8 bit) olduğunu, 1 bellek adreslerinin veya 1 tamsayının 64 bit genişliğinde veya 8 oktet olduğu 64 bit işlemci ile karşılaştırıldığında olduğunu okudum. Ama doğru anlamış mıyım, bilmiyorum.

    Bunlar gece meraklı bir meraklı tutabilecek türden sorulardır. Johan'ın hipotetik sistemlerinin her birinde kaç adres bulunur?

    Cevap

    Süper Kullanıcı Katkıda Bulunan Gronostaj, RAM'in nasıl bölündüğü ve kullanıldığı hakkında bazı bilgiler sunuyor:

    Kısa cevap: Kullanılabilir adreslerin sayısı, bunlardan daha küçük olanlara eşittir:

    • Bayt cinsinden bellek boyutu
    • CPU'nun makine kelimesine kaydedilebilecek en büyük işaretsiz tam sayı

    Uzun cevap ve yukarıdakilerin açıklaması:

    Bellek bayttan (B) oluşur. Her bayt 8 bitten oluşur (b).

    1 B = 8 b 

    1 GB RAM aslında 1 GiB'dir (gibibit, gigabayt değil). Fark:

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

    CPU makine kelimesi ne kadar büyük olursa olsun, hafızanın her bir baytının kendi adresi vardır. Örneğin. Intel 8086 CPU 16-bit ve bayt tarafından belleğe yönelikti, bu nedenle modern 32-bit ve 64-bit CPU'lar da vardı. İlk sınırın nedeni budur - bellek baytlarından daha fazla adres alamazsınız..

    Hafıza adresi, CPU'nun aradığı adrese ulaşmak için hafızanın başından itibaren atlaması gereken sadece bir bayt sayısıdır..

    • İlk bayta erişmek için 0 bayt atlaması gerekir, bu nedenle ilk baytın adresi 0 olur..
    • İkinci byte'a erişmek için 1 byte atlaması gerekir, yani adresi 1'dir..
    • (ve diğerleri…)
    • Son bayta erişmek için CPU 1073741823 bayt atlar, dolayısıyla adresi 1073741823.

    Şimdi 32 bit'in gerçekte ne anlama geldiğini bilmek zorundasınız. Daha önce de belirttiğim gibi, makine kelimesi büyüklüğü.

    Makine kelimesi, sayıların tutulması için kullanılan bellek miktarını ifade eder (RAM, önbellek veya dahili kayıtlarda). 32 bit CPU, sayıları tutmak için 32 bit (4 bayt) kullanır. Bellek adresleri de sayılardır, bu nedenle 32 bit CPU'da bellek adresi 32 bit içerir.

    Şimdi şunu düşünün: Bir bitiniz varsa, üzerine iki değer kaydedebilirsiniz: 0 veya 1. Bir bit daha ekleyin ve dört değeriniz vardır: 0, 1, 2, 3. Üç bitte, sekiz değer kaydedebilirsiniz : 0, 1, 2… 6, 7. Bu aslında bir ikili sistemdir ve şöyle çalışır:

    İkili Ondalık 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 

    Tam olarak normal ekleme gibi çalışır, ancak en fazla sayı 1'dir, 9 değil. Ondalık 0 0000, sonra 1 ekleyip 0001, bir kere daha ekleyin ve 0010. Burada olan, ondalık olmak gibi bir şey. 09 ve bir tane ekleyerek: 9'dan 0'a değiştirirsiniz ve bir sonraki haneyi artırırsınız.

    Yukarıdaki örnekte, sabit sayıda bit içeren bir sayıda her zaman tutabileceğiniz bir maksimum değer olduğunu görebilirsiniz - çünkü tüm bitler 1 olduğunda ve değeri 1 artırmaya çalıştığınızda, tüm bitler 0 olur ve numara. Buna tamsayı taşması denir ve hem kullanıcılar hem de geliştiriciler için pek çok istenmeyen sorunlara neden olur.

     11111111 = 255 + 1 ----------- 100000000 = 0 (burada 9 bit, bu nedenle 1 kırpılır) 
    • 1 bit için en büyük değer 1'dir.,
    • 2 bit - 3,
    • 3 bit - 7,
    • 4 bit - 15

    Mümkün olan en büyük sayı her zaman 2 ^ N-1, N ise bit sayısıdır. Daha önce de söylediğim gibi, bir hafıza adresi bir sayıdır ve ayrıca bir maksimum değere sahiptir. Bu nedenle, makine kelimesinin boyutu aynı zamanda kullanılabilir bellek adreslerinin sayısı için bir sınırdır - bazen CPU'nuz sadece daha fazla belleği ele almak için yeterince büyük sayıları işleyemez..

    Böylece, 32 bit üzerinde 0'dan 2'ye kadar ^ ^ 1 - 1 tutabilirsiniz ve bu 4 294 967 295'tir. 1 GB RAM'deki en büyük adresten daha fazladır, bu nedenle özel durumunuzda RAM sınırlayıcı faktör olacaktır..

    32 bit CPU için RAM sınırı teorik olarak 4 GB'dir (2 ^ 32) ve 64 bit CPU için 16 EB'dir (exabyte, 1 EB = 2 ^ 30 GB). Başka bir deyişle, 64-bit CPU tüm Internet'e… 200 kez hitap edebilir;) (WolframAlpha tarafından tahmin edildi).

    Bununla birlikte, gerçek hayattaki işletim sistemlerinde 32 bit CPU'lar yaklaşık 3 GiB RAM ile ilgilenebilir. Bunun nedeni işletim sisteminin iç mimarisidir - bazı adresler başka amaçlar için ayrılmıştır. Vikipedi'deki bu 3 GB'lik bariyer hakkında daha fazla bilgi edinebilirsiniz. Bu sınırı Fiziksel Adres Uzantısı ile kaldırabilirsiniz..

    Hafıza adresleme hakkında konuşursak, söylemem gereken birkaç şey var: sanal belleksegmantasyon ve sayfalama.

    Sanal bellek

    @Daniel R Hicks başka bir cevabında işaret ettiği gibi, işletim sistemi sanal bellek kullanır. Bunun anlamı, uygulamaların gerçekte gerçek bellek adreslerinde değil, OS tarafından sağlananlar üzerinde çalışmasıdır..

    Bu teknik, işletim sisteminin bazı verileri RAM'den Pagefile (Windows) veya Swap (* NIX) adlı bir dosyaya taşımasını sağlar. HDD, RAM'den daha az büyüklüktedir, ancak nadiren erişilen veriler için ciddi bir sorun değildir ve işletim sisteminin uygulamalara gerçekte yüklediğinizden daha fazla RAM sağlamasını sağlar.

    Çağrı

    Şu ana kadar bahsettiğimiz konuya düz adresleme düzeni deniyor..

    Çağrı, normalde tek bir makine kelimesiyle düz modelde yapabileceğiniz daha fazla hafızayı ele almayı sağlayan alternatif bir adresleme şemasıdır..

    4 harfli kelimelerle dolu bir kitap düşünün. Diyelim ki her sayfada 1024 sayı var. Bir numarayı ele almak için iki şey bilmeniz gerekir:

    • Sözcüğün yazdırıldığı sayfa sayısı.
    • Bu sayfadaki hangi kelime aradığınızı.

    İşte tam olarak modern x86 işlemcilerin belleği işlemesi. 4 KiB sayfaya (her biri 1024 makine kelimesi) ayrılmıştır ve bu sayfaların sayıları vardır. (aslında sayfalar ayrıca 4 MiB büyük veya PAE ile 2 MiB olabilir). Bellek hücresini adreslemek istediğinizde, o sayfadaki sayfa numarasına ve adrese ihtiyacınız vardır. Her bir bellek hücresine, bölümleme için geçerli olmayacak şekilde tam olarak bir çift sayıyla referans verildiğini unutmayın..

    segmantasyon

    Eh, bu bir çağrıya oldukça benzer. Intel 8086'da yalnızca bir örnek vermek için kullanıldı. Adres gruplarına artık sayfalar değil bellek bölümleri deniyor. Aradaki fark, segmentlerin üst üste gelebilecekleri ve çok fazla üst üste geldikleridir. Örneğin 8086'da çoğu bellek hücresi 4096 farklı segmentten edinilebilirdi.

    Bir örnek:

    Diyelim ki 8 bayt hafızamız var, hepsi 255'e eşit olan 4. bayt dışında sıfırlar..

    Düz bellek modeli için örnek:

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

    Sayfalı bellek için örnek 4 bayt sayfalarla:

     SAYFA0 _____ | 0 | | 0 | | 0 | SAYFA1 | 255 | _____ ----- | 0 | | 0 | | 0 | | 0 | ----- 

    Bölümlenmiş hafıza için örnek 4 byte segment 1 ile değiştirilir:

     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 | ----- ----- ----- ----- 

    Gördüğünüz gibi, 4. bayt dört şekilde ele alınabilir: (0'dan adresleme)

    • Bölüm 0, ofset 3
    • Segment 1, ofset 2
    • Segment 2, ofset 1
    • Segment 3, 0 kayması

    Her zaman aynı hafıza hücresi.

    Gerçek hayattaki uygulamalarda segmentler 1 bayttan fazla kaydırılır (8086 için 16 bayt idi).

    Segmentasyonun kötü yanı karmaşık olmasıdır (ama bunu zaten bildiğini düşünüyorum;) İyi olan, modüler programlar oluşturmak için bazı akıllı teknikleri kullanabilmenizdir..

    Örneğin, bazı modülleri bir segmente yükleyebilir, ardından segmentin gerçekten olduğundan daha küçük olduğunu iddia edebilir (modülü tutacak kadar küçüktür), sonra sözde küçük olanla üst üste binmeyen ilk segmenti seçip daha sonra yükleyin modül vb. Temel olarak, bu şekilde elde ettiğiniz şey değişken boyutlu sayfalardır..


    Açıklamaya eklemek için bir şey var mı? Yorumlarda ses kesiliyor. Diğer teknoloji meraklısı Stack Exchange kullanıcılarından daha fazla cevap okumak ister misiniz? Burada tüm tartışma konusuna göz atın.